peterjesam 发表于 2023-3-21 15:48

各种智能优化算法比较与实现(matlab版)

目录
一、方法介绍
1免疫算法
1.1算法基本思想
1.2算法操作步骤
1.3代码实现
2蚁群优化算法
2.1算法基本思想
2.2基本蚁群算法操作步骤
2.3代码实现
3粒子群算法
3.1算法基本思想
3.2算法基本操作步骤
3.3代码实现
二、基准测试函数
2.1使用免疫算法求解函数极值
2.2使用蚁群算法求解函数极值
2.3使用粒子群算法求解函数极值
2.4蚁群算法和免疫算法比较
2.5蚁群算法和粒子群算法比较
2.6粒子群算法和免疫算法比较
2.7蚁群算法、免疫算法、粒子群算法比较
三、结论
一、 方法介绍
1免疫算法(Immune Algorithm,IA)
1.1算法基本思想
免疫算法是受生物免疫系统的启发而推出的一种新型的智能搜索算法。它是一种确定性和随机性选择相结合并具有“勘探”与“开采”能力的启发式随机搜索算法。免疫算法将优化问题中待优化的问题对应免疫应答中的抗原,可行解对应抗体(B细胞),可行解质量对应免疫细胞与抗原的亲和度。如此则可以将优化问题的寻优过程与生物免疫系统识别抗原并实现抗体进化的过程对应起来,将生物免疫应答中的进化过程抽象成数学上的进化寻优过程,形成一种智能优化算法。它具有一般免疫系统的特征,采用群体搜索策略,通过迭代计算,最终以较大的概率得到问题的最优解。相对于其他算法,免疫算法利用自身产生多样性和维持机制的特点,保证了种群的多样性,克服了一般寻优过程(特别是多峰值的寻优过程)的不可避免的“早熟”问题,可以求得全局最优解。免疫算法具有自适应性、随机性、并行性、全局收敛性、种群多样性等优点。
1.2 算法操作步骤
(1)首先进行抗原识别,即理解待优化的问题,对问题进行可行性分析,提取先验知识,构造出合适的亲和度函数,并制定各种约束条件。
(2)然后初始化抗体群,通过编码把问题的可行解表示成解空间中的抗体,在解的空间内随机产生一个初始种群。
(3)对种群中的每一个可行解进行亲和度评价。(记忆单元的更新:将与抗原亲和性高的抗体加入到记忆单元,并用新加入的抗体取代与其亲和性最高的原有抗体(抗体和抗体的亲和性计算))
(4)判断是否满足算法终止条件;如果满足条件则终止算法寻优过程,输出计算结果;否则继续寻优运算。
(5)计算抗体浓度和激励度。(促进和抑制抗体的产生:计算每个抗体的期望值,抑制期望值低于阈值的抗体;可以知道与抗原间具有的亲和力越高,该抗体的克隆数目越高,其变异率也越低)
(6)进行免疫处理,包括免疫选择、克隆、变异和克隆抑制。
免疫选择:根据种群中抗体的亲和度和浓度计算结果选择优质抗体,使其活化;
克隆:对活化的抗体进行克隆复制,得到若干副本;
变异:对克隆得到的副本进行变异操作,使其发生亲和度突变;
克隆抑制:对变异结果进行再选择,抑制亲和度低的抗体,保留亲和度高的变异结果。
(7)种群刷新,以随机生成的新抗体替代种群中激励度较低的抗体,形成新一代抗体,转步骤
(3)。
免疫算法运算流程图


