下面我们就来看看在Excel VBA程序,解决了一个背包问题的一个小实例。

定义:给定一组项目,每一个重量和价值,确定项目的集合中,包括使总价值尽可能大和总重量小于给定限制。

它的名字源于谁是一个固定大小的背包约束,必须以最有用的物品填充它面对别人的问题。

例如:5个项目配重块,值和限制给出。

Knapsack Problem Image

在Excel这个问题看起来如下:

Knapsack Problem Example

1.首先,我们声明Double类型的五个变量与名称限制,重量,价值,总权重和maximumValue。

Dim limit As Double, weight As Double, value As Double, totalWeight As Double, maximumValue As Double

2.接下来,我们声明Integer类型的五个变量与名称I,J,K,L,M。

Dim i, j, k, l, m As Integer

3.我们初始化两个变量。我们初始化变量极限与细胞D6的价值。我们初始化变量maximumValue值为0

limit = Range("D6").value

maximumValue = 0

4.接下来,我们检查每一个可能的解决方案。我们既可以包括(1)项或离开它(0)。我们开始5对于下一步循环。其中每个项目。

For i = 0 To 1

For j = 0 To 1

For k = 0 To 1

For l = 0 To 1

For m = 0 To 1

5.我们计算权重和一个可能的解决方案的值。

weight = 12  i + 2  j + 1  k + 1  l + 4  m

value = 4  i + 2  j + 2  k + 1  l + 10  m

6.只有当值大于maximumValue更高,重量比下限,我们已经找到了一个新的更好的解决方案。

If value > maximumValue And weight <= limit Then

7.如果为真,我们写的新的解决方案,以第4行,体重总权重和价值maximumValue。

Range("B4").value = i

Range("C4").value = j

Range("D4").value = k

Range("E4").value = l

Range("F4").value = m

totalWeight = weight

maximumValue = value

8.不要忘记关闭If语句。

End If

9.不要忘记关闭5对于下一个循环。

Next m

Next l

Next k

Next j

Next i

Excel中VBA检查每一个可能的解决方案这样的,其结果是最佳的解决方案将出现在第4行记住,1分意味着我们包括我们离开它的项目,0手段。

10.最后,写的最优解的总权重和maximumValue分别细胞B6和B8。

Range("B6").value = totalWeight

Range("B8").value = maximumValue

11.测试程序。

结果:

Knapsack Problem Result

结论:它的最佳包括的最后四个项目与15。此溶液用2 + 1 + 1 + 4 = 8不超过15的极限

总重量的最大值注:通过使权重和值变量就可以解决这个尺寸的任何背包问题(见下载Excel文件)。