如何使用爬山算法解决背包问题?

人工智能 搜索 爬山 背包问题
2021-10-22 14:15:01

我需要使用爬山算法解决背包问题(我需要编写一个程序)。但我对如何做到这一点一无所知。

我的代码应该包含一个名为knapsack的方法,该方法有两个参数,第一个是一个 2xN 的整数数组,表示物品及其重量和价值,第二个是一个整数,表示背包的最大重量。我可以假设初始状态是一个空背包,并且这些动作要么将对象放入背包,要么将对象从背包中取出。

1个回答

我认为在实现爬山(HC)算法之前至少需要考虑三点:

一是初始状态。在 HC 中,人们通常对初始状态使用“临时解决方案”。你可以使用一个空的背包,但我更喜欢随机挑选物品并将其作为初始状态放入背包中。您可以使用二进制数组来保存每个项目的“拾取状态”,这样如果一个一世=1然后你选择一世-th 项目,如果一个一世=0那么你不选择一世-第项。

接下来是启发式函数。评估您当前状态的函数。实际上,您可以自由定义它(如初始状态),只要该函数可以评估哪个状态比其他状态更好。你可以使用一个简单的:

H={-1,如果 (w一世×一个一世)>最大重量(v一世×一个一世),否则

w一世v一世是重量和价值一世- 项分别。此功能的缺点之一是如果您有多个无效状态(总权重超过限制的状态),它们具有相同的值,即-1.

最后是生成当前状态邻居的方法。同样,您也可以自由定义您将使用的方法。我认为您提出的行动已经足够好:

  • 反转项目的状态(1 到 0 或 0 到 1)。这意味着我在当前状态下添加或减少项目。
  • 交换具有不同值的两个项目的状态。正式交换一个一世一个j一世j一个一世一个j. 这意味着我将我之前选择的项目与我之前没有选择的项目交换

然后,在定义完所有内容后,您可以按照Wikipedia中的说明运行算法:

currentNode = startNode;
loop do
    L = NEIGHBORS(currentNode);
    nextEval = -INF;
    nextNode = NULL;
    for all x in L 
        if (EVAL(x) > nextEval)
            nextNode = x;
            nextEval = EVAL(x);
    if nextEval <= EVAL(currentNode)
        //Return current node since no better neighbors exist
        return currentNode;
    currentNode = nextNode;