Я довольно новичок в 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). Это что-то меняет? Я действительно не понимаю, в чем проблема.
Благодаря
Отлично, спасибо! В очень близкой теме: следует ли мне беспокоиться о том, что существует так много «тривиальных» равенств (ограничения, называемые «e»)? Я просто хочу иметь их для удобочитаемости, но я не хочу, чтобы они делали CPLEX медленным. Главные решения, которые должен выполнить cplex, это бинарные переменные для моей проблемы. – ddeunagomez
Лично я не могу сказать, повлияет ли это на производительность или нет в конце (вы не сказали, насколько велики будут ваши проблемы, и у вас не было ограничения времени). Моделирование может быть самой формой искусства. С точки зрения программирования я не поклонник включения вещей, которые не являются существенными (т. Е. Я бы не добавлял их, пока они на самом деле не нужны). Тем не менее, вы сказали, что это для читаемости (что важно), и проблема будет усложняться (предположительно это означает, что в какой-то момент они понадобятся). Так что, возможно, это скорее вопрос вкуса. – rkersh
Вы, вероятно, правы, я не думаю, что они мне нужны, I_XX выиграл, а можно использовать где-нибудь еще, это просто «XX» имеет реальное значение при просмотре краев в графе для моей проблемы. Но вы правы, я избавлюсь от них, они не очень помогают. Что касается размера, я планировал обходить 10^6 равенств размером не более 16 (lx и ex в моей модели объединились), а затем 10^6 ограничений индикатора. Всего 10^6 неизвестных. Это порядок величины CPLEX может справиться? Спасибо – ddeunagomez