Как линеаризовать невыпуклое ограничение? - PullRequest
0 голосов
/ 20 мая 2019

Я студент инженерного факультета и новый пользователь CPLEX.Когда я запускаю свой скрипт, он говорит, что одно из моих ограничений не выпуклое.Я знаю, что должен линеаризовать его, но я не знаю, как.

x[i][j] - это двоичная переменная.

E[i] - это непрерывная переменная, которая зависит от x[i][j].

eev[i] - это вход (энергия, потраченная на маршруте i).

edh[i] - это вход (энергия, потраченная от i до j).emax также является входом, константой.Является ли начальный уровень заряда батареи максимальным.

Это часть составления расписания для электромобилей, а E[i] - это энергия, оставшаяся на этом транспортном средстве после выполнения маршрута i.

Как можноЯ линеаризую следующее ограничение, чтобы оно не было невыпуклым:

E[j] <= (E[i]-edh[i][j]-eev[j])*x[i][j]+emax*(1-x[i][j])

Я знаю, как его линеаризовать, если бы оно было таким:

E[j] == (E[i]-edh[i][j]-eev[j])*x[i][j]+emax*(1-x[i][j])

Но это не то, чтоМне нужен мой сценарий.

Заранее большое спасибо!

1 Ответ

0 голосов
/ 20 мая 2019

Вы можете изменить

E[j] <= (E[i]-edh[i][j]-eev[j])*x[i][j]+emax*(1-x[i][j])

в

E[j] <= E[i]*x[i][j]-edh[i][j]*x[i][j]-eev[j]*x[i][j]+emax*(1-x[i][j])

и чтобы справиться с E [i] * x [i] [j], который является продуктом между двоичной переменной решения и другой переменной решения, на которую можно положиться

https://www.ibm.com/developerworks/community/forums/html/topic?id=aa9aa3db-4fbc-4209-a767-5b5e54902cbd&ps=25

Я предоставил 3 способа.

Один из них должен повернуть

dvar int x in 2..10;
dvar boolean b;

maximize x;
subject to
{
b*x<=7;
}

в

dvar int x in 2..10;
dvar boolean b;

dvar int bx;

maximize x;
subject to
{
bx<=7;



2*b<=bx;
bx<=10*b;

bx<=x-2*(1-b);
bx>=x-10*(1-b);
}
...