是否可以在AMPL条件语句中使用,例如“if(...)then ...”?下面是我试图做的。
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.
你有什么想法来解决这个问题吗?
答案 0 :(得分:1)
如果条件(if-then-else
和if
之间的表达式)不包含变量,则可以对CPLEX使用then
表达式。 CPLEX还支持所谓的“指标约束”(有关详细信息,请参阅here),它使用蕴涵运算符(==>
)并且与if-then-else
有些类似,但允许条件中的变量。 / p>
关于您的示例,不清楚哪些名称对应于变量以及哪些名称对应于约束,但错误表明问题不是由if-then-else
引起的,而是因为您在不受支持的形式中存在二次约束CPLEX(有关接受表单的信息,请参阅ILOG AMPL CPLEX System User's Guide第33页的二次约束一节)。
答案 1 :(得分:1)
你可以改变你的求解器cplex只处理凸和二次约束,它默认用于Ampl分辨率,所以你可以尝试重新加载你的mod和dat文件,然后选择另一个求解器如下:
ampl: option solver " ipopt";
ampl: solve;
或
ampl: option solver " couenne";
ampl: solve;