【问题标题】:why AMPL can't solve the optimization failure为什么AMPL不能解决优化失败
【发布时间】:2016-01-07 03:05:38
【问题描述】:

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

当我尝试通过 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

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

【问题讨论】:

  • 请发布您的模型或变量定义的相关部分,以便这里的人可以更好地提供帮助。

标签: mathematical-optimization cplex ampl


【解决方案1】:

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

0 = 12792

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

【讨论】:

  • 感谢您的回复。但是您知道如何检查导致这种问题的约束吗?谢谢。
【解决方案2】:

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

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

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

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

发生这种情况时,它永远不会将问题发送给求解器,因此求解器无法为您提供 IIS。如果您想“快速失败”,那就太好了,如果您想知道失败的原因,那就不好了。

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

option presolve 0;

这可能会使事情变慢一点,所以一旦你处理了不可行的原因,重新启用它

option presolve 10;

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

【讨论】:

    猜你喜欢
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    相关资源
    最近更新 更多