使用variables优化Excel中的列表

我有一个153名高尔夫球员的名单与相关的工资和平均分数。

我想find6个高尔夫球手的组合,优化平均分,并保持低于$ 50,000的薪水。

我尝试过使用Solver,但我卡住了! 任何人都可以帮忙吗? 🙂

举例说明一个与@ErwinKalvelagenbuild议非常接近的解决scheme。

  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. 单元格G2是高尔夫球手的数量,由=SUM(D2:D154)
  7. 单元格H2是团队的平均得分,由以下=SUMPRODUCT(C2:C154,D2:D154)/G2给出=SUMPRODUCT(C2:C154,D2:D154)/G2

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

在这里输入图像说明

求解器设置看起来像这样…

在这里输入图像说明

根据这个帮助,它说使用Evolutionary引擎来处理非光滑的问题。 在Options中,我需要将最大时间从30提高到300(60可能已经足够好了)。

在这里输入图像说明

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

在这里输入图像说明

这是六个高尔夫球手提出来的。

在这里输入图像说明

平均70岁的高尔夫球手,可能会find更低的薪水。

在这里输入图像说明

在单元格I2join公式=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模型:

在这里输入图像说明

结果随机数据:

在这里输入图像说明

….

在这里输入图像说明