我正在研究优化问题并尝试使用模拟退火作为启发式算法。我的目标是在给定一些成本函数的情况下优化k对象的放置。解决方案采用一组k个有序对的形式,表示M * N网格中的点。在目前的解决方案中,我不确定如何最好地找到相邻的解决方案。我考虑过在随机方向上将每个点移动1或0个单位。在给定当前点的情况下,找到相邻解的好方法是什么?
由于我也试图了解更多有关SA的信息,是什么使得良好的邻居搜索算法以及邻居应该与当前解决方案的接近程度如何?此外,如果涉及随机性,为什么选择"邻居"比生成随机解更好?
答案 0 :(得分:2)
我会将你的问题分成几个小的:
通常,您从邻居中选择多个点,然后您可以浏览所有这些点。例如,您随机生成10个点并选择最佳点。通过这样做,您可以有效地探索更多可能的解决方案。
为什么它比随机猜测更好?好的解决方案往往有很多共同之处(例如,它们在搜索空间中彼此接近)。因此,通过引入小的增量更改,您将能够找到一个好的解决方案,而随机猜测可以将您发送到搜索空间的完全不同的部分,您将永远找不到合适的解决方案。而且由于curse of dimensionality随机跳跃并不比蛮力更好 - 跳跃的地方太多了。
我很遗憾地告诉你,这个问题似乎无法解决。 :(这是艺术和科学之间的混合。选择正确的方式来探索搜索空间是特定于问题。即使在不同的约束条件下解决放置问题,不同的启发式方法也可能导致完全不同的结果。
您可以尝试以下操作:
我会说最后一颗子弹是最重要的。仔细查看您的问题,仅考虑其实用方面。例如,您的问题的大小可能允许您枚举某些内容,或者,某些展示位置对您来说是不可能的等等。 SA无法自己获取这些特定领域的知识,所以请帮助它!
如何理解你的启发式是一个好的?只有通过实际评估。准备一套体面的测试,其中包含明显/众所周知的答案,并尝试不同的方法。如果有任何基准,请使用众所周知的基准。
我希望这有用。 :)