为什么AMPL无法解决优化失败问题

问题描述 投票:0回答:2

我有一个问题不知道如何解决。在我的 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

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

mathematical-optimization cplex ampl
2个回答
2
投票

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

0 = 12792

这并不是说您的模型中没有变量。您甚至可能在该约束中包含变量,但 presolve 会计算出在任何可行解决方案中它们的值必须是什么,并将它们替换为这些值。


0
投票

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

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

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

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

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

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

option presolve 0;

这可能会减慢速度,因此一旦您处理了不可行的原因,请使用

重新启用它
option presolve 10;

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

© www.soinside.com 2019 - 2024. All rights reserved.