遗传算法及蚂蚁算法作业Word文档下载推荐.docx
《遗传算法及蚂蚁算法作业Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《遗传算法及蚂蚁算法作业Word文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。
[N,L]=size(v);
disp(sprintf('
Numberofgenerations:
%d'
ger));
Populationsize:
N));
Crossoverprobability:
%.3f'
pc));
Mutationprobability:
pm));
%待优化问题
xmin=-5;
xmax=5;
ymin=-5;
ymax=5;
f='
-(2-exp(-(x.^2+y.^2)))'
;
[x,y]=meshgrid(xmin:
:
xmax,ymin:
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);
%Crossover
v=crossover(vtemp,pc);
%Mutation
M=rand(N,L)<
=pm;
%M(1,:
)=zeros(1,L);
v=v-2.*(v.*M)+M;
%Results
x=decode(v(:
y=decode(v(:
fit=eval(f);
[sol,indb]=max(fit);
%每次迭代中最优目标函数值
v(1,:
)=v(indb,:
fit_mean=mean(fit);
%每次迭代中目标函数值的平均值
vx=[vxsol];
vmfit=[vmfitfit_mean];
it=it+1;
end
%%%%最后结果
\n'
));
%空一行
%显示最优解及最优值
Maximumfound[x,f(x)]:
[%.4f,%.4f,%.4f]'
x(indb),y(indb),-sol));
%图形显示最优结果
figure
(2);
r*'
染色体的最终位置'
%图形显示最优及平均函数值变化趋势
figure(3);
plot(-vx);
%title('
最优,平均函数值变化趋势'
Generations'
f(x)'
plot(-vmfit,'
r'
holdoff;
runtime=toc
运行结果:
[,,]
(2)用蚁群算法来做
代码:
%Antmainprogram
Ant=100;
Ger=50;
tcl=;
%待优化的目标函数
tcl:
%初始化蚂蚁位置
fori=1:
Ant
X(i,1)=(xmin+(xmax-xmin)*rand
(1));
X(i,2)=(ymin+(ymax-ymin)*rand
(1));
%T0----信息素,函数值越大,信息素浓度越大
T0(i)=exp(-(X(i,1).^2+X(i,2).^2))-2;
plot3(X(:
1),X(:
2),-T0,'
蚂蚁的初始分布位置'
%开始寻优
fori_ger=1:
Ger
P0=;
%P0----全局转移选择因子
P=;
%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:
ifProb(i_ger,j_g_tr)<
P0
temp1=X(j_g_tr,1)+(2*rand
(1)-1)*lamda;
temp2=X(j_g_tr,2)+(2*rand
(1)-1)*lamda;
else
temp1=X(j_g_tr,1)+(xmax-xmin)*(rand
(1);
temp2=X(j_g_tr,2)+(ymax-ymin)*(rand
(1);
iftemp1<
xmin
temp1=xmin;
iftemp1>
xmax
temp1=xmax;
iftemp2<
ymin
temp2=ymin;
iftemp2>
ymax
temp2=ymax;
if-(2-exp(-(temp1.^2+temp2.^2)))>
-(2-exp(-(X(j_g_tr,1).^2+X(j_g_tr,2).^2)))
X(j_g_tr,1)=temp1;
X(j_g_tr,2)=temp2;
%信息素更新
fort_t=1:
T0(t_t)=(1-P)*T0(t_t)-(2-exp(-(X(t_t,1).^2+X(t_t,2).^2)));
[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).^2+X(i_iter,2).^2)));
%将每代全局最优解存到max_global矩阵中
ifi_ger>
=2
ifmax_local(i_ger)>
max_global(i_ger-1)
max_global(i_ger)=max_local(i_ger);
max_global(i_ger)=max_global(i_ger-1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x=X(:
1);
y=X(:
2);
plot3(x,y,-eval(f),'
b*'
蚂蚁的最终分布位置'
plot(1:
Ger,-max_global,'
b-'
)
最优函数值变化趋势'
iteration'
[c_max,i_max]=max(T0);
maxpoint=[X(i_max,1),X(i_max,2)]
maxvalue=-(2-exp(-(X(i_max,1).^2+X(i_max,2).^2)))
结果:
maxvalue=
题目2:
利用蚁群算法求下面加权有向图中从A到G的最短路:
解:
初始化N只蚂蚁,也就是N条道路
初始化运行参数,开始迭代
在迭代步数范围之内,计算转移概率,如果小于全局转移概率就进行小范围的搜索,否则就进行大范围的搜索
更新信息素,记录状态,准备进行下一次迭代
转第三步
输出结果
functionshortroad_ant_main
%清屏
%计时开始
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;
PN)=1;
%始点和终点纳入路径
%把距离当信息素浓度
fit=short_road_fun(v,power);
%距离越小越好,所以要和信息素浓度相对应。
T0=max(fit)-fit;
%画出图形
plot(fit,'
(a)蚂蚁的初始位置'
%初始化
P0=;
P=;
%C=[];
%最大信息素浓度
%与最佳的蚂蚁的距离
%应该以多大的速率向它靠拢
end
%局部转移----小动作转移
M=rand(1,PN)<
lamda;
temp=v(j_g_tr,:
)-2.*(v(j_g_tr,:
).*M)+M;
%全局转移----大步伐转移
P0;
%始点和终点重新加入。
即不能在移动过程中发生改变。
temp(:
temp(:
end)=1;
ifshort_road_fun(temp,power)<
short_road_fun(v(j_g_tr,:
),power)
%记录
v(j_g_tr,:
)=temp;
%信息素更新,准备下一次迭代
fit=short_road_fun(v,power);
T0=(1-P)*T0+(max(fit)-fit);
%信息素蒸发
[sol,indb]=min(fit);
%记录本次迭代的状态
media=mean(fit);
vmfit=[vmfitmedia];
Shortroadis%s'
num2str(find(v(indb,:
)))));
%num2str数据转换成字符。
Mininumis%d'
sol));
v(indb,:
蚂蚁的最终位置'
plot(vx);
plot(vmfit,'
runtime=toc%时间结束
%%
functionfit=short_road_fun(v,power)
[vmvn]=size(v);
fit=zeros(vm,1);
%记录每一条路径的距离
vm
I=find(v(i,:
)==1);
%寻找在路径上的点
[Im,In]=size(I);
forj=1:
In-1
fit(i)=fit(i)+power(I(j),I(j+1));
%求路径的距离
%Functioninit_population
functionv=init_population(n1,s1)
v=round(rand(n1,s1));
%初始化所有的蚂蚁
Shortroadis1258121516
Mininumis18