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

     模拟退火算法是一种基于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)));
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 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;
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个城市)如下所示


迭代100次效果如下所示


迭代200次结果如下所示


迭代1000次结果如下


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



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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值