1.3 代码实现
1   %%%%%%%%%%%%%%%%%免疫算法求函数极            值%%%%%%%%%%%%%%%%%%%%
2   %%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%
3   clear all;                              %清除所有变量
4   close all;                              %清图
5   clc;                                    %清屏
6   D=10;                                     %免疫个体维数
7   NP=100;                                 %免疫个体数目
8   Xs=20;                                    %取值上限
9   Xx=-20;                                 %取值下限
10G=500;                                    %最大免疫代数
11pm=0.7;                                 %变异概率
12alfa=1;                                 %激励度系数
13belta=1;                                  %激励度系数   
14detas=0.2;                              %相似度阈值
15gen=0;                                    %免疫代数
16Ncl=10;                                 %克隆个数
17deta0=1*Xs;                               %邻域范围初值
18%%%%%%%%%%%%%%%%%%%%%%%初始种群%%%%%%%%%%%%%%%%%%%%%%%%
19f=rand(D,NP)*(Xs-Xx)+Xx;
20for np=1:NP
21      MSLL(np)=func1(f(:,np));
22end
23%%%%%%%%%%%%%%%%%计算个体浓度和激励度%%%%%%%%%%%%%%%%%%%
24for np=1:NP
25      for j=1:NP   
26          nd(j)=sum(sqrt((f(:,np)-f(:,j)).^2));
27          if nd(j)<detas
28             nd(j)=1;
29          else
30            nd(j)=0;
31          end
32      end
33      ND(np)=sum(nd)/NP;
34end
35MSLL =alfa*MSLL- belta*ND;
36%%%%%%%%%%%%%%%%%%%激励度按升序排列%%%%%%%%%%%%%%%%%%%%%%
37=sort(MSLL);
38Sortf=f(:,Index);
39%%%%%%%%%%%%%%%%%%%%%%%%免疫循环%%%%%%%%%%%%%%%%%%%%%%%%
40while gen<G
41      for i=1:NP/2
42          %%%%%%%%选激励度前NP/2个体进行免疫操作%%%%%%%%%%%
43         a=Sortf(:,i);
44          Na=repmat(a,1,Ncl);
45          deta=deta0/(gen+0.0001);
46          for j=1:Ncl
47            for ii=1:D
48                  %%%%%%%%%%%%%%%%%变异%%%%%%%%%%%%%%%%%%%
49                  if rand<pm
50                      Na(ii,j)=Na(ii,j)+(rand-0.5)*deta;
51                  end
52                  %%%%%%%%%%%%%%边界条件处理%%%%%%%%%%%%%%%
53                  if (Na(ii,j)>Xs)|(Na(ii,j)<Xx)
54                      Na(ii,j)=rand * (Xs-Xx)+Xx;
55                  end
56            end
57          end
58          Na(:,1)=Sortf(:,i);               %保留克隆源个体
59          %%%%%%%%%%克隆抑制,保留亲和度最高的个体%%%%%%%%%%
60          for j=1:Ncl
61            NaMSLL(j)=func1(Na(:,j));
62          end
63          =sort(NaMSLL);
64          aMSLL(i)=NaSortMSLL(1);
65          NaSortf=Na(:,Index);
66      af(:,i)=NaSortf(:,1);
67      end
68      %%%%%%%%%%%%%%%%%%%%免疫种群激励度%%%%%%%%%%%%%%%%%%%
69      for np=1:NP/2
70      for j=1:NP/2
71            nda(j)=sum(sqrt((af(:,np)-af(:,j)).^2));         
72            if nda(j)<detas
73                  nda(j)=1;
74            else
75                  nda(j)=0;
76            end
77          end
78          aND(np)=sum(nda)/NP/2;
79      end
80      aMSLL =alfa*aMSLL-belta*aND;
81      %%%%%%%%%%%%%%%%%%%%%%%种群刷新%%%%%%%%%%%%%%%%%%%%%%%
82      bf=rand(D,NP/2)*(Xs-Xx)+Xx;
83      for np=1:NP/2
84          bMSLL(np)=func1(bf(:,np));
85      end
86      %%%%%%%%%%%%%%%%%%%新生成种群激励度%%%%%%%%%%%%%%%%%%%%
87      for np=1:NP/2
88          for j=1:NP/2
89            ndc(j)=sum(sqrt((bf(:,np)-bf(:,j)).^2));
90            if ndc(j)<detas
91                  ndc(j)=1;
92            else
93                  ndc(j)=0;
94            end
95          end
96          bND(np)=sum(ndc)/NP/2;
97      end
98      bMSLL =alfa*bMSLL-belta*bND;
99      %%%%%%%%%%%%%%免疫种群与新生种群合并%%%%%%%%%%%%%%%%%%%
100      f1=;
101      MSLL1=;
102      =sort(MSLL1);
103      Sortf=f1(:,Index);
104      gen=gen+1;
105      trace(gen)=func1(Sortf(:,1));
106end
107%%%%%%%%%%%%%%%%%%%%%%%输出优化结果%%%%%%%%%%%%%%%%%%%%%%%%
108Bestf=Sortf(:,1);               %最优变量
109trace(end);                     %最优值
110figure,plot(trace)
111xlabel('迭代次数')
112ylabel('目标函数值')
113title('亲和度进化曲线')

