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

来源:互联网 发布:中文域名网站 编辑:程序博客网 时间:2024/06/04 18:16

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

      模拟退火算法的基本思想是:在一定温度下,搜索从一个状态随机地变化到另一个状态;随着温度的不断下降直到最低温度,搜索过程以概率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)));endE = 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,clearload('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 T<tf        break    end    for k = 1:2000        index1 = 0;        index2 = 0;        while index1<1 || index1>30            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;endline([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个城市)如下所示


迭代100次效果如下所示


迭代200次结果如下所示


迭代1000次结果如下


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



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

原创粉丝点击