具有滤波器的多个For循环迭代(组合),以实现可能的最大值

时间:2019-07-18 17:58:43

标签: excel vba

我有一组“点”及其“值”。 我想从“积分”的组合中获得最高的“价值”。

示例:

我的目标点:100

Point   Value
1       111
2       222
3       333
4       444
5       555
6       666
7       777
8       888
9       999
10      1110
11      1221
12      1332
13      1443
14      1554
15      1665
16      1776
17      1887
18      1998
19      2109
20      2220

可以有 TRILLIONS 个组合,但我只需要达到“ My Target Point”的组合即可产生最高“价值” 。

可能的答案:

1。 (点16)* 2 +(点17)* 4 = 100

(值1776)* 2 +(值1887)* 4 = 11100

2。 (第1点)* 100 = 100

(值111)* 100 = 11100

&等等.....

所以最后我只需要一个(任何)具有最高价值的组合。

amt2 = 0

For i20 = 0 To 5 ' (Max multiple -> 100/20 = 5)
For i19 = 0 To 5 ' (Max multiple -> 100/19 = 5)
For i18 = 0 To 5
For i17 = 0 To 5
For i16 = 0 To 6
For i15 = 0 To 6
For i14 = 0 To 7
For i13 = 0 To 7
For i12 = 0 To 8
For i11 = 0 To 9
For i10 = 0 To 10
For i9 = 0 To 11
For i8 = 0 To 12
For i7 = 0 To 14
For i6 = 0 To 16
For i5 = 0 To 20
For i4 = 0 To 25
For i3 = 0 To 33
For i2 = 0 To 50
For i1 = 0 To 100 ' (Max multiple -> 100/1 = 1)

point1 = (1 * i1) + (2 * i2) + (3 * i3) + (4 * i4) + (5 * i5) + (6 * i6) + (7 * i7) + (8 * i8) + (9 * i9) + (10 * i10) + (11 * i11) + (12 * i12) + (13 * i13) + (14 * i14) + (15 * i15) + (16 * i16) + (17 * i17) + (18 * i18) + (19 * i19) + (20 * i20))

If point1 <= 100 Then
amt1 = (111 * i1) + (222 * i2) + (333 * i3) + (444 * i4) + (555 * i5) + (666 * i6) + (777 * i7) + (888 * i8) + (999 * i9) + (1110 * i1 + (1221 * i11) + (1332 * i12) + (1443 * i13) + (1554 * i14) + (1665 * i15) + (1776 * i16) + (1887 * i17) + (1998 * i18) + (2109 * i19) + (2220 * i20)

If amt2 < amt1 Then
amt2 = amt1

<Save Combination Details>

End If
End If

Next i1
Next i2
Next i3
Next i4
Next i5
Next i6
Next i7
Next i8
Next i9
Next i10
Next i11
Next i12
Next i13
Next i14
Next i15
Next i16
Next i17
Next i18
Next i19
Next i20

我的代码存在的问题是,它会遍历所有可能的组合,这会花费大量时间并且几乎不会产生结果。

1 个答案:

答案 0 :(得分:0)

“万亿次”低估了代码要尝试执行的工作量。您的代码将通过最内层的循环1.94 * 10 ^ 21次,以每秒一千万次通过(大约是VBA可以提供的最大速度)的速度,将超过600万年。相反,只需使用Solver add-in来解决相当简单的integer programming problem

设置电子表格,如下所示:

enter image description here

您的数据在SELECT day, campaignid, MAX(earned_that_day), MIN(earned_that_day) FROM (SELECT day, employeeid, SUM(earned_that_hour) as earned_that_day FROM Employees GROUP BY day, employeeid) GROUP BY day, employeeid 列中,我在决策变量中添加了新列,在A:B中添加了约束单元,在D2中添加了目标函数。

E2中的公式为:

D2

=SUMPRODUCT(A2:A21,C2:C21) 中是:

E2

然后,我只要求求解器通过更改单元格=SUMPRODUCT(B2:B21,C2:C21) 来找出单元格E2的最大值,而这两个约束条件是C2:C21D2 <= 100是整数。我保留默认设置,即假定变量为非负数,并告诉求解器使用Simplex方法(在幕后将使用分支定界法来求解此ILP)。根据规划求解(发现不到一秒钟而不是600万年的历史),最优解决方案是C2:C21,总价值为10*Point1 + 6*Point15-恰好是您已经找到的价值,表明此问题具有多个最优条件。

在VBA中可能但不容易做到所有这些,因为可以在代码中调用求解器加载项。有关基本介绍,请参见this