1   %%%%%%%%%%%%%%%%%%%%%%%%%亲和度函数%%%%%%%%%%%%%%%%%%%%%%
2   function result=func1(x)
3   summ=sum(x.^2);
4   result=summ;
5   
结果为


2蚁群优化算法(Ant Colony Optimization,ACO)
2.1算法基本思想
蚁群算法是一种源于大自然生物世界的新的仿生进化算法,通过模拟自然界中蚂蚁集体寻径行为而提出的一种基于种群的启发式搜索算法。蚂蚁在运动过程中,能够在它所经过的路径上留下信息素进行信息传递,而且蚂蚁在运动过程中能够感知这种物质,并以此来指导自己的运动方向。初始阶段,环境中没有信息素的遗留,蚂蚁寻找事物完全是随机选择路径,随后寻找该事物源的过程中就会受到先前蚂蚁所残留的信息素的影响,其表现为蚂蚁在选择路径时趋向于选择信息素浓度高的路径。同时,信息素是一种挥发性化学物,会随着时间的推移而慢慢地消逝。如果每只蚂蚁在单位距离留下的信息素相同,那对于较短路径上残留的信息素就相对较高,这被后来的蚂蚁选择的概率就将大,从而导致这条短路径上走的蚂蚁就越多。而经过的蚂蚁越多,该路径上残留的信息素就将更多,这样使得整个蚂蚁的集体行为构成了信息素的正反馈过程,最终整个蚁群会找出最优路径。
2.2 基本蚁群算法操作步骤
(1)初始化参数:开始时每条边的信息素量都相等
(2)将各蚂蚁放置各顶点,禁忌表为对应的顶点。
(3)蚂蚁个体根据状态转移概率计算转移概率选择下一个顶点,更新禁忌表,再计算概率,再选择顶点,再更新禁忌表,直至遍历所有顶点1次。
(4)计算该只蚂蚁留在各边的信息素量,该蚂蚁死去。
(5)重复(3)~(4),直至所有蚂蚁都周游完毕。
(6)计算各边的信息素增量和信息素量。
(7)记录本次迭代的路径,更新当前的最优路径,清空禁忌表。
(8)判断是否达到预定的迭代步数,或者是否出现停滞现象。若是,算法结束,输出当前最优路径;否则,转(2),进行下一次迭代。
2.3 代码实现
这里用蚁群算法解决旅行商问题
1   %%%%%%%%%%%%%%%%%%%%蚁群算法解决TSP问题%%%%%%%%%%%%%%%%%%%%%%%%%%
2...%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3   clear all;                %清除所有变量
4   close all;                %清图
5    clc;                      %清屏
6   m=50;                     %蚂蚁个数
7   Alpha=1;                  %信息素重要程度参数            
8   Beta=5;                   %启发式因子重要程度参数
9   Rho=0.1;                  %信息素蒸发系数
10G_max=200;                %最大迭代次数
11Q=100;                  %信息素增加强度系数
12C=[6734        1453
132233        10
145530        1424
15   401        841
163082        1644
177608        4458
187573        3716
197265        1268
206898        1885
211112        2049
225468        2606
235989        2873
244706        2674
254612        2035
266347        2683
276107        669
287611        5184
297462        3590
307732        4723
315900        3561
324483        3369
336101        1110
345199        2182
351633        2809
364307        2322
37675        1006
387555        4819
397541        3981
403177        756
417352        4506
427545        2801
433245        3305

446426        3173
454608        1198
4623        2216
477248        3779
487762        4595
497392        2244
503484        2829
516271        2135
524985        140
531916        1569
547280        4899
557509        3239
5610        2676
576807        2993
585185        3258
593023        1942];                %31个省会城市坐标
60%%%%%%%%%%%%%%%%%%%%%%%%第一步:变量初始化%%%%%%%%%%%%%%%%%%%%%%%%
61n=size(C,1);            %n表示问题的规模(城市个数)
62D=zeros(n,n);             %D表示两个城市距离间隔矩阵
63for i=1:n
64      for j=1:n
65          if i~=j
66            D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5;
67          else
68            D(i,j)=eps;
69          end
70          D(j,i)=D(i,j);
71      end
72end
73Eta=1./D;                  %Eta为启发因子,这里设为距离的倒数
74Tau=ones(n,n);               %Tau为信息素矩阵
75Tabu=zeros(m,n);             %存储并记录路径的生成
76NC=1;                        %迭代计数器
77R_best=zeros(G_max,n);       %各代最佳路线
78L_best=inf.*ones(G_max,1);   %各代最佳路线的长度
79figure(1);%优化解
80while NC<=G_max            
81      %%%%%%%%%%%%%%%%%%第二步:将m只蚂蚁放到n个城市上%%%%%%%%%%%%%%%%
82      Randpos=[];
83      for i=1:(ceil(m/n))
84          Randpos=;
85    end
86      Tabu(:,1)=(Randpos(1,1:m))';
87      %%%%%第三步:m只蚂蚁按概率函数选择下一座城市,完成各自的周游%%%%%%
88      for j=2:n
89          for i=1:m
90            visited=Tabu(i,1:(j-1));%已访问的城市
91            J=zeros(1,(n-j+1));       %待访问的城市
92            P=J;                      %待访问城市的选择概率分布
93            Jc=1;
94            for k=1:n
95                   if length(find(visited==k))==0
96                   J(Jc)=k;
97                      Jc=Jc+1;
98                  end
99            end
100            %%%%%%%%%%%%%%%%%%计算待选城市的概率分布%%%%%%%%%%%%%%%%
101            for k=1:length(J)
102                  P(k)=(Tau(visited(end),J(k))^Alpha)...
103                      *(Eta(visited(end),J(k))^Beta);
104            end
105            P=P/(sum(P));
106            %%%%%%%%%%%%%%%%按概率原则选取下一个城市%%%%%%%%%%%%%%%%
107            Pcum=cumsum(P);
108            Select=find(Pcum>=rand);
109            to_visit=J(Select(1));
110            Tabu(i,j)=to_visit;
111         end
112      end
113      if NC>=2
114          Tabu(1,:)=R_best(NC-1,:);
115      end
116      %%%%%%%%%%%%%%%%%%%第四步:记录本次迭代最佳路线%%%%%%%%%%%%%%%%%%
117      L=zeros(m,1);
118      for i=1:m
119          R=Tabu(i,:);
120          for j=1:(n-1)
121            L(i)=L(i)+D(R(j),R(j+1));
122          end
123          L(i)=L(i)+D(R(1),R(n));
124      end
125      L_best(NC)=min(L);
126   pos=find(L==L_best(NC));
127      R_best(NC,:)=Tabu(pos(1),:);
128      %%%%%%%%%%%%%%%%%%%%%%%%%第五步:更新信息素%%%%%%%%%%%%%%%%%%%%%%
129      Delta_Tau=zeros(n,n);
130      for i=1:m
131          for j=1:(n-1)
132            Delta_Tau(Tabu(i,j),Tabu(i,j+1))=...
133                  Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);
134          end
135          Delta_Tau(Tabu(i,n),Tabu(i,1))=...
136            Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i);
137      end
138      Tau=(1-Rho).*Tau+Delta_Tau;
139      %%%%%%%%%%%%%%%%%%%%%%%第六步:禁忌表清零%%%%%%%%%%%%%%%%%%%%%%
140      Tabu=zeros(m,n);
141      %%%%%%%%%%%%%%%%%%%%%%%%%历代最优路线%%%%%%%%%%%%%%%%%%%%%%%%%%
142      for i=1:n-1
143          plot([ C(R_best(NC,i),1), C(R_best(NC,i+1),1)],...
144            ,'bo-');
145          hold on;
146      end
147      plot(,...
148          ,'ro-');
149      title(['优化最短距离:',num2str(L_best(NC))]);
150      hold off;
151      pause(0.005);
152      NC=NC+1;   
153end
154%%%%%%%%%%%%%%%%%%%%%%%%%%第七步:输出结果%%%%%%%%%%%%%%%%%%%%%%%%%%
155Pos=find(L_best==min(L_best));
156Shortest_Route=R_best(Pos(1),:);            %最佳路线
157Shortest_Length=L_best(Pos(1));             %最佳路线长度
158figure(2),
159plot(L_best)
160xlabel('迭代次数')
161ylabel('目标函数值')
162title('适应度进化曲线')
结果显示




