matlab练习程序(模拟退火SA)
模拟退火首先从某个初始候选解开始,当温度大于0时执行循环。
在循环中,通过随机扰动产生一个新的解,然后求得新解和原解之间的能量差,如果差小于0,则采用新解作为当前解。
如果差大于0,则采用一个当前温度与能量差成比例的概率来选择是否接受新解。温度越低,接受的概率越小,差值越大,同样接受概率越小。
是否接受的概率用此公式计算:p=exp(-ΔE/T)。这里ΔE为新解与原解的差,T为当前的温度。
由于温度随迭代次数逐渐降低,因此获得一个较差的解的概率较小。
典型的模拟退火算法还使用了蒙特卡洛循环,在温度降低之前,通过多次迭代来找到当前温度下比较好的解。
这里使用模拟退火解旅行商问题,因为这个问题本身是一个NP难问题,所以也就求不到最优解,不过应该可以求得一个比较好的解,然后再手工优化。
具体到程序中,这里的随机扰动就是随机置换两个城市的位置,能量就是旅行商路线的总长度。
算法结果如下:
初始旅行商路线:

最终求得的旅行商路线:

每次迭代求得的旅行距离:

matlab代码如下:
main.m
clear all;close all;clc n=; %城市个数
temperature=*n; %初始温度
iter=; %内部蒙特卡洛循环迭代次数 %随机初始化城市坐标
city=struct([]);
for i=:n
city(i).x=floor(+*rand());
city(i).y=floor(+*rand());
end l=; %统计迭代次数
len(l)=computer_tour(city,n); %每次迭代后的路线长度
netplot(city,n); %初始旅行路线 while temperature>0.001 %停止迭代温度 for i=:iter %多次迭代扰动,一种蒙特卡洛方法,温度降低之前多次实验
len1=computer_tour(city,n); %计算原路线总距离
tmp_city=perturb_tour(city,n); %产生随机扰动
len2=computer_tour(tmp_city,n); %计算新路线总距离 delta_e=len2-len1; %新老距离的差值,相当于能量
if delta_e< %新路线好于旧路线,用新路线代替旧路线
city=tmp_city;
else %温度越低,越不太可能接受新解;新老距离差值越大,越不太可能接受新解
if exp(-delta_e/temperature)>rand() %以概率选择是否接受新解
city=tmp_city; %可能得到较差的解
end
end
end
l=l+;
len(l)=computer_tour(city,n); %计算新路线距离
temperature=temperature*0.99; %温度不断下降 end
figure;
netplot(city,n); %最终旅行路线 figure;
plot(len)
computer_tour.m
function len=computer_tour(city,n) %计算路线总长度,每个城市只计算和下家城市之间的距离。
len=;
for i=:n-
len=len+sqrt((city(i).x-city(i+).x)^+(city(i).y-city(i+).y)^);
end
len=len+sqrt((city(n).x-city().x)^+(city(n).y-city().y)^);
end
perturb_tour.m
function city=perturb_tour(city,n)
%随机置换两个不同的城市的坐标
%产生随机扰动
p1=floor(+n*rand());
p2=floor(+n*rand());
while p1==p2
p1=floor(+n*rand());
p2=floor(+n*rand());
end
tmp=city(p1);
city(p1)=city(p2);
city(p2)=tmp;
end
netplot.m
function netplot(city,n) %连线各城市,将路线画出来
hold on;
for i=:n-
plot(city(i).x,city(i).y,'r*');
line([city(i).x city(i+).x],[city(i).y city(i+).y]); %只连线当前城市和下家城市
end plot(city(n).x,city(n).y,'r*');
line([city(n).x city().x],[city(n).y city().y]); %最后一家城市连线第一家城市
hold off;
end
matlab练习程序(模拟退火SA)的更多相关文章
- matlab练习程序(SUSAN检测)
matlab练习程序(SUSAN检测) SUSAN算子既可以检测角点也可以检测边缘,不过角点似乎比不过harris,边缘似乎比不过Canny.不过思想还是有点意思的. 主要思想就是:首先做一个和原图像 ...
- (转)matlab练习程序(HOG方向梯度直方图)
matlab练习程序(HOG方向梯度直方图)http://www.cnblogs.com/tiandsp/archive/2013/05/24/3097503.html HOG(Histogram o ...
- 【智能算法】用模拟退火(SA, Simulated Annealing)算法解决旅行商问题 (TSP, Traveling Salesman Problem)
喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 文章声明 此文章部分资料和代码整合自网上,来源太多已经无法查明出处,如侵犯您的权利,请联系我删除. 01 什么是旅行商问题(TS ...
- Matlab随笔之模拟退火算法
问题描述: 我方有一个基地,经度和纬度为( 70,40).假设我方飞机的速度为 1000 公里/小时. 我方派一架飞机从基地出发,侦察完敌方所有目标,再返回原来的基地.在敌方每一目 标点的侦察时间不计 ...
- matlab示例程序--Motion-Based Multiple Object Tracking--卡尔曼多目标跟踪程序--解读
静止背景下的卡尔曼多目标跟踪 最近学习了一下多目标跟踪,看了看MathWorks的关于Motion-Based Multiple Object Tracking的Documention. 官网链接:h ...
- matlab练习程序(透视投影,把lena贴到billboard上)
本练习程序是受到了这个老外博文的启发,感觉挺有意思,就尝试了一下.他用的是opencv,我这里用的是matlab. 过去写过透视投影,当时是用来做倾斜校正的,这次同样用到了透视投影,不过更有意思,是将 ...
- matlab练习程序(多圆交点)
最近总是对计算几何方面的程序比较感兴趣. 多圆求交点,要先对圆两两求交点. 有交点的圆分为相切圆和相交圆. 相切圆求法: 1.根据两圆心求直线 2.求公共弦直线方程 3.求两直线交点即两圆切点. 相交 ...
- matlab练习程序(矩形变换为单连通形状)
变换使用的模板必须是单连通的,而且模板中心必须在模板内,如果在模板中打个结或是月牙形,这里的程序就处理不了了. 虽然非单连通模板也有办法处理,不过不是这里要讨论的. 这里用到的方法和矩形变换为圆那片文 ...
- matlab练习程序(渲染三原色)
这里我用的空间是x向右为正,y向下为正,z向屏幕里面为正.相当于标准右手系绕x轴旋转了180度. 将三个点光源放在 r = [0.3,0,0.5];g = [0.3,-0.5*cos(pi/6),-0 ...
随机推荐
- Hibernate学习笔记(四)—— 表与表的关系
一.一对多|多对一 1.1 关系表达 1.1.1 表中的表达 建表原则:在多的一方创建外键指向一的一方的主键. 1.1.2 实体中的表达 [客户实体] public class Customer { ...
- COCI2017-2018#3 Dojave || 洛谷P4443
题目传送门............................................................................................... ...
- QDU_组队训练(ABEFGHKL)
A - Accurately Say "CocaCola"! In a party held by CocaCola company, several students stand ...
- ansys14.0 从入门到精通
凌桂龙 李战分 2013.2 清华大学 FLUENT流体计算应用教程 索书号:TB126-39 ZW2.1 单元 结点 和 自由度 载荷 与 边界条件 : 关系 就是约束 , 边界条件是 结构 ...
- sublim text3中的一些设置
{ "dictionary": "Packages/Language - English/en_US.dic", "font_face&q ...
- session.flush()与session.clear()的区别及使用环境
[From] http://blog.csdn.net/leidengyan/article/details/7514484 首先session是有一级缓存的,目的是为了减少查询数据库的时间,提高效率 ...
- 牛客小白月赛5 I - 区间
看到一份不错的操作..... 链接:https://www.nowcoder.com/acm/contest/135/I 来源:牛客网 Apojacsleam喜欢数组. 他现在有一个n个元素的数组a, ...
- WPF 使用第三方ttf字体
1.将字体文件直接添加到项目中,注意:将文件的“属性”--“生成操作”设置为“Resource” 2.在Xaml中使用,text可以使用文字或直接使用unicode编码,XAML中使用Unicode编 ...
- 97 条 Linux 运维工程师常用命令总结[转]
1.ls [选项] [目录名 | 列出相关目录下的所有目录和文件 -a 列出包括.a开头的隐藏文件的所有文件 -A 通-a,但不列出"."和".." -l 列出 ...
- OSG DB的插件地址设置
今天搞了一整天OSG,结果每次都说could not find plugin,就是说找不到OSG的插件去加载文件,我大概看了下OSG的插件机制,发现他是用插件的形式下去读取文件的 http://blo ...