使用variables优化Excel中的列表
我有一个153名高尔夫球员的名单与相关的工资和平均分数。
我想find6个高尔夫球手的组合,优化平均分,并保持低于$ 50,000的薪水。
我尝试过使用Solver,但我卡住了! 任何人都可以帮忙吗? 🙂
举例说明一个与@ErwinKalvelagenbuild议非常接近的解决scheme。
- A栏是153位高尔夫球手的名字
- B栏是高尔夫球员的薪水(由
=RANDBETWEEN(50, 125)*100
,填充下来,然后复制/粘贴值) - C列是高尔夫球手的平均分数(由
=RANDBETWEEN(70, 85)
,填充下来,然后是复制/粘贴值) - D栏是0或1来表示高尔夫球手是否被包括在内。
- 单元格
F2
是总收入,由=SUMPRODUCT(B2:B154,D2:D154)
- 单元格
G2
是高尔夫球手的数量,由=SUM(D2:D154)
- 单元格
H2
是团队的平均得分,由以下=SUMPRODUCT(C2:C154,D2:D154)/G2
给出=SUMPRODUCT(C2:C154,D2:D154)/G2
页面看起来像这样,在设置Solver之前…
求解器设置看起来像这样…
根据这个帮助,它说使用Evolutionary引擎来处理非光滑的问题。 在Options中,我需要将最大时间从30提高到300(60可能已经足够好了)。
花了几分钟才完成。 它很快达到了70的解决scheme,但花了更多的时间寻找更好的答案。
这是六个高尔夫球手提出来的。
平均70岁的高尔夫球手,可能会find更低的薪水。
在单元格I2
join公式=F2+F2*(H2-70)
,这基本上是工资由于70以上的平均分数的增加而受到惩罚的。
…并使用相同的求解器设置,除了最小化单元I2
而不是H2
…
这些是他们select的高尔夫球手
再次 – 看起来还有更好的解决scheme。 它可以selectName97而不是Name96。
这是一个简单的优化问题,可以使用Excel解算器解决(只需使用“Simplex Lp求解器” – 有点用词不当,因为我们将在这里使用它来解决整数编程或MIP问题)。
你需要一个有153个二进制(BIN)variables的列(Excels limit是I believe 200)。 确保您添加一个约束来将值设置为二进制。 让我们调用这个列INCLUDE; 求解器将填充0或1的值。 求和这些值,并用SUMINCLUDE = 6添加一个约束。 然后添加一个包含INCLUDE * SCORE的列。 总结这一列,这是你的目标(优化平均和优化总和相同)。 然后添加一个包含INCLUDE * SALARY的列并对其进行求和。 用SUMSALARY <= 50k添加一个约束。 按解决,完成。
我不同意Excel会崩溃的说法,或者这不符合Excels求解器的限制。 (我真的试过了)。
我更喜欢单纯形法在进化求解器之上,因为单纯形求解器更适合于这个问题:它比单纯求解器更快(simplex需要<1秒),并提供最优解(进化求解器通常不是最优解)。
如果你想用Matlab解决这个问题,可以看一下函数intlinprog
(Optimization Toolbox)。
完成:这是我们在这里解决的math模型:
结果随机数据:
….