3粒子群算法(Particle Swarm Optimization,PSO)
3.1算法基本思想
粒子群算法(Particle Swarm Optimization,PSO)最早是由Eberhart和Kennedy于1995年提出,它的基本概念源于对鸟群觅食行为的研究。设想这样一个场景:一群鸟在区域中随机搜寻食物,在这个区域里只有一块食物,所有的鸟知道自己当前位置离食物多远,那么搜索的最简单有效的策略就是搜索目前离食物最近的鸟的周围区域。粒子群算法利用这种模型得到启示并应用于解决优化问题。在粒子群算法中,-用一种粒子来模拟上述的鸟类个体,每个粒子可视为N维搜索空间中的一个搜索个体,粒子的当前位置即为对应优化问题的一个候选解,粒子的飞行过程即为该个体的搜索过程.粒子的飞行速度可根据粒子历史最优位置和种群历史最优位置进行动态调整.粒子仅具有两个属性:速度和位置,速度代表移动的快慢,位置代表移动的方向。每个粒子单独搜寻的最优解叫做个体极值,粒子群中最优的个体极值作为当前全局最优解。不断迭代,更新速度和位置。最终得到满足终止条件的最优解。
3.2算法基本操作步骤
(1)初始化粒子群,包括群体规模N,每个粒子的位置xi和速度vi。
(2)计算每个粒子的适应度fit。
(3)对每个粒子,用它的适应度值fit和个体极值pbest(i)比较。如果fit小于pbest(i),则用fit替换掉pbest(i)。
(4)对每个粒子,用它的适应度值fit和全局极值gbest(i)比较。如果fit小于gbest(i),则用fit替换掉gbest(i)。
(5)迭代更新粒子的位置xi和速度vi。
(6)进行边界条件处理
(7)判断算法终止条件是否满足:若是,则结束算法并输出优化结果;否则返回(2)
粒子群算法运算流程图


