“模拟退火算法的并行化”之“什么是模拟退火算法”

来源:互联网 发布:html5手机微场景源码 编辑:程序博客网 时间:2024/05/22 00:58

退火,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,也会根据当前内部循环和解的情况做相应的调整。

这里要讲讲内层循环:

  1. 我们通过变换旧的解得到新的解,searchRegion指可变换的范围,不出所料,随着迭代的次数增多,searchRegion应该趋向缩小;

  2. deltaCost即Δcost,用于衡量新解对旧解的改进程度,Δcost>0表明解退步,Δcost<0表明解进步,Δcost=0表明解不进不退;

  3. 下面生成一个随机数,用于当解退步时判断是否接受此解;

  4. 判断是否接受新解的关键一步:
    if (randomNumber < exp(-deltaCost/temperature))
    这里Δcost代表deltaCost,T代表temperture,r代表randomNumber:

    • Δcost<0时,eΔcost/T>1,由于rUniform(0,1),则r[0,1],则if语句为真,当解有改进时恒接受;
    • Δcost0时,0<eΔcost/T1,则根据reΔcost/T的大小关系,决定是否接受新解。当然,当Δcost变大或T变小时,eΔcost/T更接近于0,则被接受的概率越低,相反,越高。
    • 形象的说,eΔcost/T可以看做是新解被接受的概率,当解改进时,概率大于1,一定接受,当解退步时,概率小于1,不一定接受。
    • 当新解较旧解退步时,Δcost越大,退步越大,新解被接受的概率越低,相反,Δcost越小,退步不大,则新解被接受的概率越高。
    • 另外,当温度升高时,概率也变大,当温度降低时,概率就变小。一般初始温度很高,退步的新解的接受概率也大,随着迭代次数的增加,温度降低(退火的意义所在),退步的新解就不那么容易被接受了,当然,改进的新解总是被接受。
  5. 一旦满足上面的条件,新解被接受,替代旧解。

说点模拟退火的好处吧:

  1. 比较好实现,真的,主要逻辑就上面这几行,不同的应用,实现不同的函数就成了;

  2. 约束比较好加,一般的解空间是受约束的,即有些多维空间的点是解,有些不在解空间内,当你构造初始解和新解的时候,就要考虑这些事情了,模拟退火比其他的一些最优化解法(如解析求解)好在约束在构造解的时候,可以人为检查。

  3. 在不考虑运行时间的情况下(允许它很慢),非凹函数的最终解的质量还是很好的。由于模拟退火在退火过程中不是一概拒绝退步的解,这就使模拟退火对局部解不是那么敏感,在高温及中等温度的情况下,它可以爬上局部解周围的缓坡,跳出局部陷阱。

那缺点呢?
我本不想这么快就说它的缺点,但还是客观一点好,优缺点一起摆出:

  1. 模拟退火其实就是靠大数定律才成立的一个方法,初始解和产生新解,判断新解是否能够接受都是靠随机数,都是靠概率;

  2. 上面提到过,慢!本身模拟退火靠大数定律才成立,所以,大量的解是一定要产生的,当问题规模不断变大,搜索的解的数目呈指数级增长,想要提供很好质量的解变得异常难,无限膨胀的运行时间,不知要到何时;

  3. 很难并行化,但并不是不可以。模拟退火的执行是序列性的,从上面的代码就可以看出,一个解是在前面解的基础上产生的。它明显不是一个自然并行的程序(矩阵相乘就是自然并行的程序),它的并行化也是另外一篇博客的主题。

0 0
原创粉丝点击