Matlab随笔之模拟退火算法
问题描述:
我方有一个基地,经度和纬度为( 70,40)。假设我方飞机的速度为 1000 公里/小时。
我方派一架飞机从基地出发,侦察完敌方所有目标,再返回原来的基地。在敌方每一目
标点的侦察时间不计,求该架飞机所花费的时间(假设我方飞机巡航时间可以充分长)。
这是一个旅行商问题。我们依次给基地编号为 1,敌方目标依次编号为 2, 3,…,
101, 最后我方基地再重复编号为 102(这样便于程序中计算)。 距离矩阵 D = ( dij )102×102 ,
其中
dij 表示表示 i, j 两点的距离, i, j = 1,2,L ,102 ,这里 D 为实对称矩阵。则问题是
求一个从点 1 出发,走遍所有中间点,到达点 102 的一个最短路径。
算法如下:
- %模拟退火算法之旅行商算法
- %ij.txt存放的是各点经纬度
- clc;clear
- load ij.txt;%加载目标数据ij.txt存放25x8矩阵
- x=ij(:,1:2:8);%x为25x4矩阵
- x=x(:);%x化为10x1矩阵
- y=ij(:,2:2:8);%y为25x4矩阵
- y=y(:);%y化为100x1矩阵
- sj=[x y];%100x2矩阵
- d1=[70,40];%起始点
- sj=[d1;sj;d1];%首尾添加上出发点和终点
- sj=sj*pi/180;%角度化为弧度
- %计算距离
- d=zeros(102);%先建一个102x102的空的距离矩阵,再把对应距离填进去
- %A(R cos x1 cos y1 , R sin x1 cos y1 , R sin y1 )
- %B(R cos x2 cos y2 , R sin x2 cos y2 , R sin y2 )
- %其中 R = 6370 为地球半径。
- %A, B 两点的实际距离:
- %d = R arccos[cos(x1 − x2 ) cos y1 cos y2 + sin y1 sin y2 ]
- for i=1:101
- for j=i+1:102
- d(i,j)=6370*acos(cos(sj(i,1)-sj(j,1))*cos(sj(i,2))*cos(sj(j,2))...
- +sin(sj(i,2))*sin(sj(j,2)));
- end
- end
- %上述的d为上三角矩阵,根据对称性,化为对称矩阵,d矩阵包含各点间的距离信息
- d=d+d';
- S0=[];
- Sum=inf;
- rand('state',sum(clock));%作用是定义一个随时间变化的初值
- %matlab里面的随机生成函数基本都是以rand为基函数通过函数关系式得到,
- %比如 normrnd,unidrnd等,你每次重启matlab后运行已编好的含随机数生成的函数你将得到相同的结果,
- %比如我的电脑上重启matlab运行unidrnd(100),每次的值都是82,这是因为rand函数的初值都一样,
- %所以为了避免上述问题经常在程序前运行或加命令rand('state',sum(clock)),这样重启matlab,运行随机数生成值就不同了。
- for i=1:1000%循环1000次,尽可能让所有排序情况都出现一遍
- s=[1,1+randperm(100),102];%s为中间2到101的排列组合
- temp=0;
- for j=1:101
- temp=temp+d(s(j),s(j+1));
- end
- if temp<Sum
- Sum=temp;
- S0=s;%保存当前最小值的排序情况
- end
- end
- e=0.1^30;%选定的终止温度 e = 10 −30 ,判断退火过程是否结束
- at=0.999;%选定的降温系数α进行降温即:T =αT
- L=20000;
- T=1;
- %退火过程
- for k=1:L
- c=2+floor(100*rand(1,2));%floor函数其功能是“向下取整”,或者说“向下舍入”,即取不大于x的最大整数
- %ceil函数向上取整
- c=sort(c);% [a,b]=sort(X)是按列从小到大排序,而 [a,b]=sort(X,2)是按行,b为排序情况
- c1=c(1);c2=c(2);
- %计算代价函数值
- df=d(S0(c1-1),S0(c2))+d(S0(c1),S0(c2+1))-d(S0(c1-1),S0(c1))-d(S0(c2),S0(c2+1));
- if df<0%接受准则
- S0=[S0(1:c1-1),S0(c2:-1:c1),S0(c2+1:102)];
- Sum=Sum+df;
- elseif exp(-df/T)>rand(1)%以概率exp(−df/T)接受新的路径%注意时elseif而不是else if
- S0=[S0(1:c1-1),S0(c2:-1:c1),S0(c2+1:102)];
- Sum=Sum+df;
- end;
- T=T*at;%退火
- if T<e%达到终止温度
- break;
- end;
- end;
- %输出路径和路径长度
- S0,Sum
- %画出其中一个巡航路径
- plot(sj(S0,1)/pi*180,sj(S0,2)/pi*180);
- hold on
- plot(sj(S0,1)/pi*180,sj(S0,2)/pi*180,'rx');
- axis([-5,75,-5,45]);
运行结果:
附录:(ij.txt文档内容)
- 53.7121 15.3046 51.1758 0.0322 46.3253 28.2753 30.3313 6.9348
- 56.5432 21.4188 10.8198 16.2529 22.7891 23.1045 10.1584 12.4819
- 20.1050 15.4562 1.9451 0.2057 26.4951 22.1221 31.4847 8.9640
- 26.2418 18.1760 44.0356 13.5401 28.9836 25.9879 38.4722 20.1731
- 28.2694 29.0011 32.1910 5.8699 36.4863 29.7284 0.9718 28.1477
- 8.9586 24.6635 16.5618 23.6143 10.5597 15.1178 50.2111 10.2944
- 8.1519 9.5325 22.1075 18.5569 0.1215 18.8726 48.2077 16.8889
- 31.9499 17.6309 0.7732 0.4656 47.4134 23.7783 41.8671 3.5667
- 43.5474 3.9061 53.3524 26.7256 30.8165 13.4595 27.7133 5.0706
- 23.9222 7.6306 51.9612 22.8511 12.7938 15.7307 4.9568 8.3669
- 21.5051 24.0909 15.2548 27.2111 6.2070 5.1442 49.2430 16.7044
- 17.1168 20.0354 34.1688 22.7571 9.4402 3.9200 11.5812 14.5677
- 52.1181 0.4088 9.5559 11.4219 24.4509 6.5634 26.7213 28.5667
- 37.5848 16.8474 35.6619 9.9333 24.4654 3.1644 0.7775 6.9576
- 14.4703 13.6368 19.8660 15.1224 3.1616 4.2428 18.5245 14.3598
- 58.6849 27.1485 39.5168 16.9371 56.5089 13.7090 52.5211 15.7957
- 38.4300 8.4648 51.8181 23.0159 8.9983 23.6440 50.1156 23.7816
- 13.7909 1.9510 34.0574 23.3960 23.0624 8.4319 19.9857 5.7902
- 40.8801 14.2978 58.8289 14.5229 18.6635 6.7436 52.8423 27.2880
- 39.9494 29.5114 47.5099 24.0664 10.1121 27.2662 28.7812 27.6659
- 8.0831 27.6705 9.1556 14.1304 53.7989 0.2199 33.6490 0.3980
- 1.3496 16.8359 49.9816 6.0828 19.3635 17.6622 36.9545 23.0265
- 15.7320 19.5697 11.5118 17.3884 44.0398 16.2635 39.7139 28.4203
- 6.9909 23.1804 38.3392 19.9950 24.6543 19.6057 36.9980 24.3992
- 4.1591 3.1853 40.1400 20.3030 23.9876 9.4030 41.1084 27.7149
Matlab随笔之模拟退火算法的更多相关文章
- 模拟退火算法(SA)求解TSP 问题(C语言实现)
这篇文章是之前写的智能算法(遗传算法(GA).粒子群算法(PSO))的补充.其实代码我老早之前就写完了,今天恰好重新翻到了,就拿出来给大家分享一下,也当是回顾与总结了. 首先介绍一下模拟退火算法(SA ...
- 模拟退火算法Python编程(2)约束条件的处理
1.最优化与线性规划 最优化问题的三要素是决策变量.目标函数和约束条件. 线性规划(Linear programming),是研究线性约束条件下线性目标函数的极值问题的优化方法,常用于解决利用现有的资 ...
- 模拟退火算法Python编程(3)整数规划问题
1.整数规划问题 整数规划问题在工业.经济.国防.医疗等各行各业应用十分广泛,是指规划中的变量(全部或部分)限制为整数,属于离散优化问题(Discrete Optimization). 线性规划问题的 ...
- 模拟退火算法-[HDU1109]
模拟退火算法的原理模拟退火算法来源于固体退火原理,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到 ...
- 非刚性图像配准 matlab简单示例 demons算法
2011-05-25 17:21 非刚性图像配准 matlab简单示例 demons算法, % Clean clc; clear all; close all; % Compile the mex f ...
- 【高级算法】模拟退火算法解决3SAT问题(C++实现)
转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46453761 ---------------------------------- ...
- 原创:工作指派问题解决方案---模拟退火算法C实现
本文忽略了对于模拟退火的算法的理论讲解,读者可参考相关的博文或者其他相关资料,本文着重于算法的实现: /************************************************ ...
- 基于MATLAB的人脸识别算法的研究
基于MATLAB的人脸识别算法的研究 作者:lee神 现如今机器视觉越来越盛行,从智能交通系统的车辆识别,车牌识别到交通标牌的识别:从智能手机的人脸识别的性别识别:如今无人驾驶汽车更是应用了大量的机器 ...
- BZOJ 3680: 吊打XXX【模拟退火算法裸题学习,爬山算法学习】
3680: 吊打XXX Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 3192 Solved: 1198[Sub ...
随机推荐
- Havel-Hakimi定理 hdu2454 / poj1695 Havel-Hakimi定理
Havel-Hakimi定理 当年一度热门出如今ACM赛场上的算法. 算法定义: Havel-Hakimi定理主要用来判定一个给定的序列是否是可图的. 2.首先介绍一下度序列:若把图 G 全部顶点的度 ...
- [E2E] Robot Framework introduction
We will use demo project as an example, go though QuickStart repo. Install: First you should have py ...
- HOOK API入门之Hook自己程序的MessageBoxW(简单入门)
说到HOOK,我看了很多的资料和教程,无奈就是学不会HOOK,不懂是我的理解能力差,还是你们说的 不够明白,直到我看了以下这篇文章,终于学会了HOOK: http://blog.sina.com.cn ...
- 【U218】A-B
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 给出一个A/B-C/D表示的分数减法算式,A,B,C,D均为不超过32767的正整数,求A/B-C/D ...
- source insight 添加自定义macro
打开C:\Documents and Settings\xxxx\My Documents\Source Insight\Projects\Base文件夹下的em文件,可以看到都是由macro定义的一 ...
- EM12C 安装及卸载 注意点整理
版本号: em12c 12.1.0.4 OS : redhat 5.7 x86_64bit (CentOS6.2,測试过,当时因glibc*.i686包安装一直报错.所以放弃了) ...
- 【codeforces 752F】Santa Clauses and a Soccer Championship
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【hdu 2177】取(2堆)石子游戏
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...
- 三星语音AI助理背后的华人身影—73岁科技人三度创业成功(孙子兵法:道、天、地、将、法)
我绝对不当老二,也不当老大,我要当霸主!”说这句话的是富迪科技董事长黄炎松.他还把“独霸”当作公司愿景宣言,大剌剌的放在美国总公司进门最显眼的墙上. 集微网消息,据台湾商业周刊报道,黄炎松,是台湾 ...
- echarts改变颜色属性的demo
一:柱状图改变颜色 图片.png 代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8&qu ...