我正在进行模拟退火试图解决背包问题,因此我必须最大化适应性(包中物品的价值)。
float weight[5]={2, 3, 5, 4, 3}; // weight
float value[5]={10, 20, 15, 25, 5}; // value of corresponding item
float bagSize = 11.0;
通过艰难计算,我们知道最佳解决方案是{1,1,0.4,1,0}。但是我没有得到这个解决方案。
我将用伪代码解释我的c ++代码,以避免这里的所有长代码。
While (temperate > 1){
1) Generate random values between (0,1) to fill the 5 sized array for each item
2) Perform random swapping of values in the 5D array above.
3) Calculate the fitness and new weight
4) Save the best solution.
}
基本上这是我的代码。我的问题
最后,也许我的实施中存在一些重大错误,如果能在这个问题上得到帮助,我真的很感激
答案 0 :(得分:2)
您的伪代码不是模拟退火。你在没有任何目标的情况下随机跳入搜索空间。
你的第一个问题:
在执行交换的第2步中,我正在交换数组的元素。这是对的吗?或者我应该跟踪先前的解决方案并将当前元素(i)与先前的解决方案元素交换? (这只是一个想法)。
您应该实现一个名为perturb的函数。这种扰动应该交换你的数组值。模拟退火,顾名思义使用退火的概念。这意味着你开始热。您的扰动函数会大幅改变值。然后您的解决方案开始冷却,这意味着您的扰动函数只会稍微改变值。
请参阅以下presentation
z逐渐冷却液体......
- 在高温下,分子自由移动
- 在低温下,分子“卡住”
根据您的解决方案,您可以获得以下随机性。
2)在上面的5D数组中执行值的随机交换。
以下是如何实施逐渐冷却的方法。
你的第二个问题:
在数组中使用实际值时,如何在执行期间告诉系统先前的解决方案是否接近最大边界
您无法知道您的解决方案是否接近最大边界。您只能知道您的解决方案比以前更好。如果我们可以知道最大边界为什么实现SA或任何其他启发式方法。知道最佳解决方案(在你的单词max boundary中)是不可能或非常昂贵的,因此我们使用启发式解决方案。