java/cplex约束的线性化
我需要在java/cplex程序中加入一个约束。约束条件是:
(forall q: x[i][j][q][k])(t[i][k]+s[i]+distance[i][j]-t[j][k]) <= 0 forall k, i, j
如果我这样放进去,我会得到CPLEX5002(不是半正定的)误差,因为公式不是线性的。我执行了以下操作来线性化约束并避免问题:
for(int k=0; k<Ausführung.k; k++){
for(int i=1; i<grossI.length; i++){
for(int j=1; j<grossJ.length; j++){
//for(int q=1; q<grossQ.length; q++){
IloLinearNumExpr sumLastTerm = model.linearNumExpr();
for(int q=1; q<grossQ.length; q++){
sumLastTerm.addTerm(-1.0, w[i][j][q][k]);
}
IloConstraint con = model.addLe(model.sum(model.prod(-2000, sumLastTerm), model.sum(t[i][k], model.sum(Data.service[i], model.sum(distance[i][j], model.prod(-1.0, t[j][k]))))), 0);
con.setName("NB (9.7)."+k + i);
}
}
}
现在,我得到一个“Row'NB(9.7).01'不可行,所有条目都在隐含边界上。”错误消息。我告诉我,错误就在这个约束中,就在开始遍历它的时候。有谁能告诉我我的错误在哪里,或者以其他方式证实它一定在别的地方
# 1 楼答案
好的,问题是我忘记了不等式第一项中的中和“1”。因此,它应该是:
由于第一项中缺少“1”,因此对于w[i][j][q][k]==1的情况,不等式的左部分没有被中和