【TSP问题】基于差分进化求解的TSP问题matlab源码

·  阅读 280

一、介绍
差分进化算法是模拟自然界生物种群以“优胜劣汰,适者生存”为原则的进化发展规律而形成的一种随机启发式搜索算法。其保留了基于种群的全局搜索策略,采用实数编码,基于差分的简单变异操作和一对一的竞争生存策略,比遗传算法更简单。同时,差分进化算法独特的记忆能力使其可以动态的跟踪当前的搜索情况,及时调整搜索测量,因此具有较强的全局收敛能力。
目前为止,差分进化算法已经成为一种求解非线性,不可微,多极值和高维复杂函数的一种极其有效的方法。
在优化设计中,差分进化算法与传统的算法相比,具有以下特点:
1.差分进化算法从一个群体即多个点而不是从一个点开始搜索,这也是算法能够以较大的概率找到整体最优解的原因。
2.算法的进化准则是基于适应性信息的,不需要其他的辅助性信息,如要求函数可导,连续等。
3. 差分进化算法具有内在的并行性,适用于大规模并行分布处理,减小时间成本开销。
但缺点为:
1.算法后期个体之间的差异性减小,收敛速度慢,易陷入局部最优。
2.没有利用个体的先验知识,可能较多的迭代次数才能收敛到全局最优
算法框架:
在这里插入图片描述

1.种群初始化设置初始进化代数t=0,在优化问题的可行解空间内按下式,随机产生满足约束条件的NP个个体X构成初始种群,NP的选取一般在维数D的5-10倍之间。

4202b6878852ca5c788998d67bea6461.png

2.变异操作变异操作是DE算法中的关键步骤,也是其与其他进化算法的主要区别所在。DE算法最基本的变异成分是父代的差分矢量,每个差分矢量对应父代种群中两个不同个体的差向量,差分矢量定义见下式:

178d3e93e048e11d216faea947b558b0.png

其中,r1,r2,r3∈{1, 2, …,NP}为随机选取的互不相同的正整数,且r1,r2,r3与当前目标个体矢量索引号i不同,由此可见,DE算法的种群规模必须大于4,否则将无法进行变异操作。Vi(t+1)为目标个体矢量Xi(t)对应的变异个体矢量,Xr3(t)称为基向量,F∈[0, 2]为常数,是DE算法的主要控制参数之一,称为变异因子或缩放因子,控制差异矢量的缩放幅度,也即对基向量影响的大小。

b6d33a456391c433e76b7cb0d177b1c5.png

3.交叉操作为进一步增加种群多样性,DE 算法将目标矢量个体Xi(t)与其对应的变异个体Vi(t+1)进行交叉操作,产生试验个体,即目标个体的候选个体Ui(t+1)。为保证目标个体Xi(t)的进化,必须保证试验个体Ui(t+1)中至少有一维分量由变异个体Vi(t+1)贡献,而其他维分量则由交叉概率因子CR决定。由此试验个体中每一维分量uij(t+1)按下式。

1910f19726af28febcb7744427b8ab70.png其中,xij(t)表示父代种群中目标个体矢量Xi(t)中的第j维分量,vij(t+1)为变异个体Vi(t+1)中的第j维分量,其中i=1,…,NP,j=1,…,D。rand(j)∈[0,1]为第j维分量对应的随机数。交叉概率因子CR∈[0,1]是DE算法的另一个主要控制参数,它决定了变异个体Vi(t+1)在生成的试验个体Ui(t+1)中所占的比例。 k为第i个个体对应的系数,一般是从序列[1, 2, …,D]中随机选择的一个整数,用来确保候选个体Ui(t+1)中至少有一维分量来自变异个体Vi(t+1)。

4.选择操作(优胜劣汰)

8a7a0f0a1bf19280e37ac3b4a5e45e11.png

close all
clear
clc

%edit by zhang
% 2014-3-15

city=[1304,2312;3639,1315;4177,2244;3712,1399;3488,1535;3326,1556;...    3238,1229;4196,1004;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,2367;3394,3201;3439,3201;2935,3240;3140,3550;2545,2357;2778,2826;2370,2975];

city_num=size(city,1);
%计算两两城市之间的距离
for i=1:city_num
    for j=1:city_num
        distance(i,j)=sqrt((city(i,1)-city(j,1))^2 + (city(i,2)-city(j,2))^2);
    end
end
%相比于其他算法,迭代次数略长
NP=20;
NG=2000;
F=0.6;
CR=0.5;

pop=zeros(NP,city_num);
x_old=zeros(NP,city_num);
x_new=zeros(NP,city_num);
pi_old=zeros(NP,city_num);
pi_new=zeros(NP,city_num);

for i=1:NP
    for j=1:city_num
       pop(i,j)=5*rand();
    end
end

k=1;

x_old=pop;

while k<=NG
    %将实数编码转换成工件顺序编码
    for i=1:NP
      x_old_decode(i,:)=LOVdecode(x_old(i,:));
    end
    %----find the best value--------------%
    ind_best  = x_old(1,:);
    for i=2:NP
        pi_best=LOVdecode(ind_best);
        
        if CalLength(distance,pi_best)>CalLength(distance,x_old_decode(i,:))
            ind_best = x_old(i,:);
        end
    end
    
    BestFit=CalLength(distance , LOVdecode(ind_best));%最短时间
    Best=LOVdecode(ind_best);%最佳路径
     %%--------mutaiton---------------------%
     for i=1:NP
         R=randperm(NP);
         r1=R(1);
         r2=R(2);
         r3=R(3);
         
         if i==r1
             r1=R(4);
         else if i==r2
                 r2=R(4);
             else if i==r3
                     r3=R(4);
                 end
             end
         end
         

       
     x_old = x_new; 
     k=k+1;
end
BSF=Best;
BestL=BestFit;
%绘制路径图
for i=1:city_num-1 
        plot([city(BSF(i),1),city(BSF(i+1),1)],[city(BSF(i),2),city(BSF(i+1),2)],'bo-'); 
        hold on; 
end 
plot([city(BSF(city_num),1),city(BSF(1),1)],[city(BSF(city_num),2),city(BSF(1),2)],'ro-');
title('差分进化TSP')

disp('最佳路径');
disp(BSF);
disp('最短路径长度');
disp(BestL)
复制代码

 

分类:
代码人生
标签:
收藏成功!
已添加到「」, 点击更改