3.3 代码实现
1%%%%%%%%%%%%%%%%%粒子群算法求函数极值%%%%%%%%%%%%%%%%%%%%%%%%%%
2%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3clear all;            %清除所有变量
4close all;            %清图
5clc;                  %清屏
6N=100;                  %群体粒子个数
7D=10;                   %粒子维数
8T=200;                  %最大迭代次数
9c1=1.5;               %学习因子1
10c2=1.5;               %学习因子2
11w=0.8;                  %惯性权重
12Xmax=20;                %位置最大值
13Xmin=-20;               %位置最小值
14Vmax=10;                %速度最大值
15Vmin=-10;               %速度最小值
16%%%%%%%%%%%%%%%%初始化种群个体(限定位置和速度)%%%%%%%%%%%%%%%%
17x=rand(N,D) * (Xmax-Xmin)+Xmin;
18v=rand(N,D) * (Vmax-Vmin)+Vmin;
19%%%%%%%%%%%%%%%%%%初始化个体最优位置和最优值%%%%%%%%%%%%%%%%%%%
20p=x;
21pbest=ones(N,1);
22for i=1:N
23      pbest(i)=func1(x(i,:));
24end
25%%%%%%%%%%%%%%%%%%%初始化全局最优位置和最优值%%%%%%%%%%%%%%%%%%
26g=ones(1,D);
27gbest=inf;
28for i=1:N
29      if(pbest(i)<gbest)
30          g=p(i,:);
31          gbest=pbest(i);
32      end
33end
34gb=ones(1,T);
35%%%%%%%%%%%按照公式依次迭代直到满足精度或者迭代次数%%%%%%%%%%%%%
36for i=1:T
37      for j=1:N
38          %%%%%%%%%%%%%%更新个体最优位置和最优值%%%%%%%%%%%%%%%%%
39          if (func1(x(j,:))<pbest(j))
40            p(j,:)=x(j,:);
41            pbest(j)=func1(x(j,:));
42          end
43          %%%%%%%%%%%%%%%%更新全局最优位置和最优值%%%%%%%%%%%%%%%
44          if(pbest(j)<gbest)
45            g=p(j,:);
46            gbest=pbest(j);
47          end
48          %%%%%%%%%%%%%%%%%跟新位置和速度值%%%%%%%%%%%%%%%%%%%%%
49          v(j,:)=w*v(j,:)+c1*rand*(p(j,:)-x(j,:))...
50            +c2*rand*(g-x(j,:));
51          x(j,:)=x(j,:)+v(j,:);
52          %%%%%%%%%%%%%%%%%%%%边界条件处理%%%%%%%%%%%%%%%%%%%%%%
53          for ii=1:D
54            if (v(j,ii)>Vmax)|(v(j,ii)< Vmin)
55                  v(j,ii)=rand * (Vmax-Vmin)+Vmin;
56            end
57            if (x(j,ii)>Xmax)|(x(j,ii)< Xmin)
58                  x(j,ii)=rand * (Xmax-Xmin)+Xmin;
59            end
60          end
61      end
62      %%%%%%%%%%%%%%%%%%%%记录历代全局最优值%%%%%%%%%%%%%%%%%%%%%
63      gb(i)=gbest;
64end
65g;                         %最优个体         
66gb(end);                   %最优值
67figure
68plot(gb)
69xlabel('迭代次数');
70ylabel('适应度值');
71title('适应度进化曲线')
72
73

