您的位置:首页 > 编程语言 > MATLAB

利用遗传算法 求解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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: