Excel解算器不提供一致的结果

时间:2016-03-03 22:16:39

标签: excel vba optimization

我正在尝试使用求解器来解决非线性问题,但结果不一致并且在某些条件下会发生变化。使用Risk Solver Platform时不存在此问题,但使用常规Excel解算器时会出现此问题。优化和约束并不复杂,所以我不明白发生了什么。

以下是文件:temp.xlsm

请注意,附加按钮涉及运行解算器的宏。

复制问题:

  • 打开文件
  • 点击Months标签
  • 初始感染率应为11%
  • 点击Optimize Net Revenue(纠正最佳状态;这很好)
  • 将初始感染率更改为1%
  • 点击Optimize Net Revenue
  • 将初始感染率更改回11%
  • 点击Optimize Net Revenue

注意:最佳净收入现在较低,并且在最后一个月的最后一列为负时应为零。似乎解算器每次都需要重置,或者有一个错误,但我无法弄明白。这是宏:

Sub Monthly_Solver()

    Application.Run "SolverReset"
    Application.Run "SolverOk", "$T$18", 1, "0", "$F$6:$F$17,$N$6:$N$17", 1, "GRG Nonlinear"
    Application.Run "SolverAdd", "$F$6:$F$17", 5, "binary"
    Application.Run "SolverAdd", "$N$6:$N$17", 1, "$M$6:$M$17"
    Application.Run "SolverAdd", "$N$6:$N$17", 3, "0"
    Application.Run "SolverAdd", "$T$18", 3, "0"
    Application.Run "SolverSolve", True

End Sub

1 个答案:

答案 0 :(得分:1)

GRG Nonlinear不保证找到全局最优解决方案。它找到了局部最优解,并且该解决方案的质量受到您提供给算法的初始值的影响。来自Frontline的website

  

当出现“解算器找到解决方案”消息时,这意味着GRG方法找到了一个局部最优解 - 没有其他一组值接近当前值的决策变量,从而产生更好的值。目标函数。形象地说,这意味着Solver找到了“峰值”(如果最大化)或“谷”(如果最小化) - 但如果模型是非凸的,则可能存在远离当前解的其他更高的峰或更深的谷。在数学上,此消息意味着满足局部最优性的Karush - Kuhn - Tucker(KKT)条件(在一定的容差范围内,与“求解器选项”对话框中的“精度”设置相关)。

目前,您的Harvest列在N14:N16中有3131个。如果您将initial infestation更改为1%并再次解决,则N14:N17的值为3131.因此您的初始解决方案已更改。如果在不更改N17中的值的情况下将其更改回11%,则求解程序可能会找到另一个局部最优解。如果您设置N17=0,您将获得与第一个相同的解决方案。

另一方面,如果GRG Nonlinear的唯一原因是二进制Spray变量及其表示的if / then条件,则可以使用线性约束(因此更有可能实现全局最优)。这是一个quick reference