模拟退火算法2(实例分析)--Matlab算法

模拟退火算法2(实例分析)--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 (5)按一定方式降温,使T≤Ti, 如: =αTi,习惯上取α∈(0.8,0.9999)
(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





你可能感兴趣的:(MTALAB,算法)