AMPL中的条件约束

时间:2017-06-25 11:38:47

标签: linear-programming ampl

我正在尝试使用AMPL多次运行单个模型。所有变量和参数都具有时间维度,因为它们的值随着模型的每次迭代而变化。

我已经使用问题陈述定义了模型,以便能够迭代地解决它。

problem MIQP_Complex_CR{t in T}: Dev,
                       {i in A} dx[i,t], {i in A} dy[i,t], {i in A} uarg[i,t], 
                       {i in A} larg[i,t],{(i,j) in P} vrx[i,j,t], 
                       {(i,j) in P} vry[i,j,t], {(i,j) in P} z[i,j,t], 
                       {(i,j) in P} bin11[i,j,t], {(i,j) in P} bin12[i,j,t],
                       {(i,j) in P} bin311[i,j,t], {(i,j) in P} bin312[i,j,t], 
                       {(i,j) in P} bin321[i,j,t], {(i,j) in P} bin322[i,j,t], 
                       {(i,j) in P} bin331[i,j,t], {(i,j) in P} bin332[i,j,t], 
                       {(i,j) in P} bin341[i,j,t], {(i,j) in P} bin342[i,j,t],                  
                       {(i,j) in P} cvrx[i,j,t], {(i,j) in P} cvry[i,j,t];

有一组数字1..n。集合P只是A的成员,在A中排序为i,j在i中小于j。有些约束(例如上面的bin311)只有在变量满足某些条件时才会被激活。因此,将仅针对某些变量调用每个约束。例如,

s.t. bin342{(i,j) in P, t in T : xrRoll[i,j,t] < 0 and yrRoll[i,j,t] < 0} : -2*a[i,j,t]*vrx[i,j,t] + vry[i,j,t]*(c[i,j,t] + sqrt(c[i,j,t]**2 - 4*a[i,j,t]*b[i,j,t])) <= z[i,j,t]*Mbin342[i,j,t];

因此,如果P的成员不满足条件,则不应该为该成员打开约束。问题在于 - 在binxyz系列的这一系列约束中,无论P的成员是否满足条件,都会激活最后一个约束(并且只有这个约束)。由于P中总有一对(i,j)不满足它,因此对于该对P的约束显示“无效下标”错误。

这总是发生在最后一个约束,而P的第一个成员无法满足此约束条件。如果我更改模型定义中约束的顺序,则最后一个给出错误。如果我注释掉一些约束,那么最后一个约束也会给出错误。只有当我删除所有binxyz约束时,问题才会解决,但显然不如我想要的那样准确。请帮忙。

谢谢!

0 个答案:

没有答案