退火,Annealing,高温物体经降温形成晶体的过程。其过程可以看做是在晶格空间求解最优解的过程。
模拟退火,Simulated Annealing,模拟自然界退火过程而求解多维非凹函数最优解的算法[1]。
[1] S. Kirkpatrick, C. D. Gelatt, Jr., and M. P. Vecchi, “Optimization by Simulated Annealing,”
Science, May 13, 1983, pp. 671 - 680.
不好理解,确实有点。
直接看伪码:
/*
* Initialize Problem.
*/
solution = randomSolution();
temperature = initialTemperature();
searchRegion = initialSearchRegion();
/*
* Solve by Simulated Annealing.
*/
while (outerLoopExitCriterion() == false) { // Outer Loop
while (innerLoopExitCriterion() == false) { // Inner Loop
newSolution = generateNewSolution(solution, searchRegion);
deltaCost = cost(newSolution) - cost(solution);
randomNumber = random(0, 1);
if (randomNumber < exp(-deltaCost/temperature)) {
solution = newSolution;
}
} // End of Inner Loop
temperature = updateTemperature();
searchRegion = updateSearchRegion();
} // End of Outer Loop
cost(const Solution&)是成本函数,即我们试图最小化的函数。其余通过注释和函数及变量名就可猜出一二。
外层循环就是对温度,temperature和搜索范围,searchRegion的更新操作,一般有指定的计划方案,schedule,也会根据当前内部循环和解的情况做相应的调整。
这里要讲讲内层循环:
我们通过变换旧的解得到新的解,searchRegion指可变换的范围,不出所料,随着迭代的次数增多,searchRegion应该趋向缩小;
deltaCost即 Δcost ,用于衡量新解对旧解的改进程度, Δcost>0 表明解退步, Δcost<0 表明解进步, Δcost=0 表明解不进不退;
下面生成一个随机数,用于当解退步时判断是否接受此解;
判断是否接受新解的关键一步:
if (randomNumber < exp(-deltaCost/temperature