Линеаризация ограничения для 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

если я вставлю его именно так, я получу ошибку cplex 5002 (не является положительной полуопределенной), потому что формулировка не является линейной. Я сделал следующее, чтобы линеаризовать ограничение и избежать проблемы:

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);
    }
}
}

Теперь я получаю «Строка 'NB (9.7) .01' недопустима, все записи находятся на подразумеваемых границах». сообщение об ошибке. Я говорю мне, что ошибка заключается в этом ограничении, только когда начинаю его перебирать. Может ли кто-нибудь сказать мне, где моя ошибка, или иным образом подтвердить, что она должна быть где-то еще?


person Hendrik    schedule 18.10.2015    source источник


Ответы (1)


Хорошо, проблема в том, что я забыл нейтрализующую «1» в первом члене неравенства. Следовательно, должно быть:

-2000(1-w[i][j][q][k]) +t[i][j]+s[i]+d[i][j]-t[i][k] <= 0

Поскольку «1» отсутствовала в первом члене, левая часть неравенства не была нейтрализована для случая w [i] [j] [q] [k] == 1.

person Hendrik    schedule 19.10.2015