我列出了153名高尔夫球手,他们的薪水和平均分数相关。
我想找到6位高尔夫球手的组合,这些球员可以优化平均得分并保持低于50,000美元的薪水。
我尝试过使用Solver,但我被卡住了!有人可以帮忙吗? :)
答案 0 :(得分:2)
说明一个与@ErwinKalvelagen建议非常接近的解决方案。
=RANDBETWEEN(50, 125)*100
生成,填写,然后是复制/粘贴值)=RANDBETWEEN(70, 85)
生成,填写,然后是复制/粘贴值)F2
是总薪水,由=SUMPRODUCT(B2:B154,D2:D154)
G2
是高尔夫球手的数量,由=SUM(D2:D154)
H2
是团队的平均得分,由=SUMPRODUCT(C2:C154,D2:D154)/G2
在设置Solver之前,页面看起来像这样......
Solver设置看起来像这样......
根据帮助,它说使用进化引擎来解决非平滑问题。在选项中,我需要将最大时间从30增加到300(60可能已经足够好)。
它需要几分钟才能完成。它很快就达到了70的解决方案,但花了更多的时间寻找更好的答案。
以下是它提出的六位高尔夫球手。
在平均70分的高尔夫球手中,可能会找到较低的薪水。
在单元格I2
中添加了公式=F2+F2*(H2-70)
,这基本上是因平均得分在70以上而增加的工资...
...并使用相同的求解器设置,但最小化单元格I2
而不是H2
...
这些是它选择的高尔夫球手......
再次 - 看起来还有更好的解决方案。它本可以选择Name97而不是Name96。
答案 1 :(得分:1)
这是一个简单的优化问题,可以使用Excel求解器解决(只需使用“Simplex Lp求解器” - 有点用词不当,因为我们将在这里使用它来解决整数编程或MIP问题)。
您需要一个包含153个二进制(BIN)变量的列(Excels限制是我相信200)。确保添加约束以将值设置为二进制。让我们称之为INCLUDE;求解器将使用0或1值填充它。对这些值求和,并使用SUMINCLUDE = 6添加约束。然后添加一个包含INCLUDE * SCORE的列。求和此列,这是您的目标(优化平均值与优化总和相同)。然后添加一个包含INCLUDE * SALARY的列并对它们求和。使用SUMSALARY< = 50k添加约束。按解决并完成。
我不同意Excel会因此而崩溃或者说这不符合Excels解算器的限制。 (我真的试过这个。)
我更喜欢进化求解器上方的单纯形法,因为单纯形求解器更适合这个问题:它更快(单纯需要<1秒)并提供最优解(演化求解器通常提供次优解)。
如果你想用Matlab解决这个问题,可以看一下intlinprog
(优化工具箱)。
完成:这是我们在这里解决的数学模型:
随机数据的结果:
...