Excel求解器中的多个目标

我有一个使用Excel的求解器运行多组排列的macros。 每个macros运行求解器3次,使用Simplex,然后是2 x Evolutionary。 这似乎工作得很好。

但是,我注意到,由于其中一个variables只受最大值限制,解决scheme不断变化。 因此,我需要使variables最大/最小目标。

我知道Excel的求解器只允许一个最大/最小目标。 有什么方法可以设置第二个最大/最小目标?

我有的代码如下:

a = Range("Q1") SolverReset SolverOk SetCell:="$N$1", MaxMinVal:=1, ValueOf:=0, ByChange:="$M$2:$M" & a, _ Engine:=3, EngineDesc:="Simplex LP" SolverAdd CellRef:="$O$1", Relation:=1, FormulaText:="80" SolverAdd CellRef:="$M$1", Relation:=2, FormulaText:="8" SolverAdd CellRef:="$P$1", Relation:=3, FormulaText:="5" SolverOk SetCell:="$N$1", MaxMinVal:=1, ValueOf:=0, ByChange:="$M$2:$M" & a, _ Engine:=3, EngineDesc:="Simplex LP" SolverAdd CellRef:="$M$2:$M" & a, Relation:=4, FormulaText:="integer" SolverAdd CellRef:="$M$2:$M" & a, Relation:=1, FormulaText:="1" SolverAdd CellRef:="$M$2:$M" & a, Relation:=3, FormulaText:="0" SolverOk SetCell:="$N$1", MaxMinVal:=1, ValueOf:=0, ByChange:="$M$2:$M" & a, _ Engine:=3, EngineDesc:="Simplex LP" SolverSolve ShowRef = 0 SolverReset SolverOk SetCell:="$N$1", MaxMinVal:=1, ValueOf:=0, ByChange:="$M$2:$M" & a, _ Engine:=3, EngineDesc:="Evolutionary" SolverAdd CellRef:="$O$1", Relation:=1, FormulaText:="80" SolverAdd CellRef:="$M$1", Relation:=2, FormulaText:="8" SolverAdd CellRef:="$P$1", Relation:=3, FormulaText:="5" SolverOk SetCell:="$N$1", MaxMinVal:=1, ValueOf:=0, ByChange:="$M$2:$M" & a, _ Engine:=3, EngineDesc:="Evolutionary" SolverAdd CellRef:="$M$2:$M" & a, Relation:=4, FormulaText:="integer" SolverAdd CellRef:="$M$2:$M" & a, Relation:=1, FormulaText:="1" SolverAdd CellRef:="$M$2:$M" & a, Relation:=3, FormulaText:="0" SolverOk SetCell:="$N$1", MaxMinVal:=1, ValueOf:=0, ByChange:="$M$2:$M" & a, _ Engine:=3, EngineDesc:="Evolutionary" SolverSolve ShowRef = 0 SolverReset SolverOk SetCell:="$N$1", MaxMinVal:=1, ValueOf:=0, ByChange:="$M$2:$M" & a, _ Engine:=3, EngineDesc:="Evolutionary" SolverAdd CellRef:="$O$1", Relation:=1, FormulaText:="80" SolverAdd CellRef:="$M$1", Relation:=2, FormulaText:="8" SolverAdd CellRef:="$P$1", Relation:=3, FormulaText:="5" SolverOk SetCell:="$N$1", MaxMinVal:=1, ValueOf:=0, ByChange:="$M$2:$M" & a, _ Engine:=3, EngineDesc:="Evolutionary" SolverAdd CellRef:="$M$2:$M" & a, Relation:=4, FormulaText:="integer" SolverAdd CellRef:="$M$2:$M" & a, Relation:=1, FormulaText:="1" SolverAdd CellRef:="$M$2:$M" & a, Relation:=3, FormulaText:="0" SolverOk SetCell:="$N$1", MaxMinVal:=1, ValueOf:=0, ByChange:="$M$2:$M" & a, _ Engine:=3, EngineDesc:="Evolutionary" SolverSolve ShowRef = 0 

你应该看到这是一个连续的过程。

  1. 获得最初的最佳解决scheme。
  2. 将最优值添加到约束系统。
  3. 再次解决整个问题,但是你的新目标是最大化(或者最小化)你感兴趣的variables。

所以你的第一个目标将被实现,并且通过将它的最优值添加到约束系统中,将不可能影响它。 而且,只要不干扰先前的目标,你的第二个目标也将实现。

实际上,这样做可以根据需要添加尽可能多的目标,并且可以按照词典顺序来解决(以前的目标更优先考虑)。