I am attempting to run code found on mat lab website that does Davis order crossover. Attached is the code used, however I continue to get this error Error: File: ga_TSP.m Line: 202 Column: 1 This statement is not inside any function. )
6 views (last 30 days)
Show older comments
function ga_TSP
% mainly amended by Chen Zhen, 2012~2016
CityNum=30; %you chan choose 10, 30, 50, 75 [dislist,Clist]=tsp(CityNum);
inn=30; %初始种群大小 gnmax=500; %最大代数 pc=0.8; %交叉概率 pm=0.8; %变异概率
%产生初始种群 s=zeros(inn,CityNum); for i=1:inn s(i,:)=randperm(CityNum); end [~,p]=objf(s,dislist);
gn=1; ymean=zeros(gn,1); ymax=zeros(gn,1); xmax=zeros(inn,CityNum); scnew=zeros(inn,CityNum); smnew=zeros(inn,CityNum); while gn<gnmax+1 for j=1:2:inn seln=sel(p); %选择操作 scro=cro(s,seln,pc); %交叉操作 scnew(j,:)=scro(1,:); scnew(j+1,:)=scro(2,:); smnew(j,:)=mut(scnew(j,:),pm); %变异操作 smnew(j+1,:)=mut(scnew(j+1,:),pm); end s=smnew; %产生了新的种群 [f,p]=objf(s,dislist); %计算新种群的适应度 %记录当前代最好和平均的适应度 [fmax,nmax]=max(f); ymean(gn)=1000/mean(f); ymax(gn)=1000/fmax; %记录当前代的最佳个体 x=s(nmax,:); xmax(gn,:)=x; drawTSP(Clist,x,ymax(gn),gn,0); gn=gn+1; end [min_ymax,index]=min(ymax); drawTSP(Clist,xmax(index,:),min_ymax,index,1);
figure(2); plot(ymax,'r'); hold on; plot(ymean,'b');grid; title('搜索过程'); legend('最优解','平均解'); fprintf('遗传算法得到的最短距离:%.2f\n',min_ymax); fprintf('遗传算法得到的最短路线'); disp(xmax(index,:)); end
%------------------------------------------------ %计算所有种群的适应度 function [f,p]=objf(s,dislist)
inn=size(s,1); %读取种群大小 f=zeros(inn,1); for i=1:inn f(i)=CalDist(dislist,s(i,:)); %计算函数值,即适应度 end f=1000./f'; %取距离倒数
%根据个体的适应度计算其被选择的概率 fsum=0; for i=1:inn fsum=fsum+f(i)^15;% 让适应度越好的个体被选择概率越高 end ps=zeros(inn,1); for i=1:inn ps(i)=f(i)^15/fsum; end
%计算累积概率 p=zeros(inn,1); p(1)=ps(1); for i=2:inn p(i)=p(i-1)+ps(i); end p=p'; end
%-------------------------------------------------- %根据变异概率判断是否变异 function pcc=pro(pc) test(1:100)=0; l=round(100*pc); test(1:l)=1; n=round(rand*99)+1; pcc=test(n); end
%-------------------------------------------------- %“选择”操作 function seln=sel(p)
seln=zeros(2,1); %从种群中选择两个个体,最好不要两次选择同一个个体 for i=1:2 r=rand; %产生一个随机数 prand=p-r; j=1; while prand(j)<0 j=j+1; end seln(i)=j; %选中个体的序号 if i==2&&j==seln(i-1) %%若相同就再选一次 r=rand; %产生一个随机数 prand=p-r; j=1; while prand(j)<0 j=j+1; end end end end
%------------------------------------------------ %“交叉”操作 function scro=cro(s,seln,pc)
bn=size(s,2); pcc=pro(pc); %根据交叉概率决定是否进行交叉操作,1则是,0则否 scro(1,:)=s(seln(1),:); scro(2,:)=s(seln(2),:); if pcc==1 c1=round(rand*(bn-2))+1; %在[1,bn-1]范围内随机产生一个交叉位 c2=round(rand*(bn-2))+1; chb1=min(c1,c2); chb2=max(c1,c2); middle=scro(1,chb1+1:chb2); scro(1,chb1+1:chb2)=scro(2,chb1+1:chb2); scro(2,chb1+1:chb2)=middle; for i=1:chb1 %似乎有问题 while find(scro(1,chb1+1:chb2)==scro(1,i)) zhi=find(scro(1,chb1+1:chb2)==scro(1,i)); y=scro(2,chb1+zhi); scro(1,i)=y; end while find(scro(2,chb1+1:chb2)==scro(2,i)) zhi=find(scro(2,chb1+1:chb2)==scro(2,i)); y=scro(1,chb1+zhi); scro(2,i)=y; end end for i=chb2+1:bn while find(scro(1,1:chb2)==scro(1,i)) zhi=logical(scro(1,1:chb2)==scro(1,i)); y=scro(2,zhi); scro(1,i)=y; end while find(scro(2,1:chb2)==scro(2,i)) zhi=logical(scro(2,1:chb2)==scro(2,i)); y=scro(1,zhi); scro(2,i)=y; end end end end
%-------------------------------------------------- %“变异”操作 function snnew=mut(snew,pm)
bn=size(snew,2); snnew=snew;
pmm=pro(pm); %根据变异概率决定是否进行变异操作,1则是,0则否 if pmm==1 c1=round(rand*(bn-2))+1; %在[1,bn-1]范围内随机产生一个变异位 c2=round(rand*(bn-2))+1; chb1=min(c1,c2); chb2=max(c1,c2); x=snew(chb1+1:chb2); snnew(chb1+1:chb2)=fliplr(x); end end
%------------------------------------------------ %城市位置坐标 function [DLn,city10]=tsp(n) DLn=zeros(n,n); if n==10 city10=[0.4 0.4439;0.2439 0.1463;0.1707 0.2293;0.2293 0.761;0.5171 0.9414; 0.8732 0.6536;0.6878 0.5219;0.8488 0.3609;0.6683 0.2536;0.6195 0.2634];%10 cities d'=2.691 for i=1:10 for j=1:10 DLn(i,j)=((city10(i,1)-city10(j,1))^2+(city10(i,2)-city10(j,2))^2)^0.5; end end end end %cityn=city10;
if n==30 city30=[41 94;37 84;54 67;25 62;7 64;2 99;68 58;71 44;54 62;83 69;64 60;18 54;22 60; 83 46;91 38;25 38;24 42;58 69;71 71;74 78;87 76;18 40;13 40;82 7;62 32;58 35;45 21;41 26;44 35;4 50];%30 cities d'=423.741 by D B Fogel for i=1:30 end end for j=1:30 end
0 Comments
Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!