我有一组“点”及其“值”。 我想从“积分”的组合中获得最高的“价值”。
示例:
我的目标点: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
我的代码存在的问题是,它会遍历所有可能的组合,这会花费大量时间并且几乎不会产生结果。
答案 0 :(得分:0)
“万亿次”低估了代码要尝试执行的工作量。您的代码将通过最内层的循环1.94 * 10 ^ 21次,以每秒一千万次通过(大约是VBA可以提供的最大速度)的速度,将超过600万年。相反,只需使用Solver add-in来解决相当简单的integer programming problem。
设置电子表格,如下所示:
您的数据在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:C21
和D2 <= 100
是整数。我保留默认设置,即假定变量为非负数,并告诉求解器使用Simplex方法(在幕后将使用分支定界法来求解此ILP)。根据规划求解(发现不到一秒钟而不是600万年的历史),最优解决方案是C2:C21
,总价值为10*Point1 + 6*Point15
-恰好是您已经找到的价值,表明此问题具有多个最优条件。
在VBA中可能但不容易做到所有这些,因为可以在代码中调用求解器加载项。有关基本介绍,请参见this。