0

Я довольно новичок в CPLEX, и я пишу очень простую модель, которую CPLEX не хочет удовлетворять. Я знаю, что моя модель «verbose», поскольку у меня есть переменные, которые просто равны другим переменным, но это мой первый шаг к более сложной модели, поэтому я хочу ее таким образом. Я не понимаю, почему это расстроило CPLEX.CPLEX не заменит правильное равенство?

Модель у меня есть:

Minimize 
obj: v1 
Subject To 

l1: i_AB1 + i_AC1 - i_AB2 - i_AC3 = 1 
l2: - i_AB1 + I_BB = 0 
l3: I_CA + I_CC = 0 


e5: i_AB2 + i_BD2 - I_BB = 0 

e8: - i_AC1 - I_CA = 0 
e9: i_AC3 + i_CD3 - I_CC = 0 


\Indicator constraints 

\For each connection XY 

c1: bAB = 1-> i_AB1 - 1 v1 = 0 
c2: bAB = 1-> i_AB2 - 1 v2 = 0 

c5: bAC = 1-> i_AC1 - 1 v1 = 0 
c6: bAC = 1-> i_AC3 - 1 v3 = 0 

c9: bBD = 1-> i_BD2 - 1 v2 = 0 

c13: bCD = 1-> i_CD3 - 1 v3 = 0 

c15: bAB = 1 
c16: bAC = 1 
c17: bBD = 1 
c18: bCD = 1 


Bounds 
    0 <= v1 <= 1000 
-1000 <= v2 <= 1000 
-1000 <= v3 <= 1000 


General 

Binaries 
bAB bAC bBD bCD 
End 

Это, по-видимому, не имеет решения (это делает, или, по крайней мере, это мое намерение, но CPLEX говорит нет!).

Но тогда я подставляю уравнение e8 в l3, и я получаю решение, которое я хотел! Вот код:

Minimize 
obj: v1 
Subject To 


\budget: 

l1: i_AB1 + i_AC1 - i_AB2 - i_AC3 = 1 
l2: - i_AB1 + I_BB = 0 
l3: - i_AC1 + I_CC = 0 

e5: i_AB2 + i_BD2 - I_BB = 0 

\Row C 
\e8: - i_AC1 - I_CA = 0 
e9: i_AC3 + i_CD3 - I_CC = 0 


\Indicator constraints 

\For each connection XY 

c1: bAB = 1-> i_AB1 - 1 v1 = 0 
c2: bAB = 1-> i_AB2 - 1 v2 = 0 

c5: bAC = 1-> i_AC1 - 1 v1 = 0 
c6: bAC = 1-> i_AC3 - 1 v3 = 0 

c9: bBD = 1-> i_BD2 - 1 v2 = 0 

c13: bCD = 1-> i_CD3 - 1 v3 = 0 

c15: bAB = 1 
c16: bAC = 1 
c17: bBD = 1 
c18: bCD = 1 


Bounds 
    0 <= v1 <= 1000 
-1000 <= v2 <= 1000 
-1000 <= v3 <= 1000 


General 

Binaries 
bAB bAC bBD bCD 
End 

Оба, на мой взгляд, точно такая же модель. Что я делаю неправильно, так что первая модель не имеет решения, хотя она кажется эквивалентной второй, которая имеет решение?

Btw, решение:

Populate: phase I 
Tried aggregator 2 times. 
MIP Presolve eliminated 4 rows and 4 columns. 
Aggregator did 11 substitutions. 
All rows and columns eliminated. 
Presolve time = 0.00 sec. 

Populate: phase II 
Solution status: 129. 
Objective value of the incumbent: 1 
Incumbent: Column v1: Value =     1 
Incumbent: Column i_AB1: Value =     1 
Incumbent: Column i_AC1: Value =     1 
Incumbent: Column i_AB2: Value =    0.5 
Incumbent: Column i_AC3: Value =    0.5 
Incumbent: Column I_BB: Value =     1 
Incumbent: Column I_CC: Value =     1 
Incumbent: Column i_BD2: Value =    0.5 
Incumbent: Column i_CD3: Value =    0.5 
Incumbent: Column bAB: Value =     1 
Incumbent: Column v2: Value =    0.5 
Incumbent: Column bAC: Value =     1 
Incumbent: Column v3: Value =    0.5 
Incumbent: Column bBD: Value =     1 
Incumbent: Column bCD: Value =     1 

The solution pool contains 1 solutions. 
0 solutions were removed due to the solution pool relative gap parameter. 
In total, 1 solutions were generated. 
The average objective value of the solutions is 1. 

Solution  Objective Number of variables 
       value  that differ compared to 
          the incumbent 
p1    1   0/15 

сама проблема даже не MIP (потому что я установил мои булевы в этой первоначальной версии, но это будет правильный MIP). Это что-то меняет? Я действительно не понимаю, в чем проблема.

Благодаря

ответ

1

Я считаю, что проблема связана с тем, что по умолчанию I_CA имеет нижнюю границу 0. В разделе Bounds в documentation for the LP format он говорит

Верхняя и нижняя границы могут также вводится отдельно ... с нижней нижней границей 0 (ноль) и верхней границей по умолчанию + ∞, оставшейся до тех пор, пока граница не будет явно изменена.

Если вы добавите I_CA free в раздел границ вашего первого файла LP, тогда это станет возможным.

+0

Отлично, спасибо! В очень близкой теме: следует ли мне беспокоиться о том, что существует так много «тривиальных» равенств (ограничения, называемые «e»)? Я просто хочу иметь их для удобочитаемости, но я не хочу, чтобы они делали CPLEX медленным. Главные решения, которые должен выполнить cplex, это бинарные переменные для моей проблемы. – ddeunagomez

+0

Лично я не могу сказать, повлияет ли это на производительность или нет в конце (вы не сказали, насколько велики будут ваши проблемы, и у вас не было ограничения времени). Моделирование может быть самой формой искусства. С точки зрения программирования я не поклонник включения вещей, которые не являются существенными (т. Е. Я бы не добавлял их, пока они на самом деле не нужны). Тем не менее, вы сказали, что это для читаемости (что важно), и проблема будет усложняться (предположительно это означает, что в какой-то момент они понадобятся). Так что, возможно, это скорее вопрос вкуса. – rkersh

+0

Вы, вероятно, правы, я не думаю, что они мне нужны, I_XX выиграл, а можно использовать где-нибудь еще, это просто «XX» имеет реальное значение при просмотре краев в графе для моей проблемы. Но вы правы, я избавлюсь от них, они не очень помогают. Что касается размера, я планировал обходить 10^6 равенств размером не более 16 (lx и ex в моей модели объединились), а затем 10^6 ограничений индикатора. Всего 10^6 неизвестных. Это порядок величины CPLEX может справиться? Спасибо – ddeunagomez

Смежные вопросы