用模拟退火算法求解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)卿 铭
阅读全文
0 0
- 用模拟退火算法求解TSP问题
- 模拟退火算法求解TSP问题
- 模拟退火算法求解TSP问题
- 模拟退火算法求解TSP问题
- 模拟退火算法求解TSP问题
- 模拟退火算法求解TSP问题
- 模拟退火算法求解TSP
- 模拟退火算法求解TSP问题--转载
- perl语言编写模拟退火算法 求解TSP问题
- 基于模拟退火算法求解TSP问题(JAVA)
- 利用模拟退火算法求解TSP问题(C++实现)
- 基于MATLAB的模拟退火算法求解TSP问题
- 模拟退火算法-TSP问题
- TSP问题的模拟退火算法
- 模拟退火算法解决TSP问题
- 模拟退火算法解决TSP问题
- 模拟退火算法解决TSP问题
- TSP问题之模拟退火算法
- py day04
- python 接口自动化测试--框架整改(五)
- java.lang.IndexOutOfBoundsException: No group 2
- 数据结构实验之串一
- C# 委托(Delegate)
- 用模拟退火算法求解TSP问题
- 判断二叉树是否是平衡树
- 01背包简讲(这个表很清晰)
- 素数判断的两种常用办法
- Android开发笔记: android实用6种特效总结
- eclipse导入IDEA java source 1.5中不支持diamond 运算符
- c#实验解答(2)
- include include_lib 的区别
- 【质因数分解 && n = x^p求最大p】LightOJ