Algorithm 如何在模拟退火中找到邻近解?

Algorithm 如何在模拟退火中找到邻近解?,algorithm,optimization,simulated-annealing,Algorithm,Optimization,Simulated Annealing,我正在研究一个优化问题,并试图将模拟退火作为一种启发式方法。我的目标是在给定一些代价函数的情况下优化k个对象的放置。解的形式是一组k个有序对,表示M*N网格中的点。我不确定如何在给定当前解决方案的情况下找到最佳的相邻解决方案。我考虑过在随机方向上将每个点移动1或0个单位。在给定一组当前点的情况下,找到相邻解的好方法是什么 既然我也在尝试了解更多关于SA的知识,那么什么是好的邻居查找算法,以及邻居应该与当前的解决方案有多接近?此外,如果涉及随机性,为什么选择“邻居”比生成随机解更好?我会将您的问题

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


既然我也在尝试了解更多关于SA的知识,那么什么是好的邻居查找算法,以及邻居应该与当前的解决方案有多接近?此外,如果涉及随机性,为什么选择“邻居”比生成随机解更好?

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

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

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

  • 在给定一组当前点的情况下,找到相邻解的好方法是什么
  • 我很遗憾地告诉你,这个问题总的来说似乎无法解决(这是艺术和科学的结合。选择正确的方式探索搜索空间太过具体。即使是在不同约束条件下解决布局问题,不同的启发式可能会导致完全不同的结果

    您可以尝试以下操作:

  • 按固定的步长(1,2…)随机移动。这是您的方法
  • 交换两点
  • 你可以在一段时间内记住糟糕的动作(类似于),所以在接下来的100步中,你只能使用“好”的动作
  • 使用贪婪方法生成次优位置,然后使用上述方法对其进行改进
  • 尝试随机重新启动。在某个阶段,放弃目前为止的所有进度(目前为止最好的解决方案除外),升高温度,然后从随机初始点重新开始。您可以每10000步或类似的步骤执行一次
  • 固定一些点。将一个对象放在点(x,y)上,不要移动它,尝试在这个约束下搜索最佳可能的解决方案
  • 禁止某些对象的组合,例如“p1和p2之间的距离必须大于D”
  • 以不同的方式混合上述所有步骤
  • 试着从最细微的细节上理解你的问题。你可以从你的问题描述中获得一些有用的信息/约束/见解。假设你不能解决一般的布局问题,那么试着把它简化为一个更具体的(=更简单,=搜索空间更小)的问题
  • 我会说,最后一个子弹是最重要的。仔细看看你的问题,只考虑它的“强”>“实用”>强>方面。例如,你的问题的大小可能允许你列举一些东西,或者可能,一些布局是不可能的,等等。知识本身,所以帮助它吧

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


    我希望这会有所帮助。

    啊,我明白了——我试图使我的方法尽可能通用,以实现可伸缩性。我将限制范围并包含针对当前问题的特定细节。谢谢你的全面回答@JoelAbraham SA是一种非常强大的技术,但它的能力并不是无限的。如果您觉得这样可以回答所有问题,请不要忘记将您的问题标记为已回答:)