使用变量优化Excel中的列表

时间:2016-04-27 17:46:31

标签: excel excel-vba optimization excel-formula vba

我列出了153名高尔夫球手,他们的薪水和平均分数相关。

我想找到6位高尔夫球手的组合,这些球员可以优化平均得分并保持低于50,000美元的薪水。

我尝试过使用Solver,但我被卡住了!有人可以帮忙吗? :)

2 个答案:

答案 0 :(得分:2)

说明一个与@ErwinKalvelagen建议非常接近的解决方案。

  1. A栏是153名高尔夫球手的名字
  2. B栏是高尔夫球手的薪水(由=RANDBETWEEN(50, 125)*100生成,填写,然后是复制/粘贴值)
  3. C栏是高尔夫球手的平均分数(由=RANDBETWEEN(70, 85)生成,填写,然后是复制/粘贴值)
  4. D列是0或1,表示是否包含高尔夫球手。
  5. 单元格F2是总薪水,由=SUMPRODUCT(B2:B154,D2:D154)
  6. 指定
  7. 单元格G2是高尔夫球手的数量,由=SUM(D2:D154)
  8. 给出
  9. 单元格H2是团队的平均得分,由=SUMPRODUCT(C2:C154,D2:D154)/G2
  10. 给出

    在设置Solver之前,页面看起来像这样......

    enter image description here

    Solver设置看起来像这样......

    enter image description here

    根据帮助,它说使用进化引擎来解决非平滑问题。在选项中,我需要将最大时间从30增加到300(60可能已经足够好)。

    enter image description here

    它需要几分钟才能完成。它很快就达到了70的解决方案,但花了更多的时间寻找更好的答案。

    enter image description here

    以下是它提出的六位高尔夫球手。

    enter image description here

    在平均70分的高尔夫球手中,可能会找到较低的薪水。

    enter image description here

    在单元格I2中添加了公式=F2+F2*(H2-70),这基本上是因平均得分在70以上而增加的工资...

    enter image description here

    ...并使用相同的求解器设置,但最小化单元格I2而不是H2 ...

    enter image description here

    这些是它选择的高尔夫球手......

    enter image description here

    再次 - 看起来还有更好的解决方案。它本可以选择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(优化工具箱)。

完成:这是我们在这里解决的数学模型:

enter image description here

随机数据的结果:

enter image description here

...

enter image description here