遗传算法计算城市距离

看《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

用了几个书里头的函数。

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

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

我的下载频道里有这本书

    原文作者:遗传算法
    原文地址: https://blog.csdn.net/wkk15903468980/article/details/53728595
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