1   %%%%%%%%%%%%%%%%%%%适应度函数%%%%%%%%%%%%%%%%%%%%
2   function result=func1(x)
3   summ=sum(x.^2);
4   result=summ;
5
二、基准测试函数
本次实验选取下面的5个测试函数,分别用以上智能算法进行结果分析比较。首先使用蚁群算法、免疫算法和粒子群算法以第一个基准函数为例,画出适应度图像并据此分析每个函数的特点。本文用到的环境是Windows10系统,软件是MATLAB R2017a.
(1)函数f1(x,y)=3cos(xy)+x+y2的最小值,其中x的取值范围为[-4,4],y的取值范围为[-4,-4]。这是一个有多个局部极值的函数,其函数图像如图所示:


(2)函数f2(x,y)=5sin(xy)+x2+y2的最小值,其中x的取值范围为[-4,4],y的取值范围为[-4,-4]。这是一个有多个局部极值的函数,其函数图像如图所示:


(3)函数f3(x,y)=6sin(4x)+9cos(5y)+y2的最小值,其中x的取值范围为[-4,4],y的取值范围为[-4,-4]。这是一个有多个局部极值的函数,其函数图像如图所示:


(4)函数f4(x,y)=3cos6y+x2+y2的最小值,其中x的取值范围为[-4,4],y的取值范围为[-4,-4]。其函数图像如图所示:


(5)函数f5(x,y)=sin(x2+y)+cos(5x)+x+y的最小值,其中x的取值范围为[-4,4],y的取值范围为[-4,-4]。这是一个有多个局部极值的函数,其函数图像如图所示:


2.1使用免疫算法求解函数极值
仿真过程如下设置:
第一步:初始化免疫个体维数为D=2,免疫种群个体数为NP=50,最大免疫代数为G=200,变异概率为Pm=0.7,激励度系数为alfa=2,belta=1,相似度阈值为detas=0.2,克隆个数为Nc1=5;
第二步:随机产生初始种群,计算个体亲和度、抗体浓度和激励度,并按激励度排序。
第三步:取激励度前NP/2个个体进行克隆、变异、克隆抑制的免疫操作;免疫后的种群进行激励度计算。
第四步:随机生成NP/2个个体的新种群,并计算个体亲和度、抗体浓度和激励度;免疫种群和随机种群合并,并按激励度排序,进行免疫迭代。
第五步:判断是否满足终止条件:若满足,则结束搜索过程,输出优化值;若不满足,则继续进行迭代优化。
优化结束后,其适应度进化曲线如下图2.1所示。


