【问题标题】:How to find neighboring solutions in simulated annealing?如何在模拟退火中找到相邻解?
【发布时间】:2017-08-02 00:49:43
【问题描述】:

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

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

【问题讨论】:

    标签: algorithm optimization simulated-annealing


    【解决方案1】:

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

    1. 另外,如果涉及随机性,为什么选择“邻居”比生成随机解决方案更好?

    通常,您从一个社区中挑选 多个 点,然后您可以探索所有这些点。例如,您随机生成 10 个点并选择最好的一个。通过这样做,您可以有效地探索更多可能的解决方案。

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

    1. 在给定当前一组点的情况下,寻找相邻解决方案的好方法是什么?

    我很遗憾地告诉你,这个问题在一般情况下似乎是无法解决的。 :( 这是艺术与科学的结合。选择正确的方法来探索搜索空间过于具体问题。即使在不同的约束条件下解决放置问题,不同的启发式方法也可能导致完全不同的结果。

    您可以尝试以下操作:

    1. 按固定步长 (1,2...) 随机移动。这就是你的方法
    2. 交换两个点
    3. 你可以记住一段时间的坏动作(类似于tabu search),所以接下来的 100 步你只会使用“好”的动作
    4. 使用贪心方法生成次优放置,然后使用上述方法对其进行改进。
    5. 尝试随机重启。在某个阶段,放弃迄今为止的所有进展(目前为止的最佳解决方案除外),提高温度并从随机初始点重新开始。您可以每 10000 步或类似的步骤执行此操作
    6. 修复一些问题。将一个对象放在点 (x,y) 处,并且根本不移动它,尝试在此约束下寻找可能的最佳解决方案。
    7. 禁止某些对象组合,例如“p1 和 p2 之间的距离必须大于 D”。
    8. 以不同方式混合上述所有步骤
    9. 尝试从最细微的细节中了解您的问题。您可以从问题描述中获得一些有用的信息/约束/见解。假设您一般不能解决放置问题,因此请尝试将其简化为更具体(== 更简单,== 搜索空间更小)的问题。

    我会说最后一个子弹是最重要的。仔细查看您的问题,仅考虑其实际方面。例如,你的问题的大小可能允许你列举一些东西,或者,也许某些位置对你来说是不可能的等等等等。 SA 无法自行获取此类特定领域的知识,请帮助它!

    如何理解您的启发式是一个好的启发式?只能通过实际评估。准备一组具有明显/众所周知答案的不错的测试,并尝试不同的方法。如果有任何已知的基准,请使用它们。

    我希望这会有所帮助。 :)

    【讨论】:

    • 啊,我明白了——我试图使我的方法尽可能通用,以实现可扩展性。我将限制范围并结合手头问题的具体细节。感谢您的全面回答!
    • @JoelAbraham SA 是非常强大的技术,但它的功能并非无限。如果您觉得这回答了您所有的问题,请不要忘记将您的问题标记为已回答:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多