1

是否可以在诸如“if (...) then...”之类的 AMPL 条件语句中使用?下面显示了我试图做的事情。

subject to c1a {k in K, o in O, n in N: n!=t[k,o]}:
sum{e in E}
   (a[n,e]*x[e,k,o]) -
sum{e in E}
   (b[n,e]*x[e,k,o]) =
            (if (r[n,k]==1 and f[n,o]==1) 
                then d[k,o]*(1-f[k,o])
                else 0);

我的放大器返回给我的错误如下:

CPLEX 11.2.0: Constraint _scon[1] is not convex quadratic since it is an equality constraint.

你有什么想法可以解决这个问题吗?

4

2 回答 2

1

如果条件(和之间的表达式)不包含变量,则可以将if-then-else表达式与 CPLEX一起使用。CPLEX 还支持所谓的“指示符约束”(有关更多详细信息,请参阅此处),它使用蕴含运算符 ( ) 并且有点类似于,但允许条件中的变量。ifthen==>if-then-else

关于您的示例,尚不清楚哪些名称对应于变量以及哪些名称对应于约束,但错误表明问题不是由于if-then-else,而是因为您有一个 CPLEX 不支持的形式的二次约束(请参阅关于ILOG AMPL CPLEX 系统用户指南的第 33 页,了解有关接受的表格的信息)。

于 2013-05-11T14:24:55.580 回答
1

您可以更改求解器 cplex 仅处理凸和二次约束,并且在 Ampl 分辨率中默认使用它,因此您可以尝试重新加载您的 mod 和 dat 文件,然后选择另一个求解器,如下所示:

ampl: option solver " ipopt";
ampl: solve;

或者

ampl: option solver " couenne";
ampl: solve;
于 2015-03-09T11:54:19.727 回答