我正在学习模拟退火算法,有一些关于如何修改示例算法来解决0-1背包问题的问题。
我在CP上找到了这个很棒的代码:
这似乎很容易。这意味着Anneal()函数基本上是相同的。我必须实现GetNextArrangement()函数以适应我的需求。在TSM问题中,他只是交换路径上的两个随机节点(即,每次迭代都会进行非常小的更改)。
对于我的问题,在第一次迭代中,我会选择10个随机对象并查看剩余空间。那么在下一个迭代中,我应该只选择10个新的随机对象吗?还是最好只交换其中几个对象,例如其中的一半或仅一个对象?或者交换的对象数量应该与温度有关?我认为这些都是可行的,但我想知道是否有人能提供一些关于最佳方法的建议(尽管一旦代码能够运作起来,我可以进行改进)。
我在CP上找到了这个很棒的代码:
http://www.codeproject.com/KB/recipes/simulatedAnnealingTSP.aspx
我相信我现在已经理解了所有的工作原理(除了Bolzman条件,就我而言,这是黑魔法,但我明白如何避免局部最优解,而这正是它所做的)。我想重新设计它来解决0-1背包问题。基本上,我要把5000个物品放入10个袋子中,并需要优化未使用空间最少的情况。实际的“分数”我分配给一个解决方案有点更复杂,但与算法无关。这似乎很容易。这意味着Anneal()函数基本上是相同的。我必须实现GetNextArrangement()函数以适应我的需求。在TSM问题中,他只是交换路径上的两个随机节点(即,每次迭代都会进行非常小的更改)。
对于我的问题,在第一次迭代中,我会选择10个随机对象并查看剩余空间。那么在下一个迭代中,我应该只选择10个新的随机对象吗?还是最好只交换其中几个对象,例如其中的一半或仅一个对象?或者交换的对象数量应该与温度有关?我认为这些都是可行的,但我想知道是否有人能提供一些关于最佳方法的建议(尽管一旦代码能够运作起来,我可以进行改进)。
谢谢!
迈克