1、直观介绍
模拟退火算法来源于固体退火原理,是一种基于概率的算法,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。
它是基于Monte-Carlo迭代求解策略的一种随机寻优算法,其出发点是基于物理中固体物质的退火过程与一般组合优化问题之间的相似性。模拟退火算法从某一较高初温出发,伴随温度参数的不断下降,结合概率突跳特性在解空间中随机寻找目标函数的全局最优解,即在局部最优解能概率性地跳出并最终趋于全局最优。
模拟退火算法是一种通用的优化算法,理论上算法具有概率的全局优化性能,目前已在工程中得到了广泛应用。
2、代码明示
all_status=随机生成初始状态;
inner_iter=设置内部迭代次数;
temprature=设置初始温度
tempratute_goal=0.001 设置目标温度
while temperature>tempratute_goal %停止迭代温度
for i=1:inner_iter %内部迭代阶段,多次迭代扰动,一种蒙特卡洛方法,温度降低之前多次实验
E1=compute_Energy(all_status); %计算原状态下的能量
new_status=Perturb(all_status); %产生随机扰动
E2=compute_Energy(new_statues); %计算新状态下的能量
delta_E=E2-E1; %新老距离的差值,相当于能量
if delta_E<0 %新状态好于旧状态
all_status=new_status;
else %温度越低,越不太可能接受新解;新老距离差值越大,越不太可能接受新解
if exp(-delta_E/temperature)>rand() %以概率选择是否接受新解
all_status=new_status; %接受这个状态,可能得到较差的解
end
end
end
outer_iter=outer_iter+1; %统计外部迭代次数(没啥用)
if 满足终止条件
输出当前状态为最优解,终止循环
break;
end
temperature=temperature*0.99; %如果不满足终止条件,温度不断下降,继续进行内部迭代
end
注意两点:
1. 这个算法是两层循环,外层进行(1)判断是否满足条件,(2)降温
内层循环进行 (1)扰动 (2)判断能量(3)概率接受
2. 内层的能量才是优化的目标,温度并不是优化的目标,只是控制外层循环的的一种条件
3. 跳出大循环的条件有俩,第一个是温度到达一定低点,自然终止,第二个是终止条件,通常为内层取连续很多个新解都没有被接受时终止算法。
4. Paper中的具体实例,主要学习其set up
Iarussi et al "Wrapit: Computer-assisted crafting of wire wrapped jewelry." ACM Transactions on Graphics (TOG) 34.6 (2015): 221.