为什么AMPL不能解决优化失败

why AMPL can't solve the optimization failure

我有一个不知道如何解决的问题。在我的 AMPL 模型中,1B12 是一个属于集合的项目。

而当我尝试通过 AMPL + cplex 解决问题时,AMPL 命令显示

presolve, constraint production['1B12']:
no variables, but lower bound = 12792, upper = 12792

而且 AMPL 没有给我想要的最优值。我是AMPL的新手,不知道句子是什么意思,尤其是句子

no variables, but lower bound = 12792, upper = 12792

事实上,我在加载数据时检查了 1B12 在我的集合中,因此我很困惑为什么 AMPL 说 no variables

希望有人能帮我解决这个问题。谢谢!

AMPL 报告特定行(约束)在右侧没有变量, 它运行其预求解算法之后。所以约束变为

0 = 12792

这并不是说您的模型中没有变量。您甚至可能在该约束中有变量,但 presolve 会计算出它们的值在任何可行的解决方案中必须采用的值并将它们删除。

这有点晚了,但也许会对其他人有所帮助...

某些求解器(包括 CPLEX)具有 "IIS" 选项,可帮助诊断不可行性。当求解器检测到不可行性时,它将寻找 "irreducibly infeasible subset" 个约束。这是一组不一致的约束(即不可能一次满足所有约束),但如果删除其中任何一个约束,则可以解决其余约束。根据 IIS 的大小,这对于找出问题所在非常有帮助。

(请注意,如果您的模型中有多个 "bad constraint",IIS 可能不会包含所有这些;在这种情况下,您可能需要一次处理一个。)

但是,当您使用 AMPL 时,通常它会先运行 "presolve" 步骤。此步骤试图通过删除冗余约束、为每个变量设置范围界限等来减小问题的规模。有时 presolve 会识别不可行性,并给出类似于您示例中的消息(参见 David 的解释)。

发生这种情况时,它永远不会将问题发送给求解器,因此求解器无法为您提供 IIS。如果你想"fail fast"很好,如果你想知道失败的原因就不好。

要解决这个问题,您可以关闭预求解:

option presolve 0;

这可能会稍微减慢速度,所以一旦您解决了不可行的原因,re-enable 就可以

option presolve 10;

AMPL 手册的第 14 章给出了使用 CPLEX 的 IIS 功能的示例。