遗传算法及蚂蚁算法作业.docx
- 文档编号:28069344
- 上传时间:2023-07-08
- 格式:DOCX
- 页数:19
- 大小:147.09KB
遗传算法及蚂蚁算法作业.docx
《遗传算法及蚂蚁算法作业.docx》由会员分享,可在线阅读,更多相关《遗传算法及蚂蚁算法作业.docx(19页珍藏版)》请在冰豆网上搜索。
遗传算法及蚂蚁算法作业
Thedocumentwasfinallyrevisedon2021
遗传算法及蚂蚁算法作业
题目1:
z=2-exp[-(x2+y2)],x,y[-5,+5],求函数最小值
(1)用遗传算法来做:
第一步:
确定决策变量及其约束条件
.-5<=x<=5
第二步:
建立优化模型
第三步:
确定编码方法,用长度为50位的二进制编码串来表示决策变量x
第四步:
确定解码方法
第五步:
确定个体评价方法
个体的适应度取为每次迭代的最小值的绝对值加上目标函数值,即
第六步:
确定参数
本题种群规模n=30,迭代次数ger=200,交叉概率pc=,变异概率pm=
代码:
clearall;
closeall;
clc;
tic;
n=30;
ger=200;
pc=;
pm=;
%生成初始种群
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.^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(:
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
运行结果:
Maximumfound[x,f(x)]:
[,,]
(2)用蚁群算法来做
代码:
%Antmainprogram
clearall;
closeall;
clc;
tic;
Ant=100;
Ger=50;
xmin=-5;
xmax=5;
ymin=-5;
ymax=5;
tcl=;
f='-(2-exp(-(x.^2+y.^2)))';%待优化的目标函数
[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));
%T0----信息素,函数值越大,信息素浓度越大
T0(i)=exp(-(X(i,1).^2+X(i,2).^2))-2;
end
plot3(X(:
1),X(:
2),-T0,'k*');
holdon;
gridon;
title('蚂蚁的初始分布位置');
xlabel('x');
ylabel('y');
zlabel('f(x,y)');
%开始寻优
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:
Ant
ifProb(i_ger,j_g_tr) 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); end iftemp1 temp1=xmin; end iftemp1>xmax temp1=xmax; end iftemp2 temp2=ymin; end iftemp2>ymax temp2=ymax; end 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; end end %信息素更新 fort_t=1: Ant T0(t_t)=(1-P)*T0(t_t)-(2-exp(-(X(t_t,1).^2+X(t_t,2).^2))); 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).^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); 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(T0); maxpoint=[X(i_max,1),X(i_max,2)] maxvalue=-(2-exp(-(X(i_max,1).^2+X(i_max,2).^2))) runtime=toc 结果: maxvalue= 题目2: 利用蚁群算法求下面加权有向图中从A到G的最短路: 解: 第一步: 初始化N只蚂蚁,也就是N条道路 第二步: 初始化运行参数,开始迭代 第三步: 在迭代步数范围之内,计算转移概率,如果小于全局转移概率就进行小范围的搜索,否则就进行大范围的搜索 第四步: 更新信息素,记录状态,准备进行下一次迭代 第五步: 转第三步 第六步: 输出结果 代码: 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=;%P0----全局转移选择因子 P=;%P----信息素蒸发系数 %C=[]; %开始寻优 fori_ger=1: Ger 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) ),power) %记录 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-1 fit(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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 遗传 算法 蚂蚁 作业