图2.1免疫算法适应度
分析:
优化后的结果为:在免疫代数为200,即x=-4,y=0.7539时,函数取得最小值-6.4078.免疫算法不强调算法参数设置和初始解的质量,利用其启发式的智能搜索机制,即使起步于劣质解种群,最终也可以搜索到问题的全局最优解,对问题和初始解的依赖性不强,具有很强的适应性和鲁棒性。故在上图,种群20代以后基本处于最优解。
2.2使用蚁群算法求解函数极值
仿真过程如下设置:
第一步:初始化蚂蚁个数m=20,最大迭代次数G=200,信息素蒸发系数Rh0=0.9,转移概率常数P0=0.2,局部搜索步长step=0.1
第二步:随机产生蚂蚁初始位置,计算适应度函数值,设为初始信息素,计算状态转移概率。
第三步:进行位置更新:当状态转移概率小于转移概率常数时,进行局部搜索;当状态转移概率大于转移概率常数时,进行全局搜索,产生新的蚂蚁位置,并用边界吸收方式进行 边界条件处理,将蚂蚁位置界定在取值范围内。
第四步:计算新的蚂蚁位置的适应度值,判断蚂蚁是否移动,更新信息素。
第五步:判断是否满足终止条件:若满足,则结束搜索过程,输出优化值;若不满足,则继续进行迭代优化。
优化结束后,其适应度进化曲线如下图2.2所示。


图2.2 蚁群算法适应度
分析:
优化后的结果为:在200轮迭代,即x=-4,y=-0.7539时,函数取得最小值-6.4079.蚁群算法一般需要较长的搜索时间和容易出现停滞现象等不足,故在上图中,容易看到,在100代后,才基本找到最优解。
2.3使用粒子群算法求解函数极值
仿真过程如下设置:
第一步:初始化群体例子个数为N=100,粒子维数为D=2,最大迭代次数为T=200,学习因子c1=c2=1.5,惯性权重最大值为Wmax=0.8,惯性权重最小值为Wmin=0.4,位置最大值为Xmax=4,位置最小值为Xmin=-4,速度最大值为Vmax=1,速度最小值为Vmin=-1.
第二步:初始化种群粒子位置x和速度v,粒子个体最优位置p和最优值pbest,
粒子群全局最优位置g和最优值gbest。
第三步:计算动态惯性权重值w,更新位置x和速度值v,并进行边界条件处理,判断是否替换粒子个体最优位置p和最优值pbest,以及粒子群全局最优位置g和最优值gbest。
第四步:判断是否满足终止条件:若满足,则结束搜索过程,输出优化值;若不满足,则继续进行迭代优化。
优化结束后,其适应度进化曲线如下图2.3所示。


图2.3 粒子群适应度
分析:
优化后的结果为:在200轮迭代,即x=-4,y=-0.7588时,函数取得最小值-6.4072。粒子群算法本质是一种随机搜索算法,它是一种新型的智能优化技术。该算法能以较大概率收敛于全局最优解。如上图所示,算法在40次迭代,基本找到全局最优解。实践证明,粒子群算法适合在动态、多目标优化环境中寻优,与传统优化算法相比,具有较快的计算速度和更好地全局搜索能力。所以,与其他算法相比,粒子群算法是一种高效的并行搜索算法。
2.4 蚁群算法和免疫算法比较
蚁群算法和免疫算法分别在5个基准函数上进行实验,同时在每个基准函数实验20次,并求出20次实验蚁群算法和免疫算法求得全局最优解的平均迭代次数及其标准差。平均迭代次数来反映算法的性能,标准差来反映算法的稳定性。如下表2-1
表2-1


分析:
由表2-1所示,免疫算法在平均10次迭代,基本找到全局最优解,而蚁群算法最好的是在平均29次迭代,才基本找到全局最优解。从这个例子上看,免疫算法在效率上是蚁群算法的3倍左右。从标准差上看,免疫算法更稳定。免疫算法和蚁群算法这两种算法,对问题和初始解的依赖性不强,具有很强的适应性和鲁棒性。免疫算法不需要集中控制,可实现并行处理。而且免疫算法的优化进程是一种多进程的并行优化,在探求问题最优解的同时可以得到问题的多个次优解,即除找到问题的最佳方案外,还会得到若干个较好的备选方案,尤其适合于多模态的优化问题。蚁群算法的参数较少,设置简单,因而该算法易于应用到组合优化问题的求解。
2.5 蚁群算法和粒子群算法比较
蚁群算法和粒子群算法分别在5个基准函数上进行实验,同时在每个基准函数实验20次,并求出20次实验蚁群算法和免疫算法求得全局最优解的平均迭代次数及其标准差。平均迭代次数来反映算法的性能,标准差来反映算法的稳定性。如下表2-2
表2-2


