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

时间:2016-01-07 03:05:39

标签: mathematical-optimization cplex ampl

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

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

2 个答案:

答案 0 :(得分:1)

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

0 = 12792

并不是说你的模型中没有变量。你甚至可能在该约束中有变量,但是presolve会在任何可行的解决方案中弄清楚它们的值必须采取什么并将其删除。

答案 1 :(得分:0)

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

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

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

但是,当您使用AMPL时,通常首先运行“预解决”步骤。此步骤尝试通过删除冗余约束,设置每个变量范围的边界等来减小问题的大小。有时,presolve会识别不可行性,并给出一个类似于你的例子的信息(参见David的解释)。

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

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

option presolve 0;

这可能会使事情变得缓慢,所以一旦你处理了不可行的原因,请用

重新启用它。
option presolve 10;

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