我正在学习模拟退火算法,并且有几个关于如何修改示例算法以解决 0-1 背包问题的问题。
我在 CP 上找到了这个很棒的代码:
http://www.codeproject.com/KB/recipes/simulatedAnnealingTSP.aspx
我很确定我现在了解这一切是如何工作的(除了整个波尔兹曼条件,就我而言,这是黑魔法,尽管我了解逃避局部最优,显然这正是这样做的)。我想重新设计它以解决 0-1 背包-“ish”问题。基本上,我将 5,000 个对象中的一个放入 10 个麻袋中,并且需要针对最少的未使用空间进行优化。我分配给解决方案的实际“分数”有点复杂,但与算法无关。
这似乎很容易。这意味着 Anneal() 函数将基本相同。我必须实现 GetNextArrangement() 函数以满足我的需要。在 TSM 问题中,他只是沿路径交换两个随机节点(即,他在每次迭代中进行非常小的更改)。
对于我的问题,在第一次迭代中,我会选择 10 个随机对象并查看剩余空间。对于下一次迭代,我会选择 10 个新的随机对象吗?还是我最好只换掉一些对象,比如一半或什至其中一个?或者也许我换出的物体数量应该与温度有关?任何这些对我来说似乎都是可行的,我只是想知道是否有人对最佳方法有一些建议(尽管一旦我的代码工作,我可以搞砸改进)。
谢谢!
麦克风