模拟退火算法(SA)

一、算法简介

模拟退火算法(SA)

一种模拟物理退火过程而设计的优化算法
初始处于一个高温状态下,然后逐渐退火,在每个温度下慢慢冷却,最终达到物理基态(相当于算法找到最优解)
求解TSP问题(旅行商问题)、最值问题、全局优化、生产调度、控制工程、机器学习、信号处理等

爬山算法(贪心算法):对问题求解时,总是做出当前看起来是最好的选择,不考虑整体最优,得到的一般是局部最优解。
模拟退火算法:也是贪心算法,但是在其过程中引入了随机因素,以一定的概率接受一个比当前解还要的解。
模拟退火算法在某一初温下,伴随温数的不断下降,结合概率突跳特性在解空间中随机寻找目标函数的全局最优解。即:在局部最优解的空间内能概率性地调处并最终区域全局最优。
概率突跳特性:不再局限于局部最优

二、算法流程

1. 设定当前解(即为当前最优解):令 T=T0 ,即开始退火的初始温度,随机生成一个初始解x0,并计算相应的目标函数值E(x0)
2. 产生新解与当前解的差值:根据当前解xi进行扰动,产生一个新解xj,计算相应的目标函数值E(xj),得到△E=E(xj) - E(xi)
3.判断新解是否被接受:若△E<0,则新解xj被接受;若△E>0,则新解xj按如下概率被接受。Ti 是当前温度。

请添加图片描述

4. 当新解被接受时:新解xj被当做当前解
5. 循环以上四个步骤:在温度Ti下,重复k次的扰动和接受过程,接着执行下一步骤
6. 最后找到全局最优解:判断T是否已经达到终止温度Tf ,若是,则终止算法;若否,则转到循环步骤继续执行。

三、算法流程图

求解最小值

请添加图片描述

1. metropolis 准则:
在某个温度下,固体分子从一个状态转移到另一个状态时,如果新状态的内能小,则无条件接受;若新状态的内能大,则以一定的概率接受它。

请添加图片描述

if △E<0 :    
	xi=xj;
elif exp(-△E/T)>rand() :  #按概率接受
	xi=xj;
2. 马尔科夫链的长度Lk:任意温度的迭代次数
算法在Lk内持续进行“产生新解–判断–接受/舍弃”的迭代过程,对应着固体在某一恒定温度下趋于热平衡的过程。一般选取Lk=100N,N为问题的规模。
3. 控制参数T的终止值 Tf (停止准则)
最终温度通常是0,但会消耗许多模拟时间。温度趋近于0,其周围状态几乎一样。所以寻找一个低到可接受的温度即可(T>0.001)。
4. 控制温度T的衰减函数
不同退火方法的温度下降速度是不一样的,其中指数降温是最常用的一种退火策略,其温度变化很有规律,直接与参数相关,是研究的主要对象。
衰减函数:t(k+1) = αt(k) k = 0,1,2…
其中α是一个接近1的常数,一般取 0.5 ~ 0.99
该衰减函数对控制参数的衰减量是随算法进程递减的。

四、模拟算法优缺点

优点:高效地求解NP完全问题(多项式复杂程度的非确定性问题),如TSP问题、0-1背包问题等。编程工作量小,易于实现。
缺点:使用不当,可能会陷入局部最优。参数难以控制,所得结果可能为接近最优解但并非最优解。

五、例题

TSP问题

一位旅行者从一个出发点出发,要求经过31个城市(目标点的坐标已经给出),并且每个点只能经过一次,最终经过所有点后回到起点。要求:为旅行者制定一条最短路径。

matlab算法

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 ];   % 31个城市的坐标
n=size(C,1);     %TSP问题规模,即城市数目
T=1000;  %初始温度
L=100; %马尔科夫链长度
K=0.99; %衰减参数
%%%%%%%%%%%%%城市坐标结构体%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
city=struck([]); %结构体变量,类似于Python中的
for i=1:n
	city(i).x = C(i,1);
	city(i).y = C(i,2);
end       %city(i) 的值为第i座城市的坐标
l=1;   %统计迭代次数
len(1) = func3(city , n);   %每次迭代后的路线长度
while T>0.001   %0.001为终止温度
%%%%%%%%%多次迭代扰动,温度降低之前多次试验%%%%%%%%%%%%
	for i=1:L
	%%%%%%%%%%%%%计算原路线总距离%%%%%%%%%%%%%%%%
		len1=func3(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_city=city;
		tmp=tmp_city(p1);
		tmp_city(p1)=tmp_city(p2);
		tmp_city(p2)=tmp;
		%%%%%%%%%%%%计算新路线总距离%%%%%%%%%%%%%%%%
		len2=func3(tmp_city,n);
		%%%%%%%%%%%%新老距离的差值,相当于能量%%%%%%%%%%
		delta_e=len2-len1;
		%%%%%%%%%%%%判断是否用新路线替换就路线%%%%%%%%%%
		if delta_e<0
			city=tmp_city;
		else
		%%%%%%%%以概率选择是否接受新解%%%%%%%%%%%%%%%%
			if exp(-delta_e/T)>rand()
				city=tmp_city;
			end
		end
	end
	l=l+1;
    %%%%%%%%计算新路线距离%%%%%%%%%%%%%
   	len(1)=func3(city,n);
   	%%%%%%%%温度不断下降%%%%%%%%%%%%%%
   	T=T*K;  %K就是衰减系数α
end
步骤

1)初始化:初始温度、初始新解
2)添加随机扰动,产生新解
3)比较能量差,判断新解是否接受
4)如果接受,并且迭代没有结束,继续产生新解,重复 2),3)
5)判断是否达到终止条件,如果没有则降低温度,重新产生新解,再次进入循环

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值