小兔网

下面我们将看一下Excel VBA中的一个程序,该程序可以解决背包问题的一个小实例

定义:给定一组项目,每个项目都有一个权重和一个值,请确定要包含在集合中的项目,以使总值尽可能大且总权重小于给定的限制。它的名称源于某人遇到的问题,该人受到固定大小背包的约束,必须用最有用的物品填充它。

示例:5个具有给定重量,值和限制的项目。

背包问题图像

在Excel中,此问题如下所示:

背包问题示例

1.首先,我们声明Double类型的五个变量,名称分别为limit,weight,value,totalWeight和maximumValue。

Dim limit 作为 Double,weight 作为 Double,value 作为 Double,totalWeight 作为 Double,maximumValue 作为 Double

2.接下来,我们声明名称为i,j,k,l,m的五个Integer类型的变量。

Di, i,j,k,l,m  整数

3.我们初始化两个变量。我们使用单元格D6的值初始化变量限制。我们使用值0初始化变量maximumValue。

限制= Range(“ D6”)。value
maximumValue = 0

4.接下来,我们检查每个可能的解决方案。我们可以包含一个项目(1),也可以不包含(0)。我们从5 For Next循环开始。每个项目一个。

对于 i = 0  1
    对于 j = 0  1
        对于 k = 0  1
            对于 l = 0  1
                对于 m = 0  1

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

重量= 12 * i + 2 * j + 1 * k + 1 * l + 4 * m
值= 4 * i + 2 * j + 2 * k + 1 * l + 10 * m

6.仅当value大于maximumValue且权重小于limit时,我们才找到新的更好的解决方案。

如果 value> maximumValue 并且权重<= limit 然后

7.如果为true,则将新的解决方案写入第4行,权重设置为totalWeight,值设置为maximumValue。

Range(“ B4”)。value = i
Range(“ C4”)。value = j
Range(“ D4”)。value = k
Range(“ E4”)。value = l
Range(“ F4”)。value = m
totalWeight =重量
最大值=值

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

如果结束

9.不要忘记关闭5 For Next循环。

                下一个 m
            下一个 l
        下一个 k
    下一个 j
下一个 i

Excel VBA会以此方式检查每个可能的解决方案,结果最佳解决方案将出现在第4行中。请记住,1表示我们包含一个项目,0表示我们将其省略。

10.最后,分别将最佳解的totalWeight和maximumValue分别写入单元格B6和B8。

Range(“ B6”)。value = totalWeight
Range(“ B8”)。value = maximumValue

11.测试程序。

结果:

背包问题结果

结论:最好包括最后四个项,最大值为15。此解决方案的总权重为2 +1 + 1 + 4 = 8,不超过限制15。

注意:通过设置权重和值变量,可以解决此大小的背包问题(请参见可下载的Excel文件)。