模拟退火算法
定义
模拟退火算法(Simulated Annealing,SA)是一种模拟物理退火过程而设计的优化算法。
什么用
求解TSP问题(旅行商问题)、求最值、全局优化、生产调度、控制工程、机器学习、信号处理等问题。
大规模的,复杂的组合优化问题,而整数0-1规划用小规模,整数的
算法讲解
也是贪心算法,但是在其过程中引入了随机因素,以一定的概率接受一个比当前解要差的解。
模拟退火算法在某一初温下,伴随温数的不断下降,结合概率突跳特性在解空间中随机寻找目标函数的全局最优解。即在局部最优解的空间内能概率性地跳出并最终趋于全局最优。不再局限于局部最优
步骤
参数
- 控制温度参数的初值T_0
- 控制温度T的衰减函数(温度的更新)
- 马尔科夫链的的长度 (迭代次数)
- 控制参数T的终值(停止准则)
例题
TSP问题例题一:一位旅行者从一出发点出发,要求经过31个城市(目标点的坐标已给出),并且每个点只能经过一次,最终经过所有点后回到起点。 要求:为旅行者制定一条最短路径。
tic; %时间
%清理工作
clear;
close;
clc;
C=[1304 2312; % 城市坐标 最后要画图的,必须保留
3639 1315;
4177 2244;
3712 1399;
3488 1535;
3326 1556;
3238 1229;
4196 1044;
4312 790;
4386 570;
3007 1970;
2562 1756;
2788 1491;
2381 1676;
1332 695;
3715 1678;
3918 2179;
4061 2370;
3780 2212;
3676 2578;
4029 2838;
4263 2931;
3429 1980;
3507 2376;
3394 2643;
3439 3201;
2935 3240;
3140 3550;
2545 2357;
2778 2826;
2370 2975];
n=size(C,1);%求问题规模 城市数量
T=1000; %初始温度
L=100; %马尔科夫链长度
K=0.99; %迭代衰减参数
city=struct([]); %矩阵型数据不支持点索引,不能直接引用,借助结构体数据来使用,类似字典
for i=1:n
city(i).x=C(i,1);
city(i).y=C(i,2);
end
l=1; %第一次迭代
len(l)=func_1(city,n); %每次迭代路线长度
while T>0.01 %结束时温度
for i=1:L
len1=func_1(city,n);
p1=floor(1+n*rand());
p2=floor(1+n*rand());
while p1==p2
p1=floor(1+n*rand());
p2=floor(1+n*rand());
end
tmp_c=city;
tmp=tmp_c(p1);
tmp_c(p1)=tmp_c(p2);
tmp_c(p2)=tmp;
len2=func_1(tmp_c,n);
delta= len2-len1;
if delta<0
city=tmp_c;
else
if exp(-delta/T)>rand()
city=tmp_c;
end
end
end
l=l+1;
len(l)=func(city,n);
T=T*K;
end
figure(1);
for i=1:n-1
plot([city(i).x,city(i+1).x],[city(i).y,city(i+1).y],'bo-');
hold on;
end
plot([city(n).x,city(1).x],[city(n).y,city(1).y],'ro-');
title(['优化最短距离:',num2str(len(l))]);
hold off; %画下一张图
figure(2);
plot(len);
xlabel('迭代次数');
ylabel('目标函数值');
title('路径长变化曲线');
toc;
规划路线
路径长变化曲线