http://www.cnblogs.com/tiandsp/archive/2013/07/02/3167785.html

拟退火首先从某个初始候选解开始,当温度大于0时执行循环。

在循环中,通过随机扰动产生一个新的解,然后求得新解和原解之间的能量差,如果差小于0,则采用新解作为当前解。

如果差大于0,则采用一个当前温度与能量差成比例的概率来选择是否接受新解。温度越低,接受的概率越小,差值越大,同样接受概率越小。

是否接受的概率用此公式计算:p=exp(-ΔE/T)。这里ΔE为新解与原解的差,T为当前的温度。

由于温度随迭代次数逐渐降低,因此获得一个较差的解的概率较小。

典型的模拟退火算法还使用了蒙特卡洛循环,在温度降低之前,通过多次迭代来找到当前温度下比较好的解。

这里使用模拟退火解旅行商问题,因为这个问题本身是一个NP难问题,所以也就求不到最优解,不过应该可以求得一个比较好的解,然后再手工优化。

具体到程序中,这里的随机扰动就是随机置换两个城市的位置,能量就是旅行商路线的总长度。

算法结果如下:

初始旅行商路线:

最终求得的旅行商路线:

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

matlab代码如下:

main.m

clear all;close all;clcn=20;                   %城市个数
temperature=100*n;      %初始温度
iter=100;               %内部蒙特卡洛循环迭代次数%随机初始化城市坐标
city=struct([]);
for i=1:ncity(i).x=floor(1+100*rand()); city(i).y=floor(1+100*rand());
endl=1;                            %统计迭代次数
len(l)=computer_tour(city,n);   %每次迭代后的路线长度
netplot(city,n);                %初始旅行路线while temperature>0.001     %停止迭代温度for i=1: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<0        %新路线好于旧路线,用新路线代替旧路线city=tmp_city;else                        %温度越低,越不太可能接受新解;新老距离差值越大,越不太可能接受新解if exp(-delta_e/temperature)>rand() %以概率选择是否接受新解city=tmp_city;      %可能得到较差的解endend        endl=l+1;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=0;for i=1:n-1len=len+sqrt((city(i).x-city(i+1).x)^2+(city(i).y-city(i+1).y)^2);        endlen=len+sqrt((city(n).x-city(1).x)^2+(city(n).y-city(1).y)^2);
end

perturb_tour.m

function city=perturb_tour(city,n)  %随机置换两个不同的城市的坐标%产生随机扰动p1=floor(1+n*rand());p2=floor(1+n*rand());while p1==p2p1=floor(1+n*rand());p2=floor(1+n*rand());    endtmp=city(p1);city(p1)=city(p2);city(p2)=tmp;end

netplot.m

function netplot(city,n)        %连线各城市,将路线画出来hold on;for i=1:n-1plot(city(i).x,city(i).y,'r*');  line([city(i).x city(i+1).x],[city(i).y city(i+1).y]);  %只连线当前城市和下家城市     endplot(city(n).x,city(n).y,'r*');  line([city(n).x city(1).x],[city(n).y city(1).y]);     %最后一家城市连线第一家城市hold off;
end

