利用遗传算法 求解TSP问题 matlab 源代码
2018-11-29 23:39
447 查看
function main() clear; clc; %城市坐标 a=importdata('data.txt',','); a=a/1000; x=a(:,1)';x(end+1)=a(1,1); y=a(:,2)';y(end+1)=a(1,2); n=0:50; x=cos(2*pi*n/50); y=sin(2*pi*n/50); %初始方式数目 %城市数目 n=length(x)-1; kinsize=500; %编码长度 lm=n-1; %初始方式 kin = initkin(kinsize,lm); %编码 code=encode(kin); %交叉概率 pc = 0.6; %变异概率 pm = 0.8; for i = 1:20000 %计算周长 [adx,ady]=get_add(x,y,code); len=cal_length(adx,ady); [ax(i),ad]=min(len); if mod(i,400) == 0 figure; plot(x,y,'ro'); decode(code(ad,:)); hold on; plot(adx(ad,:),ady(ad,:)); title(['迭代次数为n=' num2str(i)]); end mincode=code(ad,:); %适应度值(函数值) a=-1; objvalue = exp(a*len); %选择操作 ncode=selection(code,objvalue); %交叉操作 ncode = crossover(ncode,pc); %变异操作 ncode = mutation(ncode,pm); %更新编码 [adx,ady]=get_add(x,y,code); len=cal_length(adx,ady); [am(i),ap]=max(len); ncode(ap,:)=[]; code = [ncode;mincode]; end figure; plot(1:i,ax); end %如何选择新的个体 %输入变量:pop二进制种群,fitvalue:适应度值 %输出变量:newpop选择以后的二进制种群 function [ncode] = selection(code,objvalue) %构造轮盘 [py,px] = size(code); ncode=zeros(py,px); totalfit = sum(objvalue); p_objvalue = objvalue/totalfit; p_objvalue = cumsum(p_objvalue);%概率求和排序 ms = sort(rand(py,1));%从小到大排列 fitin = 1; newin = 1; while newin<=py if(ms(newin))<p_objvalue(fitin) ncode(newin,:)=code(fitin,:); newin = newin+1; else fitin=fitin+1; end end end function [ncode] = mutation(code,pm) [py,px] = size(code); ncode = ones(size(code)); for i = 1:py for j=1:3 if(rand<pm) mpoint = round(rand*(px-1)); if mpoint <= 0; mpoint = 1; end ncode(i,:) = code(i,:); a=0:px-mpoint; a(ncode(i,mpoint)+1)=[]; ncode(i,mpoint)=a(randperm(px-mpoint,1)); else ncode(i,:) =code(i,:); end end end end function kin=initkin(kinsize,lm) kin=zeros(kinsize,lm); for i=1:kinsize kin(i,:) = randperm(lm)+1; end end function [adx ady]=get_add(x,y,code) kin = decode(code); [py,px]=size(kin); adx=zeros(py,px+2); ady=zeros(py,px+2); for i=1:py ax=zeros(1,px+2);d1=zeros(1,px+1); ay=zeros(1,px+2);d2=zeros(1,px+1); ax(1)=x(1); ay(1)=y(1); ax(px+2)=x(px+2); ay(px+2)=y(px+2); for j=1:px ax(j+1)=x(kin(i,j)); ay(j+1)=y(kin(i,j)); end adx(i,:)=ax; ady(i,:)=ay; end end function code = encode(kin) [py,px]=size(kin); code=zeros(py,px); for i=1:py for j=1:px code(i,j)=sum(kin(i,j:end)<kin(i,j)); end end end function kin = decode(code) [py,px]=size(code); kin=zeros(py,px); for i=1:py a=2:px+1; for j=1:px kin(i,j)=a(code(i,j)+1); a(code(i,j)+1)=[]; end end end function [ncode] = crossover(code,pc) [py,px] = size(code); ncode = ones(size(code)); for i = 1:2:py-1 if(rand<pc) cpoint = round(rand*px); ncode(i,:) = [code(i,1:cpoint),code(i+1,cpoint+1:px)]; ncode(i+1,:) = [code(i+1,1:cpoint),code(i,cpoint+1:px)]; else ncode(i,:) = code(i,:); ncode(i+1,:) =code(i+1,:); end end function len=cal_length(adx,ady) d1=adx(:,2:end)-adx(:,1:end-1); d2=ady(:,2:end)-ady(:,1:end-1); len=sum(sqrt(d1.*d1+d2.*d2),2); end
相关文章推荐
- 利用Matlab以蚁群算法(Ant Colony Algorithm)求解不闭合的旅行商问题(Travelling Salesman Problem, TSP)并进行可视化
- Matlab 遗传算法求解TSP问题
- 遗传算法 求解旅行商 TSP 问题,matlab代码
- Python动态展示遗传算法求解TSP旅行商问题
- 遗传算法Java实现以及TSP问题遗传算法求解
- 基于遗传算法(Genetic Algorithm)的TSP问题求解(C)
- 利用HTML5 Canvas和Javascript实现的蚁群算法求解TSP问题演示
- 基于遗传算法求解TSP问题(Java界面)
- 利用粒子群算法求解非线性二层规划问题(matlab)
- 遗传算法Java实现以及TSP问题遗传算法求解
- 遗传算法求解TSP问题
- TSP问题——GA(遗传算法)解法(附源代码)
- 遗传算法的简单应用-巡回旅行商(TSP)问题的求解
- 遗传算法求解TSP问题
- 简要解析模拟退火算法以及利用它求解TSP问题
- 基于遗传算法求解TSP问题(Java界面)
- 【机器学习】利用蚁群算法求解旅行商(TSP)问题
- 遗传算法求解TSP问题
- 基于边缘重组的遗传算法求解TSP问题
- 基于遗传算法求解TSP问题(JAVA)