例 2 求函数
的最小值,其中 x的取值范围为 [–5,5],y的取值范围为 [–5,5]。这是一个有多个局部极值的函数,其函数值图形如下图所示。
解:仿真过程如下:
(1)初始化蚂蚁个数 m = 20,最大迭代次数 G = 500,信息素蒸发系数 Rho = 0.9,转移概率常数 P0 = 0.2,局部搜索补偿 step = 0.1。
(2)随机产生蚂蚁初始位置,计算适应度函数值,设为初始信息素,计算状态转移概率。
(3)进行位置更新:当状态转移概率小于转移概率常数时,进行局部搜索;当状态转移概率大于转移概率常数时,进行全局搜索,产生新的蚂蚁位置,并利用边界吸收方式进行边界条件处理,将蚂蚁位置界定在取值范围内。
(4)计算新的蚂蚁位置的适应度值,判断蚂蚁是否移动,更新信息素。
(5)判断是否满足终止条件:若满足,则结束搜索过程,输出优化值;若不满足,则继续进行迭代优化。
- %%
- clear all;
- close all;
- clc;
- m=20;
- G=200;
- Rho=0.9;
- P0=0.2;
- XMAX=5;
- XMIN=-5;
- YMAX=5;
- YMIN=-5;
- %%%%%设置蚂蚁初始位置
- for i=1:m
- X(i,1)=XMIN+(XMAX-XMIN)*rand;
- X(i,2)=YMIN+(YMAX-YMIN)*rand;
- Tau(i)=func(X(i,1),X(i,2));
- end
- step=0.1;
- for NC=1:G
- lamda=1/NC;%用于局部搜索
- [Tau_best,BestIndex]=min(Tau);
-
- %%%计算状态转移概率
- for i=1:m
- P(NC,i)=(Tau(BestIndex)-Tau(i))/Tau(BestIndex);%用best-so-far解约束蚂蚁移动
- end
- %%%位置更新
- for i=1:m
- %%%%%局部搜索___根据步长和lamda转移
- if P(NC,i)
- temp1=X(i,1)+(2*rand-1)*step*lamda;
- temp2=X(i,2)+(2*rand-1)*step*lamda;
- else
- %%%全局搜索__随机一个偏移量
- temp1=X(i,1)+(XMAX-XMIN)*(rand-0.5);
- temp2=X(i,2)+(YMAX-YMIN)*(rand-0.5);
- end
- %%%边界处理
- if temp1
- temp1=XMIN;
- end
- if temp1>XMAX
- temp1=XMAX;
- end
- if temp2
- temp2=YMIN;
- end
- if temp2>YMAX
- temp2=YMAX;
- end
- %%%%%%%判断蚂蚁是否移动
- if func(temp1,temp2)
1),X(i,2)) - X(i,1)=temp1;
- X(i,2)=temp2;
- end
- end
- %%%%%%%%%%%%更新信息素
- for i=1:m
- Tau(i)=(1-Rho)*Tau(i)+func(X(i,1),X(i,2));
- end
- [value,index]=min(Tau);%Tau最小就是最优解????/
- trace(NC)=func(X(index,1),X(index,2));
- end
- [min_value,min_index]=min(Tau);
- minX=X(min_index,1)
- minY=X(min_index,2)
- minCalue=func(minX,minY);
- figure
- plot(trace)
- xlabel('搜索次数');
- ylabel('适应度值');
- title('适应度进化曲线')
- %%%%自适应度函数
- function value=func(x,y)
- value=20*(x^2-y^2)^2-(1-y)^2-3*(1+y)^2+0.3;
- end