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

遗传算法计算城市距离

2016-12-18 17:26 330 查看
看《matlab智能算法30个案例分析》到了第四章,看完了他的遗传算法交叉变异后,觉得这几个步骤有点鸡肋。到底交叉起了什么作用?变异又起了什么作用?本身就是算个跑遍14个城市的最短距离,有必要完全套用所有遗传算法的步骤吗?

于是我只用了一种我自己的变异方法,在现有的路径规划的基础上,交换某两个城市在路径上的位置,得到新的路径。试试只用这一种方法能不能得到最佳路径。 结果还是比较好的:



%主函数

clear all %纯基因插入法

X=[ 16.4700 96.1000

16.4700 94.4400

20.0900 92.5400

22.3900 93.3700

25.2300 97.2400

22.0000 96.0500

20.4700 97.0200

17.2000 96.2900

16.3000 97.3800

14.0500 98.1200

16.5300 97.3800

21.5200 95.5900

19.4100 97.1300

20.0900 92.5500];% 这是每个城市的坐标,一共14个城市

D=Distanse(X);

population=myrand(100,14); %初始化 %变量为种群大小和城市个数

for j=1:1000 %种群迭代这么多次

length=PathLength(D,population); %计算总距离

tmp=find(min(length)==length);

nowbest=population(tmp(1),:);%保留每次最好的那个路径

for j2=2:90 %做纯基因插入

while(rand<0.9)

nowbest_copy=nowbest;%只从最好的那个路径开始做变异 (我也不知道这样做会不会造成可能性不足,再考虑吧)

r1=floor(rand*13.99)+1;%取出位置

r2=floor(rand*12.99)+1;%插入位置

nowbest_copy2=[nowbest_copy(1:r1-1),nowbest_copy(r1+1:14)];%取出

population(j2,:)=[nowbest_copy2(1:r2-1),nowbest_copy(r1),nowbest_copy2(r2:13)]; %插入

end

end

population=[population;myrand(10,14)];%补上10个纯随机值

end

length=PathLength(D,population);

bestpath=population(find(min(length)==length),:)

bestlength=min(length)

DrawPath(bestpath,X);

%客观上最优解应该是12—>6—>5—>4—>3—>14—>2—>1—>10—>9—>11—>8—>13—>7—>12

%最优距离是29.3405

%% 计算两两城市之间的距离

%输入 a 各城市的位置坐标

%输出 D 两两城市之间的距离

function D=Distanse(a)

row=size(a,1);

D=zeros(row,row);

for i=1:row

for j=i+1:row

D(i,j)=((a(i,1)-a(j,1))^2+(a(i,2)-a(j,2))^2)^0.5;

D(j,i)=D(i,j);

end

end

%% 画路径函数

%输入

% Chrom 待画路径

% X 各城市坐标位置

function DrawPath(Chrom,X)

R=[Chrom(1,:) Chrom(1,1)]; %一个随机解(个体)

figure;

hold on

plot(X(:,1),X(:,2),'o','color',[0.5,0.5,0.5])

plot(X(Chrom(1,1),1),X(Chrom(1,1),2),'rv','MarkerSize',20)

for i=1:size(X,1)

text(X(i,1)+0.05,X(i,2)+0.05,num2str(i),'color',[1,0,0]);

end

A=X(R,:);

row=size(A,1);

for i=2:row

[arrowx,arrowy] = dsxy2figxy(gca,A(i-1:i,1),A(i-1:i,2));%坐标转换

annotation('textarrow',arrowx,arrowy,'HeadWidth',8,'color',[0,0,1]);

end

hold off

xlabel('横坐标')

ylabel('纵坐标')

title('轨迹图')

box on

function varargout = dsxy2figxy(varargin)

if length(varargin{1}) == 1 && ishandle(varargin{1}) ...

&& strcmp(get(varargin{1},'type'),'axes')

hAx = varargin{1};

varargin = varargin(2:end);

else

hAx = gca;

end;

if length(varargin) == 1

pos = varargin{1};

else

[x,y] = deal(varargin{:});

end

axun = get(hAx,'Units');

set(hAx,'Units','normalized');

axpos = get(hAx,'Position');

axlim = axis(hAx);

axwidth = diff(axlim(1:2));

axheight = diff(axlim(3:4));

if exist('x','var')

varargout{1} = (x - axlim(1)) * axpos(3) / axwidth + axpos(1);

varargout{2} = (y - axlim(3)) * axpos(4) / axheight + axpos(2);

else

pos(1) = (pos(1) - axlim(1)) / axwidth * axpos(3) + axpos(1);

pos(2) = (pos(2) - axlim(3)) / axheight * axpos(4) + axpos(2);

pos(3) = pos(3) * axpos(3) / axwidth;

pos(4) = pos(4) * axpos(4 )/ axheight;

varargout{1} = pos;

end

set(hAx,'Units',axun)

%% 计算各个体的路径长度

% 输入:

% D 两两城市之间的距离

% Chrom 个体的轨迹

function len=PathLength(D,Chrom)

[row,col]=size(D);

NIND=size(Chrom,1);

len=zeros(NIND,1);

for i=1:NIND

p=[Chrom(i,:) Chrom(i,1)];

i1=p(1:end-1);

i2=p(2:end);

len(i,1)=sum(D((i1-1)*col+i2));

end

function out=myrand(a,b) %a种群大小 b城市个数

out=zeros(a,b);

for j=1:a

sequence=1:b;

for j2=1:b

index=round(rand*(b-j2))+1;

out(j,j2)=sequence(index);

sequence=[sequence(1:index-1),sequence(index+1:end)];

end

end

end

用了几个书里头的函数。

多次测试后发现书里头的程序和我的程序都有一定的错误率。好像我的更高些吧。。。。。

还是得对遗传算法做更深入的理解,每一步的意义到底是什么

我的下载频道里有这本书
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息