遗传算法作业.docx
《遗传算法作业.docx》由会员分享,可在线阅读,更多相关《遗传算法作业.docx(15页珍藏版)》请在冰豆网上搜索。
遗传算法作业
遗传、蚁群算法作业
1、利用遗传算法求出下面函数的极小值:
z=2-exp[-(x2+y2)],x,y[-5,+5]
解:
第一步确定决策变量及其约束条件:
x,y[-5,+5]
第二步建立优化模型:
minz(x,y)=2-exp[-(x2+y2)]
第三步确定编码方法。
用长度为50位的二进制编码串来表示决策变量x,y。
第四步确定解码方法。
解码时将50位长的二进制编码前25位转换为对应的十
进制整数代码,记为x,后25位转换后记为y。
第五步确定个体评价方法。
第六步设计遗传算子。
选择运算用比例选择算子,交叉运算使用单点交叉算子,
变异运算使用基本位变异算子。
第七步确定遗传算法的运行参数。
实现代码:
%n——种群规模
%ger----迭代次数
%pc----交叉概率
%pm----变异概率
%v----初始种群(规模为n)
%f----目标函数值
%fit----适应度向量
%vx----最优适应度值向量
%vmfit----平均适应度值向量
clearall;
closeall;
clc;
tic;
n=30;
ger=200;
pc=0.65;
pm=0.05;
%生成初始种群
v=init_population(n,50);
[N,L]=size(v);
disp(sprintf('Numberofgenerations:
%d',ger));
disp(sprintf('Populationsize:
%d',N));
disp(sprintf('Crossoverprobability:
%.3f,pc));
disp(sprintf('Mutationprobability:
%.3f,pm));
%待优化问题
xmin=-5;
xmax=5;
ymin=-5;
ymax=5;
f='-(2-exp(-(x.A2+y.A2)))';
[x,y]=meshgrid(xmin:
0.1:
xmax,ymin:
0.1:
ymax);vxp=x;
vyp=y;
vzp=eval(f);
figure
(1);
mesh(vxp,vyp,-vzp);
holdon;
gridon;
%计算适应度,并画出初始种群图形x=decode(v(:
1:
25),xmin,xmax);y=decode(v(:
26:
50),ymin,ymax);
fit=eval(f);
plot3(x,y,-fit,'k*');
title('(a)染色体的初始位置');
xlabel('x');
ylabel('y');
zlabel('f(x,y)');
%迭代前的初始化
vmfit=[];
vx=[];
it=1;%迭代计数器
%开始进化
whileit<=ger
%Reproduction(Bi-classistSelection)vtemp=roulette(v,fit);
%Crossoverv=crossover(vtemp,pc);
%Mutation
M=rand(N,L)<=pm;
%M(1,:
)=zeros(1,L);
v=v-2.*(v.*M)+M;
%Resultsx=decode(v(:
1:
25),xmin,xmax);y=decode(v(:
26:
50),ymin,ymax);fit=eval(f);
[sol,indb]=max(fit);%
v(1,:
)=v(indb,:
);
fit_mean=mean(fit);%
vx=[vxsol];
vmfit=[vmfitfit_mean];
it=it+1;
每次迭代中最优目标函数值
每次迭代中目标函数值的平均值
end
%%%%最后结果disp(sprintf('\n'));%
空一行
%显示最优解及最优值
disp(sprintf('Maximumfound[x,f(x)]:
[%.4f,%.4f,%.4f]',x(indb),y(indb),-sol));
%图形显示最优结果
figure
(2);
mesh(vxp,vyp,-vzp);
holdon;
gridon;
plot3(x,y,-fit,'r*');
title('染色体的最终位置');
xlabel('x');
ylabel('y');
zlabel('f(x,y)');
%图形显示最优及平均函数值变化趋势
figure(3);
plot(-vx);
%title('最优,平均函数值变化趋势');
xlabel('Generations');
ylabel('f(x)');
holdon;
plot(-vmfit,'r');
holdoff;
runtime=toc
结果:
Numberofgenerations:
200
Populationsize:
30
Crossoverprobability:
0.650
Mutationprobability:
0.050
Maximumfound[x,f(x)]:
[-0.0091,0.0099,1.0002]runtime=5.2720
故最优解为x=-0.0091,y=0.0099,z=1.0002
第八步结果分析
图1原始函数图形
图2染色体的最终位置
1.6
17
1.6
1.5
$1.4
1.3
1.2
1.1
1
图3个体适应度的最大值和平均值
2、利用蚁群算法求出下面函数的极小值:
z=2-exp[-(x2+y2)],x,y[-5,+5]
解:
实现代码如下:
%Antmainprogramclearall;closeall;clc;
tic;
Ant=100;
Ger=50;
xmin=-5;xmax=5;ymin=-5;ymax=5;tcl=0.05;
f='-(2-exp(-(x.A2+y.A2)))';%待优化的目标函数
[x,y]=meshgrid(xmin:
tcl:
xmax,ymin:
tcl:
ymax);vxp=x;
vyp=y;
vzp=eval(f);
figure
(1);mesh(vxp,vyp,-vzp);holdon;
%初始化蚂蚁位置
fori=1:
Ant
X(i,1)=(xmin+(xmax-xmin)*rand
(1));
X(i,2)=(ymin+(ymax-ymin)*rand
(1));
%TO----信息素,函数值越大,信息素浓度越大
T0(i)=exp(-(X(i,1)A2+X(i,2)A2))-2;
endplot3(X(:
1),X(:
2),-T0,'k*');holdon;
gridon;
title('蚂蚁的初始分布位置');
xlabel('x');
ylabel('y');
zlabel('f(x,y)');
%开始寻优
P0=0.2;%P0
P=0.8;%P
lamda=1/i_ger;%
全局转移选择因子
信息素蒸发系数转移步长参数
[T_Best(i_ger),BestIndex]=max(T0);
forj_g=1:
Ant%求取全局转移概率r=T0(BestIndex)-T0(j_g);Prob(i_ger,j_g)=r/T0(BestIndex);
end
forj_g_tr=1:
Ant
ifProb(i_ger,j_g_tr)(1)-1)*lamda;temp2=X(j_g_tr,2)+(2*rand
(1)-1)*lamda;
elsetemp1=X(j_g_tr,1)+(xmax-xmin)*(rand
(1)-0.5);temp2=X(j_g_tr,2)+(ymax-ymin)*(rand
(1)-0.5);
end
iftemp1end
iftemp1>xmaxtemp1=xmax;
end
iftemp2end
iftemp2>ymaxtemp2=ymax;
end
if
-(2-exp(-(temp1.A2+temp2.A2)))>-(2-exp(-(X(j_g_tr,1)A2+X(j_g_tr,2)A
2)))
X(j_g_tr,1)=temp1;
X(j_g_tr,2)=temp2;
end
end
%信息素更新
fort_t=1:
Ant
T0(t_t)=(1-P)*T0(t_t)-(2-exp(-(X(t_t,1)A2+X(t_t,2)A2)));
end
[c_iter,i_iter]=max(T0);maxpoint_iter=[X(i_iter,1),X(i_iter,2)];
max_local(i_ger)=-(2-exp(-(X(i_iter,1).A2+X(i_iter,2)42)));
%将每代全局最优解存到max_global矩阵中
ifi_ger>=2
ifmax_local(i_ger)>max_global(i_ger-1)max_global(i_ger)=max_local(i_ger);
else
max_global(i_ger)=max_global(i_ger-1);
end
else
max_global(i_ger)=max_local(i_ger);
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%figure
(2);
mesh(vxp,vyp,-vzp);
holdon;
x=X(:
1);
y=X(:
2);
plot3(x,y,-eval(f),'b*');
holdon;
gridon;
title('蚂蚁的最终分布位置');
xlabel('x');
ylabel('y');
zlabel('f(x,y)');
figure(3);
plot(1:
Ger,-max_global,'b-')
holdon;
title('最优函数值变化趋势');
xlabel('iteration');
ylabel('f(x)');
gridon;
[c_max,i_max]=max(TO);
maxpoint=[X(i_max,1),X(i_max,2)]
maxvalue=(2-exp(-(X(i_max,1).A2+X(i_max,2)42)))
runtime=toc
结果:
maxpoint=0.0033-0.0035
maxvalue=1.0000
runtime=0.9855
=1”■
图1原始函数图形
=14」
-5-5
图2染色体的最终位置
图3个体适应度的最大值和平均值
3、利用蚁群算法求下面加权有向图中从A到G的最短路解:
分析:
将点1~16是否在路径分别取值为0或1,这样就形成了16位的0,1序列,从而计算这条路径的距离。
将距离作为信息素的一个映射变量,由于这里要求最短路,所以可以使用倒数或者相对距离作为信息素浓度。
这样就可以获得每只蚂蚁的遗传概率,若转移概率大于全局转移因子,则进行全局转移;否则以一定的步长进行转移。
这样就可以逐步向全局最优解靠近。
第一步初始化N只蚂蚁。
实际上救赎N条道路,并计算当前蚂蚁的位置、作图。
第二步初始化运行参数,开始迭代。
第三步在迭代步数范围内,计算转移概率,如果小于全局转移概率就进行小范围的搜索,否则进行大范围的搜索。
第四步更新信息素,记录状态,准备进行下一次迭代。
第五步
实现代码:
%n
种群规模
%ger
迭代次数
%pc
交叉概率
%pm
变异概率
%v
初始种群(规模为n)
%f
目标函数值
%fit适应度向量
%vx最优适应度值向量
%vmfit平均适应度值向量
functionshortroad_ant_main
%Antmainprogram
clearall;closeall;clc;%清屏
tic;%计时开始
Ant=50;Ger=100;%运行参数初始化
power=[053100100100100100100100100100100100100100;
1000100136100100100100100100100100100100;
1001000100876100100100100100100100100100;
100100100010010010068100100100100100100100;
100100100100010010035100100100100100100100;
100100100100100010010033100100100100100100;
100100100100100100010084100100100100100100;
100100100100100100100010010022100100100100;
100100100100100100100100010010012100100100;
100100100100100100100100100010033100100100;
100100100100100100100100100100010010035100;
100100100100100100100100100100100010052100;
100100100100100100100100100100100100066100;
10010010010010010010010010010010010010001004;
10010010010010010010010010010010010010010003;
1001001001001001001001001001001001001001001000];[PMPN]=size(power);
%初始化蚂蚁位置
v=init_population(Ant,PN);
v(:
1)=1;v(:
PN)=1;%始点和终点纳入路径%把距离当信息素浓度fit=short_road_fun(v,power);
%距离越小越好,所以要和信息素浓度相对应T0=max(fit)-fit;
%画出图形
figure
(1);gridon;holdon;plot(fit,'k*');
title('(a)蚂蚁的初始位置');
xlabel('x');ylabel('f(x)');
全局转移选择因子
信息素蒸发系数
%初始化vmfit=[];vx=[];
P0=0.2;%P0
P=0.8;%P
%C=[];
%开始寻优
lamda=1/i_ger;%转移步长参数[T_Best(i_ger),BestIndex]=max(T0);%最大信息素浓度forj_g=1:
Ant%求取全局转移概率r=T0(BestIndex)-T0(j_g);%与最佳的蚂蚁的距离Prob(i_ger,j_g)=r/T0(BestIndex);%应该以多大的速率向它靠拢
end
forj_g_tr=1:
Ant
ifProb(i_ger,j_g_tr)%局部转移小动作转移
M=rand(1,PN)temp=v(j_g_tr,:
)-2.*(v(j_g_tr,:
).*M)+M;
else
%全局转移大步伐转移
M=rand(1,PN)temp=v(j_g_tr,:
)-2.*(v(j_g_tr,:
).*M)+M;
end
%始点和终点重新加入。
即不能在移动过程中发生改变。
temp(:
1)=1;temp(:
end)=1;
ifshort_road_fun(temp,power)),powe
r)
%记录
v(j_g_tr,:
)=temp;
end
end
%信息素更新,准备下一次迭代fit=short_road_fun(v,power);
T0=(1-P)*T0+(max(fit)-fit);%信息素蒸发
[sol,indb]=min(fit);
v(1,:
)=v(indb,:
);%记录本次迭代的状态media=mean(fit);
vx=[vxsol];
vmfit=[vmfitmedia];
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%最后结果
disp(sprintf('\n'));%空一行
%显示最优解及最优值
disp(sprintf('Shortroadis%s',num2str(find(v(indb,:
)))));%num2str数
据转换成字符。
disp(sprintf('Mininumis%d',sol));
v(indb,:
)
%图形显示最优结果figure
(2);gridon;holdon;
plot(fit,'r*');
title('蚂蚁的最终位置');xlabel('x');
ylabel('f(x)');
%图形显示最优及平均函数值变化趋势
figure(3);
plot(vx);
title('最优,平均函数值变化趋势');xlabel('Generations');ylabel('f(x)');
holdon;plot(vmfit,'r');holdoff;runtime=toc%时间结束end
%%
functionfit=short_road_fun(v,power)
[vmvn]=size(v);
fit=zeros(vm,1);%记录每一条路径的距离
fori=1:
vm
I=find(v(i,:
)==1);%寻找在路径上的点
[Im,In]=size(I);
forj=1:
In-1fit(i)=fit(i)+power(I(j),I(j+1));%求路径的距离
end
end
end
%%
%Functioninit_population
functionv=init_population(n1,s1)
v=round(rand(n1,s1));%初始化所有的蚂蚁
end
第六步输出结果:
Shortroadis1258121516
Mininumis18
ans=1100100100010011
runtime=2.4924
可知:
最优解为:
1100100100010011
最短路为:
1t2~12~15~16
最优值为:
18
运行时间为:
2.4924s
第七步结果分析
图1代表了50只蚂蚁的初始状态的无序分布情况
图3信息素浓度的平均值和最优值