遗传算法--旅行商问题(TSP问题)-Matlab

1、问题

2、仿真过程

3、代码实现

1、旅行商问题(TSP问题)。

假设有一个旅行商人要拜访全国31个省会城市,它需要选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。对路径选择的要求是:所选路径的路成为所有路径之中的最小值。

全国31个省会城市的坐标为

[1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;3238 1229;4196 1044;

4312  790;4386  570;3007 1970;2562 1756;2788 1491;2381 1676;1332  695;3715 1678;

3918 2179;4061 2370;3780 2212;3676 2578;4029 2838;4263 2931;3429 1908;3507 2376;

3394 2643;3439 3201;2935 3240;3140 3550;2545 2357;2778 2826;2370 2975]

2、仿真过程

(1)初始化种群数目NP=200,染色体基因维数为N=31,最大进化代数G=1000.

(2)产生初始种群,计算个体适应度值,即路径长度:采用基于概率的方式选择进行操作的个体;对选中的成对个体,随机交叉所选中的成对城市坐标,以确保交叉后路径每个城市只到访一次;对选中的单个个体,随机交换其一对城市坐标作为变异操作,产生新的种群,进行下一次遗传操作。

(3)判断是否满足终止条件:若满足,则结束搜索过程,输出优化值,若不满足,则继续进迭代优化。

3、代码实现

%% 遗传算法解决TSP问题
clear all;
close all;
clc;

%% 初始化参数
C=[1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;...
    3238 1229;4196 1044;4312  790;4386  570;3007 1970;2562 1756;...
    2788 1491;2381 1676;1332  695;3715 1678;3918 2179;4061 2370;...
    3780 2212;3676 2578;4029 2838;4263 2931;3429 1908;3507 2376;...
    3394 2643;3439 3201;2935 3240;3140 3550;2545 2357;2778 2826;...
    2370 2975];                  %31个省会城市坐标
N=size(C,1);                     %TSP问题的规模,即城市数目
D=zeros(N);                      %任意两个城市距离间隔矩阵

%% 求任意两个城市距离间隔矩阵
for i=1:N
    for j=1:N
        D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5;
    end
end
NP=200;                           %免疫个体数目
G=1000;                           %最大免疫代数
f=zeros(NP,N);                    %用于存储种群
F = [];                           %种群更新中间存储
for i=1:NP
    f(i,:)=randperm(N);           %随机生成初始种群
end
R = f(1,:);                       %存储最优种群
len=zeros(NP,1);                  %存储路径长度
fitness = zeros(NP,1);            %存储归一化适应度值
gen = 0;

%% 遗传算法循环
while gen<G
    %% 计算路径长度
    for i=1:NP
        len(i,1)=D(f(i,N),f(i,1));    
        for j=1:(N-1)
            len(i,1)=len(i,1)+D(f(i,j),f(i,j+1));
        end
    end
    maxlen = max(len); 
    minlen = min(len);
    
    %% 更新最短路径
    rr = find(len==minlen);
    R = f(rr(1,1),:);
    
    %% 计算归一化适应度
    for i =1:length(len)
        fitness(i,1) = (1-((len(i,1)-minlen)/(maxlen-minlen+0.001)));
    end
    
    %% 选择操作
    nn = 0;
    for i=1:NP
        if fitness(i,1)>=rand
            nn = nn+1;
            F(nn,:)=f(i,:);
        end
    end
    [aa,bb] = size(F);
    while aa<NP
        nnper = randperm(nn);
        A = F(nnper(1),:);
        B = F(nnper(2),:);
        
        %% 交叉操作
        W = ceil(N/10);     % 交叉点个数
        p = unidrnd(N-W+1);   % 随机选择交叉范围,从p到p+W
        for i =1:W
            x = find(A==B(p+i-1));
            y = find(B==A(p+i-1));
            temp = A(p+i-1);
            A(p+i-1) =B(p+i-1);
            B(p+i-1) = temp;
            temp = A(x);
            A(x) = B(y);
            B(y) = temp;
        end
        
        %% 变异操作
        p1 = floor(1+N*rand());
        p2 = floor(1+N*rand());
        while p1==p2
            p1 = floor(1+N*rand());
            p2 = floor(1+N*rand());
        end
        tmp = A(p1);
        A(p1) = A(p2);
        A(p2) = tmp;
        tmp = B(p1);
        B(p1) = B(p2);
        B(p2) = tmp;
        F = [F;A;B];
        [aa,bb] = size(F);
    end
    if aa>NP
        F = F(1:NP,:);        % 保持种群规模为NP
    end
    f = F;                    % 更新种群
    f(1,:) = R;               % 保留每代最优个体
    clear F;
    gen = gen+1;
    Rlength(gen) = minlen;
end

%% 绘制图形
figure
for i = 1:N-1
    plot([C(R(i),1),C(R(i+1),1)],[C(R(i),2),C(R(i+1),2)],'bo-');
    hold on;
end

plot([C(R(N),1),C(R(1),1)],[C(R(N),2),C(R(1),2)],'ro-');
title(['优化最短距离:',num2str(minlen)]);
figure
plot(Rlength)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')


由于初始位置不确定,每次结果也不一样

第一次

 第二次

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值