用模拟退火算法求解TSP问题

     模拟退火算法是一种基于MonteCarlo迭代求解策略的一种随机寻优算法。该算法从某一较高初温出发,伴随温度参数的不断下降,结合概率的突跳特性在解空间中随机寻找目标函数的全局最优解,即在局部最优解能概率性地跳出并最终趋于全局最优。

      模拟退火算法的基本思想是:在一定温度下,搜索从一个状态随机地变化到另一个状态;随着温度的不断下降直到最低温度,搜索过程以概率1停留在最优解。

     模拟退火算法的基本步骤如下:

     用模拟退火算法求解TSP问题_第1张图片

用模拟退火算法求解TSP问题的MATLAB代码如下所示:

function [ E ] = Sum( C,X )
%UNTITLED2 此处显示有关此函数的摘要
%   此处显示详细说明
L = size(X);
E = 0;

for i = 1:L(1,2)-1
    E = E + sqrt((C(X(1,i),1)-C(X(1,i+1),1))*(C(X(1,i),1)-C(X(1,i+1),1))+(C(X(1,i),2)-C(X(1,i+1),2))*(C(X(1,i),2)-C(X(1,i+1),2)));
end
E = E + sqrt((C(X(1,1),1)-C(X(1,30),1))*(C(X(1,1),1)-C(X(1,30),1))+(C(X(1,1),2)-C(X(1,30),2))*(C(X(1,1),2)-C(X(1,30),2)));
end

clc,clear
load('City.mat');

Loop = 1000;
alpha = 0.9;
tf = 0.0001;

X = zeros(1,30);
for i = 1:30
    X(1,i) = i;
end

%scatter(City(:,1),City(:,2),'p')
%hold on;

sumarray = zeros(1,Loop);
sumarrayx = zeros(1,Loop);

T = 10000;
for i = 1:Loop
    if T30
            index1 = round(30*rand);
        end
        while index2<1 || index2>30
            index2 = round(30*rand);
        end
        Y = X;
        Y(1,index1) = X(1,index2);
        Y(1,index2) = X(1,index1);
        dsum = Sum(City,Y)-Sum(City,X);
        if dsum<0
            X = Y;
        else
            accept = rand;
            if accept < exp(-dsum/(k*T))
                X = Y;
            end
        end       
    end
    T = T*alpha;
    sumarray(1,i) = Sum(City,X);
    sumarrayx(1,i) = i;
end
%scatter(sumarrayx(1,1:i),sumarray(1,1:i))
scatter(City(:,1),City(:,2),'p')
hold on;
for i = 1:29
    line([City(X(1,i),1) City(X(1,i+1),1)],[City(X(1,i),2) City(X(1,i+1),2)])
    hold on;
end
line([City(X(1,1),1) City(X(1,30),1)],[City(X(1,1),2) City(X(1,30),2)])
hold on;
Sum(City,X)

所用的数据散点图(共有30个城市)如下所示

用模拟退火算法求解TSP问题_第2张图片

迭代100次效果如下所示

用模拟退火算法求解TSP问题_第3张图片

迭代200次结果如下所示

用模拟退火算法求解TSP问题_第4张图片

迭代1000次结果如下

用模拟退火算法求解TSP问题_第5张图片

路径和随迭代次数的变化如下所示

用模拟退火算法求解TSP问题_第6张图片


参考资料:《模拟退火算法》(PPT)卿  铭

你可能感兴趣的:(机器学习与人工智能,模拟退火算法,TSP,MATLAB,智能算法,旅行商问题)