matlab练习程序(模拟退火SA)
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)相关推荐
- 爬山算法 ( Hill Climbing )/模拟退火(SA,Simulated Annealing)
一. 爬山算法 ( Hill Climbing ) 爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解.爬山算法实现很简单,其主要缺点是 ...
- matlab多元回归程序,多元回归程序MATLAB程序
<多元回归程序MATLAB程序>由会员分享,可在线阅读,更多相关<多元回归程序MATLAB程序(45页珍藏版)>请在人人文库网上搜索. 1.程序MATLAB多元回归程序matl ...
- 无源定位之时差估计的精确时差估计算法(ETDE)及MATLAB实现程序
精确时差估计算法(ETDE)及MATLAB实现程序 算法原理 算法总结 性能分析 实验结果 算法原理 假设两接收站分别接收的带噪信号为 {x(kT)=s(kT)+ε1(kT)y(kT)=s(kT−D) ...
- 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, ...
- matlab有意思程序,matlab有意思的小程序
10个C++趣味小程序,很有意思的.VIP专享文档 VIP专享文档是百度文库认... 现在很多人使用微信的时间已经非常长了,他们注册的微信号往上可能已经是5年前的事情了,正是由于不少使用者在这个过程当 ...
- matlab程序里nbus=x的意思,MATLAB潮流程序(IEEE14 直角坐标 牛拉法)
MATLAB潮流程序(IEEE14 直角坐标牛拉法)clear baseMVA=100; %功率基值 %%读Data1中数据 load Data1.txt Bus=Data1(:,1); %节点号 V ...
- 怎样在matlab q-q图上读出斜率,Q分解法潮流计算matlab小程序
<Q分解法潮流计算matlab小程序>由会员分享,可在线阅读,更多相关<Q分解法潮流计算matlab小程序(18页珍藏版)>请在人人文库网上搜索. 1.Q分解法潮流计算matl ...
- matlab期权风险评估算法,使用 MATLAB 应用程序根据期权价格估算风险中性密度 (risk-neutral density, RND)...
我们为什么选择 MATLAB 我们决定创建 MATLAB 应用程序估算 RND,因为我们希望研究成果得到广泛应用,而不是仅限于在量化经济学领域或是熟悉 MATLAB 编程的和金融研究人员使用. 我们发 ...
- matlab密度特征,关于用MATLAB应用程序估算风险中性密度的性能分析和介绍
由于场外期权合约的买卖在交易双方间私下进行而非通过公开市场,因而可能很难确定合约的价格有利于买方还是卖方.为对这些合约进行定价,金融分析师往往依据看涨期权或看跌期权价格估算出风险中性密度(RND)值. ...
- 10 竞争神经网络与SOM神经网络matlab参考程序
%% I. 清空环境变量 clear all clc %% II. 训练集/测试集产生 %% % 1. 导入数据 load water_data.mat %% % 2. 数据归一化 attribute ...
最新文章
- 安装H3C的各种问题
- IIS基础:返回404错误页面的合理设置方式
- LOL手游最能混分的英雄,前期刷野靠队友,迪丽阿巴亲自教学
- Redis实现关注关系
- 在tsx中引入less会提示模块找不到,但是可以运行
- nginx 返回动态Html,Nginx负载均衡
-Nginx动态更新upstream
- [转]使用VS2010的Database 项目模板统一管理数据库对象
- @propertysource 读不到properties_敢不敢来挑战,读对一班就是学霸
- 3dsmax注册机不能用管理员身份运行的解决办法
- 网站页面底端“本站已经安全运行XX年XX天XX秒“代码
- 各种无线传输协议汇总(一)- Bluetooth
- 零基础带你玩转微信小程序--小程序的基础和安装
- R语言使用quantmod包的getSymbols函数从指定金融数据源获取指定时间段的股票数据、获取美国10年期债券收益率数据
- 网校装修,定义您的专属风格!
- 软件企业软件产品税收优惠政策
- 透明代理、匿名代理、混淆代理、高匿代理有什么区别?
- 芯片的IR drop是什么
- ABP继承自AbpController后路由无效
- 搭建CTF-AWD训练平台
- office2016每次弹激活_win10系统office2016激活后仍弹出激活怎么解决
热门文章
- 架构如何为业务和技术“服务”(2)
- C#的排序算法以及随机产生不重复数字的几个Demo
- SQL Server 2008的安装
- LINQ的ORM功能中对使用sp_executesql语句的存储过程的支持
- mysql硬盘复制无法启动_磁盘的移动导致MySQL数据启动失败
- 计算机网络网络层之路由算法
- Security+ 学习笔记20 身份证明
- AC内WLAN漫游配置实例
- C++ machine code与随机数 进阶习题
- 输入网址的时候,浏览器是如何判断你是http协议还是https协议的