【DE算法】差分进化算法原理及matlab代码

差分进化算法DE与遗传算法GA非常类似,下面是差分进化算法的步骤。


算法步骤如下:

  1. 初始化

  2. 变异

  3. 交叉

d.选择



测试函数:

Rastrigr函数  

                 

全局最优点: ,       

matlab代码如下:

[plain] view plain copy
  1. function DE(Gm,F0)  
  2.   
  3. t0 = cputime;  
  4. %差分进化算法程序  
  5. %F0是变异率 %Gm 最大迭代次数  
  6. Gm = 10000;  
  7. F0 = 0.5;  
  8. Np = 100;  
  9. CR = 0.9;  %交叉概率  
  10. G= 1; %初始化代数  
  11. D = 10; %所求问题的维数  
  12. Gmin = zeros(1,Gm); %各代的最优值  
  13. best_x = zeros(Gm,D); %各代的最优解  
  14. value = zeros(1,Np);  
  15.   
  16. %产生初始种群  
  17. %xmin = -10; xmax = 100;%带负数的下界  
  18. xmin = -5.12;  
  19. xmax = 5.12;  
  20. function y = f(v)  
  21.     %Rastrigr 函数  
  22. y = sum(v.^2 - 10.*cos(2.*pi.*v) + 10);  
  23. end  
  24.   
  25. X0 = (xmax-xmin)*rand(Np,D) + xmin;  %产生Np个D维向量  
  26. XG = X0;  
  27.   
  28. %%%%%%%%%%%%%----这里未做评价,不判断终止条件----%%%%%%%%%%%%%%%%%%%%%%%%  
  29.   
  30. XG_next_1= zeros(Np,D); %初始化  
  31. XG_next_2 = zeros(Np,D);  
  32. XG_next = zeros(Np,D);  
  33.   
  34. while G <= Gm   
  35. G   
  36. %%%%%%%%%%%%%%%%%%%%%%%%----变异操作----%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
  37.     for i = 1:Np  
  38.         %产生j,k,p三个不同的数  
  39.         a = 1;  
  40.         b = Np;  
  41.         dx = randperm(b-a+1) + a- 1;  
  42.         j = dx(1);  
  43.         k = dx(2);  
  44.         p = dx(3);  
  45.         %要保证与i不同  
  46.         if j == i  
  47.             j  = dx(4);  
  48.             else if k == i  
  49.                  k = dx(4);  
  50.                 else if p == i  
  51.                     p = dx(4);  
  52.                     end  
  53.                 end  
  54.          end  
  55.           
  56.         %变异算子  
  57.         suanzi = exp(1-Gm/(Gm + 1-G));  
  58.         F = F0*2.^suanzi;  
  59.         %变异的个体来自三个随机父代  
  60.          
  61.         son = XG(p,:) + F*(XG(j,:) - XG(k,:));         
  62.         for j = 1: D  
  63.             if son(1,j) >xmin  & son(1,j) < xmax %防止变异超出边界  
  64.                 XG_next_1(i,j) = son(1,j);  
  65.             else  
  66.                 XG_next_1(i,j) = (xmax - xmin)*rand(1) + xmin;  
  67.             end  
  68.         end  
  69.     end  
  70.    %%%%%%%%%%%%%%%%%%%%%%%---交叉操作----%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
  71.       
  72.       
  73.     for i = 1: Np  
  74.         randx = randperm(D);% [1,2,3,...D]的随机序列     
  75.         for j = 1: D  
  76.               
  77.             if rand > CR & randx(1) ~= j % CR = 0.9   
  78.                 XG_next_2(i,j) = XG(i,j);  
  79.             else  
  80.                 XG_next_2(i,j) = XG_next_1(i,j);  
  81.             end  
  82.         end  
  83.     end  
  84.       
  85.     %%%%%%%%%%%%%%%%%%----选择操作---%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
  86.     for i = 1:Np  
  87.         if f(XG_next_2(i,:)) < f(XG(i,:))  
  88.               
  89.             XG_next(i,:) = XG_next_2(i,:);  
  90.         else  
  91.             XG_next(i,:) = XG(i,:);  
  92.         end  
  93.     end  
  94.       
  95.     %找出最小值  
  96.     for i = 1:Np  
  97.         value(i) = f(XG_next(i,:));  
  98.     end  
  99.     [value_min,pos_min] = min(value);  
  100.       
  101.     %第G代中的目标函数的最小值  
  102.     Gmin(G) = value_min;     
  103.     %保存最优的个体  
  104.     best_x(G,:) = XG_next(pos_min,:);     
  105.       
  106.     XG = XG_next;      
  107.     trace(G,1) = G;  
  108.     trace(G,2) = value_min;  
  109.     G = G + 1;  
  110.     
  111. end  
  112.   [value_min,pos_min] = min(Gmin);  
  113.   best_value = value_min  
  114.   best_vector =  best_x(pos_min,:)    
  115.   fprintf('DE所耗的时间为:%f \n',cputime - t0);  
  116.   %画出代数跟最优函数值之间的关系图    
  117.   plot(trace(:,1),trace(:,2));  
  118.     
  119. end  