分析:
由表2-2所示,蚁群算法最差结果在平均101次迭代,找到全局最优解,而粒子群算法最差结果在22次迭代左右,就找到了全局最优解。从这个例子上看,粒子群算法效率是蚁群算法的5倍左右。从标准差上来比较,粒子群算法算法更稳定。蚁群算法的参数较少,设置简单,因而该算法易于应用到组合优化问题的求解。粒子群算法是基于群智能理论的优化算法,通过群体中粒子间的合作与竞争产生的群体智能指导优化算法。与其他算法相比,粒子群算法是一种高效的并行搜索算法。实践证明,它适合在动态、多目标优化环境中寻优,与传统优化算法相比,具有较快的计算速度和更好地全局搜索能力。
2.6 粒子群算法和免疫算法比较
粒子群算法和免疫算法分别在5个基准函数上进行实验,同时在每个基准函数实验20次,并求出20次实验蚁群算法和免疫算法求得全局最优解的平均迭代次数及其标准差。平均迭代次数来反映算法的性能,标准差来反映算法的稳定性。如下表2-3


分析:
由表2-3所示,免疫算法最好的结果是在平均8次迭代,基本找到全局最优解,粒子群算法则最好的结果是在平均6次迭代左右,更快地找到全局最优解。从这点看,粒子群算法略微快些,即使从最坏结果看,免疫算法最坏平均在14次,而粒子群算法,则是11次,这点看,依然是粒子群算法更好点。在从标准差方面看,免疫算法和粒子群算法算法稳定性一样。从这个例子上看,粒子群算法在效率上和免疫算法的几乎相同。整体上来看的话,与免疫算法相比,粒子群算法具有较快的计算速度和更好地全局搜索能力,是一种高效的并行搜索算法。
2.7蚁群算法、免疫算法、粒子群算法比较
蚁群算法、粒子群算法和免疫算法分别在5个基准函数上进行实验,同时在每个基准函数实验20次,并求出20次实验蚁群算法和免疫算法求得全局最优解的平均迭代次数及其标准差。平均迭代次数来反映算法的性能,标准差来反映算法的稳定性。如下表2-4


分析:
由表2-4所示,免疫算法和粒子群算法平均在10次迭代左右,基本找到了全局最优解,蚁群算法则最好结果在平均29次迭代,才基本找到全局最优解,从这点看,免疫算法和粒子群算法在效率上是蚁群算法的3倍左右,而免疫算法和粒子群算法在效率上几乎持平。
三 结论
免疫算法和蚁群算法不强调算法参数设置和初始解的质量,利用其启发式的智能搜索机制,即使起步于劣质解种群,最终也可以搜索到问题的全局最优解,对问题和初始解的依赖性不强,具有很强的适应性和鲁棒性。免疫算法不需要集中控制,可实现并行处理。而且免疫算法的优化进程是一种多进程的并行优化,在探求问题最优解的同时可以得到问题的多个次优解,即除找到问题的最佳方案外,还会得到若干个较好的备选方案,尤其适合于多模态的优化问题。蚁群算法的参数较少,设置简单,因而该算法易于应用到组合优化问题的求解。粒子群算法是基于群智能理论的优化算法,通过群体中粒子间的合作与竞争产生的群体智能指导优化算法。与其他算法相比,粒子群算法是一种高效的并行搜索算法。实践证明,它适合在动态、多目标优化环境中寻优,与传统优化算法相比,具有较快的计算速度和更好地全局搜索能力。
(文章来源:CSDN-像风一样自由2020)
大家在备战数学建模竞赛的同时,还可以参加获奖率高、含金量高、赛题容易的2023第八届数维杯挑战赛,赛事更是数模竞赛巨头之一!
2023第八届数维杯大学生数学建模挑战赛报名官网:
页: [1]
查看完整版本: 各种智能优化算法比较与实现(matlab版)