如何在模拟退火中找到相邻的解?

时间:2017-08-02 00:49:43

标签: algorithm optimization simulated-annealing

我正在研究优化问题并尝试使用模拟退火作为启发式算法。我的目标是在给定一些成本函数的情况下优化k对象的放置。解决方案采用一组k个有序对的形式,表示M * N网格中的点。在目前的解决方案中,我不确定如何最好地找到相邻的解决方案。我考虑过在随机方向上将每个点移动1或0个单位。在给定当前点的情况下,找到相邻解的好方法是什么?

由于我也试图了解更多有关SA的信息,是什么使得良好的邻居搜索算法以及邻居应该与当前解决方案的接近程度如何?此外,如果涉及随机性,为什么选择"邻居"比生成随机解更好?

1 个答案:

答案 0 :(得分:2)

我会将你的问题分成几个小的:

  1. 另外,如果涉及随机性,为什么选择“邻居”比生成随机解决方案更好?
  2. 通常,您从邻居中选择多个点,然后您可以浏览所有这些点。例如,您随机生成10个点并选择最佳点。通过这样做,您可以有效地探索更多可能的解决方案。

    为什么它比随机猜测更好?好的解决方案往往有很多共同之处(例如,它们在搜索空间中彼此接近)。因此,通过引入小的增量更改,您将能够找到一个好的解决方案,而随机猜测可以将您发送到搜索空间的完全不同的部分,您将永远找不到合适的解决方案。而且由于curse of dimensionality随机跳跃并不比蛮力更好 - 跳跃的地方太多了。

    1. 在给定当前点数的情况下,找到相邻解决方案的好方法是什么?
    2. 我很遗憾地告诉你,这个问题似乎无法解决。 :(这是艺术和科学之间的混合。选择正确的方式来探索搜索空间是特定于问题。即使在不同的约束条件下解决放置问题,不同的启发式方法也可能导致完全不同的结果。

      您可以尝试以下操作:

      1. 按固定数量的步骤(1,2 ...)随机移动。这是你的方法
      2. 交换两点
      3. 您可以记住一段时间内的不良动作(类似于tabu search),因此您将在接下来的100步中仅使用“好”动作
      4. 使用贪婪方法生成次优放置,然后使用上述方法对其进行改进。
      5. 尝试随机重启。在某个阶段,到目前为止放弃所有进度(到目前为止最好的解决方案除外),升高温度并从随机初始点重新开始。你可以每10000个步骤或类似的东西这样做
      6. 修正一些问题。将对象放在点(x,y)处并且根本不移动它,尝试在此约束下搜索最佳解决方案。
      7. 禁止某些对象组合,例如“p1和p2之间的距离必须大于D”。
      8. 以不同方式混合上述所有步骤
      9. 尝试在所有细节中了解您的问题。您可以从问题描述中获得一些有用的信息/约束/见解。假设您不能解决一般的放置问题,请尝试将其缩小为更具体(==更简单,==搜索空间更小)的问题。
      10. 我会说最后一颗子弹是最重要的。仔细查看您的问题,仅考虑其实用方面。例如,您的问题的大小可能允许您枚举某些内容,或者,某些展示位置对您来说是不可能的等等。 SA无法自己获取这些特定领域的知识,所以请帮助它!

        如何理解你的启发式是一个好的?只有通过实际评估。准备一套体面的测试,其中包含明显/众所周知的答案,并尝试不同的方法。如果有任何基准,请使用众所周知的基准。

        我希望这有用。 :)