结果:

以上转载自:https://i-blog.csdnimg.cn/blog_migrate/ab97ca1233c651e59cc510b3c4a0950b.png


DE算法的求解步骤:
(1)基本参数的设置,包括NP, F, CR
(2)初始化种群
(3)计算种群适应度值
(4)终止条件不满足时,进行循环,依次执行变异、交叉、选择运算,直到终止运算。

DE算法的流程图:

以上转载自:http://blog.csdn.net/misayaaaaa/article/details/54407548


  • 39
    点赞
  • 445
    收藏
    觉得还不错? 一键收藏
  • 24
    评论
差分进化算法(Differential Evolution,DE)是一种优化算法,常用于解决连续优化问题。它模拟了生物进化的过程,通过不断迭代来寻找最优解。差分进化算法在AGV车间调度问题中也有应用。 以下是一个使用差分进化算法解决AGV车间调度问题的MATLAB代码示例: ```matlab % AGV车间调度问题的差分进化算法代码示例 % 参数设置 popSize = 50; % 种群大小 maxGen = 100; % 最大迭代次数 F = 0.8; % 缩放因子 CR = 0.9; % 交叉概率 % 初始化种群 pop = randi([1, n], popSize, n); % n为任务数量 % 迭代优化 for gen = 1:maxGen % 计算适应度 fitness = calculateFitness(pop); % 根据具体问题定义适应度函数 % 选择操作 [~, idx] = sort(fitness); bestIndividual = pop(idx(1), :); % 差分进化操作 newPop = zeros(popSize, n); for i = 1:popSize % 随机选择三个个体 r = randperm(popSize, 3); a = pop(r(1), :); b = pop(r(2), :); c = pop(r(3), :); % 变异操作 mutant = a + F * (b - c); % 交叉操作 crossover = zeros(1, n); jrand = randi([1, n]); for j = 1:n if rand() < CR || j == jrand crossover(j) = mutant(j); else crossover(j) = pop(i, j); end end % 选择操作 if calculateFitness(crossover) < fitness(i) newPop(i, :) = crossover; else newPop(i, :) = pop(i, :); end end % 更新种群 pop = newPop; end % 输出最优解 bestFitness = calculateFitness(bestIndividual); disp(['最优解:', num2str(bestIndividual)]); disp(['最优适应度:', num2str(bestFitness)]); % 计算适应度函数的具体实现 function fitness = calculateFitness(individual) % 根据具体问题定义适应度函数的计算方法 % 这里假设适应度函数为任务完成时间的总和,需要根据实际情况进行修改 fitness = sum(individual); end ``` 这段代码使用差分进化算法来解决AGV车间调度问题。其中,种群大小、迭代次数、缩放因子和交叉概率等参数可以根据实际情况进行调整。适应度函数需要根据具体问题进行定义和计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值