matlab练习程序(模拟退火SA)相关推荐

  1. 爬山算法 ( Hill Climbing )/模拟退火(SA,Simulated Annealing)

    一. 爬山算法 ( Hill Climbing ) 爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解.爬山算法实现很简单,其主要缺点是 ...

  2. matlab多元回归程序,多元回归程序MATLAB程序

    <多元回归程序MATLAB程序>由会员分享,可在线阅读,更多相关<多元回归程序MATLAB程序(45页珍藏版)>请在人人文库网上搜索. 1.程序MATLAB多元回归程序matl ...

  3. 无源定位之时差估计的精确时差估计算法(ETDE)及MATLAB实现程序

    精确时差估计算法(ETDE)及MATLAB实现程序 算法原理 算法总结 性能分析 实验结果 算法原理 假设两接收站分别接收的带噪信号为 {x(kT)=s(kT)+ε1(kT)y(kT)=s(kT−D) ...

  4. matlab潮流程序,IEEE33节点matlab潮流程序.doc

    IEEE33节点matlab潮流程序 Bus [1,0,0 ; 2,100, 60; 3,90,40; 4,120,80; 5,60,30; 6,60,20; 7, 200, 100 ; 8,200, ...

  5. matlab有意思程序,matlab有意思的小程序

    10个C++趣味小程序,很有意思的.VIP专享文档 VIP专享文档是百度文库认... 现在很多人使用微信的时间已经非常长了,他们注册的微信号往上可能已经是5年前的事情了,正是由于不少使用者在这个过程当 ...

  6. matlab程序里nbus=x的意思,MATLAB潮流程序(IEEE14 直角坐标 牛拉法)

    MATLAB潮流程序(IEEE14 直角坐标牛拉法)clear baseMVA=100; %功率基值 %%读Data1中数据 load Data1.txt Bus=Data1(:,1); %节点号 V ...

  7. 怎样在matlab q-q图上读出斜率,Q分解法潮流计算matlab小程序

    <Q分解法潮流计算matlab小程序>由会员分享,可在线阅读,更多相关<Q分解法潮流计算matlab小程序(18页珍藏版)>请在人人文库网上搜索. 1.Q分解法潮流计算matl ...

  8. matlab期权风险评估算法,使用 MATLAB 应用程序根据期权价格估算风险中性密度 (risk-neutral density, RND)...

    我们为什么选择 MATLAB 我们决定创建 MATLAB 应用程序估算 RND,因为我们希望研究成果得到广泛应用,而不是仅限于在量化经济学领域或是熟悉 MATLAB 编程的和金融研究人员使用. 我们发 ...

  9. matlab密度特征,关于用MATLAB应用程序估算风险中性密度的性能分析和介绍

    由于场外期权合约的买卖在交易双方间私下进行而非通过公开市场,因而可能很难确定合约的价格有利于买方还是卖方.为对这些合约进行定价,金融分析师往往依据看涨期权或看跌期权价格估算出风险中性密度(RND)值. ...

  10. 10 竞争神经网络与SOM神经网络matlab参考程序

    %% I. 清空环境变量 clear all clc %% II. 训练集/测试集产生 %% % 1. 导入数据 load water_data.mat %% % 2. 数据归一化 attribute ...

最新文章

  1. 安装H3C的各种问题
  2. IIS基础:返回404错误页面的合理设置方式
  3. LOL手游最能混分的英雄,前期刷野靠队友,迪丽阿巴亲自教学
  4. Redis实现关注关系
  5. 在tsx中引入less会提示模块找不到,但是可以运行
  6. nginx 返回动态Html,Nginx负载均衡 -Nginx动态更新upstream
  7. [转]使用VS2010的Database 项目模板统一管理数据库对象
  8. @propertysource 读不到properties_敢不敢来挑战,读对一班就是学霸
  9. 3dsmax注册机不能用管理员身份运行的解决办法
  10. 网站页面底端“本站已经安全运行XX年XX天XX秒“代码
  11. 各种无线传输协议汇总(一)- Bluetooth
  12. 零基础带你玩转微信小程序--小程序的基础和安装
  13. R语言使用quantmod包的getSymbols函数从指定金融数据源获取指定时间段的股票数据、获取美国10年期债券收益率数据
  14. 网校装修,定义您的专属风格!
  15. 软件企业软件产品税收优惠政策
  16. 透明代理、匿名代理、混淆代理、高匿代理有什么区别?
  17. 芯片的IR drop是什么
  18. ABP继承自AbpController后路由无效
  19. 搭建CTF-AWD训练平台
  20. office2016每次弹激活_win10系统office2016激活后仍弹出激活怎么解决

热门文章

  1. 架构如何为业务和技术“服务”(2)
  2. C#的排序算法以及随机产生不重复数字的几个Demo
  3. SQL Server 2008的安装
  4. LINQ的ORM功能中对使用sp_executesql语句的存储过程的支持
  5. mysql硬盘复制无法启动_磁盘的移动导致MySQL数据启动失败
  6. 计算机网络网络层之路由算法
  7. Security+ 学习笔记20 身份证明
  8. AC内WLAN漫游配置实例
  9. C++ machine code与随机数 进阶习题
  10. 输入网址的时候,浏览器是如何判断你是http协议还是https协议的