模拟退火算法(实例分析)–Matlab算法
此篇文章为我一学长(Hong Yilin)所作,我又进行了一些加工,在此只为学习使用。
此篇为模拟退火算法的实例分析,模拟退火算法的理论讲解见上一篇。
题目:我方有一个基地,经度和纬度为(70,40)。假设我方飞机的速度为 1000 公里/小时。
我方派一架飞机从基地出发,侦察完敌方所有目标,再返回原来的基地。在敌方每一目标点的侦察时间不计,
求该架飞机所花费的时间(假设我方飞机巡航时间可以充分长)。
敌方经度纬度如下:
表1 敌方100城市经纬度
经度 纬度 经度 纬度 经度 纬度 经度 纬度
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
分析:
1.实际距离的求解:
设A, B两点的地理坐标分别为(x1,y1), (x2,y2),过 A, B两点的大圆的劣弧长即为两点的实际距离。
以地心为坐标原点o,以赤道平面为XOY平面,以0度经线圈所在的平面为XOZ平面建立三维直角坐标系。
地球半径为R=6370km。则 A, B两点的直角坐标分别为:
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) )
A、B两点实际距离:
d=Rarccos[ cos(x1-x2)*cos(y1)*cos(y2) + sin(y1)*sin(y2) ]。
建立矩阵D,将所有点之间的距离存放进去。
问题转化为从(70,40)出发,走遍所有点,并返回出发点。
2.关于Monte Carlo方法
本文中使用Monte Carlo方法先得到一个较小的sum,和一组S0。
3.算法原理:
设S={s1,s2,…,sn}为所有可能的状态所构成的集合, f:S—R为非负代价函数,
即优化问题抽象如下:寻找s*∈S,使得f(s*)=min f(si) 任意si∈S
具体步骤:
(1)给定一较高初始温度T,随机产生初始状态S
(2)按一定方式,对当前状态作随机扰动,产生一个新的状态S’
S’=S+sign(η).δ (其中δ为给定的步长, η为[-1,1]的随机数 )
计算Δ=f(S’)-f(S)
(3)若Δ<0,则令S=S’,转第(5)步
(4)若Δ≤0,则以概率exp(-Δ/T)接受S’,即S=S’
具体操作:产生一个在[0,1]上服从均匀分布的随机数x,若x
(6)检查退火是否结束
是——转向第(7)步
否——转向第(2)步
(7)以当前Si作为最优解输出
注:1、结束标志:温度是否小于某一阀值(循环次数)f的值变化是否明显
2、初始温度的高低:下降是否充分慢对结果有影响
4.算法详述:
首先给定一个初始温度TO 和该优化问题的一个初始解 x(0),并由 x(0)生成下一个解 x’∈ N(x(0)),是否接受x’作为一个新解x(1)依赖于下面概率:
换句话说,如果生成的解 的函数值比前一个解的函数值更小,则接受x(1)=x ‘作为一个新解。否则以概率作为一个新解。
以此类推,在温度T_i下,经过很多次的转移之后,降低温度T_i,得到T(i+1)
在得到初始解之后,可以用2变换法,即交换两个点之间的路线。设定T0为1,以0.001为降温幅度,选择终止温度为e=10-30。运行代码,得到可行解,时间为43小时左右
算法:
function Simulated_AnneALIng()
%算法:模拟退火算法(Simulated AnneALIng)
%敌方经度纬度数据见 sj.txt
%% 清空
clc,clear;
%% 坐标转换,计算距离
load sj.txt %加载敌方100个目标的数据,数据按照表格中的位置保存在纯文本文件 sj.txt 中
x=sj(:,1:2:8) ; x=x(:);%将4列变成1列
y=sj(:,2:2:8) ; y=y(:);
sj=[x y];
d1=[70,40] ; sj=[d1;sj;d1] ;
sj1=sj;
sj=sj*pi/180;
n=length(sj);
d=zeros(n); %距离矩阵 d
for i=1:n-1 %坐标转换为距离
for j=i+1:n
temp=cos(sj(i,1)-sj(j,1))*cos(sj(i,2))*cos(sj(j,2))+sin(sj(i,2))*sin(sj(j,2));
d(i,j)=6370*acos(temp);
end
end
d=d+d' ; S0=[] ; Sum=inf;
%% 设定初始解(MonteCarlo法)
for j=1:1000
S=[1,1+randperm(n-2),n]; temp=0; %用randperm函数随机打乱2到(n-2)之间的数
for i=1:n-1
temp=temp+d(S(i),S(i+1));
end
if temprand(1) %路径没变短,以一定概率接受新解
S0=[S0(1:c1-1),S0(c2:-1:c1),S0(c2+1:n)];
Sum=Sum+df ; T=T*at;
end
if T