模拟退火与实际价值最大化

时间:2013-11-04 13:19:17

标签: c++ machine-learning artificial-intelligence simulated-annealing

我正在进行模拟退火试图解决背包问题,因此我必须最大化适应性(包中物品的价值)。

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. 
}

基本上这是我的代码。我的问题

  1. 在执行交换时的第2步中,我正在交换数组的元素。这是对的吗?或者我应该跟踪先前的解决方案并将当前元素(i)与先前的解决方案元素交换? (这只是一个想法)。
  2. 当在数组中使用实际值时,如何在执行期间告诉系统前一个解决方案接近最大边界,因为在我当前的实现中,我在第一步中连续生成随机值,这一过程一直重复,直到系统冷却。
  3. 最后,也许我的实施中存在一些重大错误,如果能在这个问题上得到帮助,我真的很感激

1 个答案:

答案 0 :(得分:2)

您的伪代码不是模拟退火。你在没有任何目标的情况下随机跳入搜索空间。

你的第一个问题:

  

在执行交换的第2步中,我正在交换数组的元素。这是对的吗?或者我应该跟踪先前的解决方案并将当前元素(i)与先前的解决方案元素交换? (这只是一个想法)。

您应该实现一个名为perturb的函数。这种扰动应该交换你的数组值。模拟退火,顾名思义使用退火的概念。这意味着你开始热。您的扰动函数会大幅改变值。然后您的解决方案开始冷却,这意味着您的扰动函数只会稍微改变值。

请参阅以下presentation

  

z逐渐冷却液体......

     
      
  • 在高温下,分子自由移动
  •   
  • 在低温下,分子“卡住”
  •   

根据您的解决方案,您可以获得以下随机性。

  

2)在上面的5D数组中执行值的随机交换。

以下是如何实施逐渐冷却的方法。

  • 2a)int MaxRandomValueToAddToArrayValues = 20;
  • 2b)我怎么找到20,这是领域知识。根据你的价值观和最佳解决方案,20似乎是一个很好的价值。
  • 2c)使用此边界
  • 在上面的5D数组中执行值的随机交换
  • 2d)逐渐减少MaxRandomValueToAddToArrayValues。例如,对于每10次迭代,您可以将其减少0.1。

你的第二个问题:

  

在数组中使用实际值时,如何在执行期间告诉系统先前的解决方案是否接近最大边界

您无法知道您的解决方案是否接近最大边界。您只能知道您的解决方案比以前更好。如果我们可以知道最大边界为什么实现SA或任何其他启发式方法。知道最佳解决方案(在你的单词max boundary中)是不可能或非常昂贵的,因此我们使用启发式解决方案。