目录
我的基础
优化算法的要素如下,
目标函数;约束条件(自变量范围等);判断条件;自变量。
经过学习,以上的专业术语是:状态函数 <包含了计算和状态转移的判断>;搜索空间(状态空间)。
那么模拟退火 算法的特点是什么呢?
答:有一个候选解,采用随机数在一定范围内随机选取。
本文的主要目的就是结合实际题目,理解上述一句话。要理解上述含义,需要了解一个准则——Metropolis准则。
这个准则用来判断状态转移条件和概率。
根据Metropolis准则,粒子在温度T时趋于平衡的概率——也就是说出现能量差为dE的降温的概率为P(dE),表示为:P(dE) = exp( dE/(kT) )]。其中E为温度T时的内能,dE为其改变量为负值,k为Boltzmann常数。因此P与T正相关。
用固体退火模拟组合优化问题,将内能E模拟为目标函数值f,温度T演化成控制参数t,即得到解组合优化问题的模拟退火算法:由初始解i和控制参数初值t开始,对当前解重复“产生新解→计算目标函数差→接受或舍弃”的迭代,并逐步衰减t值,算法终止时的当前解即为所得近似最优解,这是基于蒙特卡罗迭代求解法的一种启发式随机搜索过程。退火过程由冷却进度表(Cooling Schedule)控制,包括控制参数的初值t及其衰减因子Δt、每个t值时的迭代次数L和停止条件S。
总结
1、题目:平衡点问题:https://www.luogu.org/problem/P1337 ——后面用模拟退火思路分析。
输入格式:文件的第一行为一个正整数n(1≤n≤1000),表示重物和洞的数目。接下来的n行,每行是3个整数:Xi.Yi.Wi,分别表示第i个洞的坐标以及第 i个重物的重量。(-10000≤x,y≤10000, 0<w≤1000 )
2、结合参考文献1中代码分析,代码初始值选 t=3000,其实是有问题的?如果输入 都大于3000,是否可以呢?引出如下:
主要问题
问:模拟退火变量是由大变小,那么和具体题目中的随机数变化是什么关系?
答:这是在判断转移条件时使用,3种情况。
case 1,如果目标函数变小了,那么接受变量。
case 2,如果目标函数相等或者变大了,那么就不接受新变量了吗?答案是以一定概率接受新变量。如何确定这个概率呢?就要T,dE以及随机数了。实际上是P(dE)的应用。
case 3,case 2 没能接受,就要对T进行缩小。一般T乘以0.9500到0.9999之间的一个数。
模拟退火的思想就体现在,不断选择新变量,然后重复判断case 1,2,3,这个过程中,T是变小的,P(dE)也是不断变小的。但目标函数是不断接近最优值的。而第2种判断也可能使目标函数达到全局最优,否则就不必要进行case 2判断,而直接进入case 3了!
参考文献:
1. https://www.luogu.org/problemnew/solution/P1337 之“模拟退火学习笔记”,——代码可用-Dev C++
2.https://blog.youkuaiyun.com/qq997843911/article/details/83445318 原链接 http://dingby.site/2018/04/07/%E6%9C%80%E4%BC%98%E5%8C%96%E7%AE%97%E6%B3%95%E2%80%94%E2%80%94%E5%B8%B8%E8%A7%81%E4%BC%98%E5%8C%96%E7%AE%97%E6%B3%95%E5%88%86%E7%B1%BB%E5%8F%8A%E6%80%BB%E7%BB%93/
3.https://www.cnblogs.com/ranjiewen/p/6084052.html