CPLEX неправильно заменяет равенство?

Я новичок в CPLEX и пишу очень простую модель, которой 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

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

Кстати, решение:

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). Это что-то меняет? Я действительно не понимаю, в чем проблема.

Спасибо


person excalibur1491    schedule 10.07.2016    source источник


Ответы (1)


Я считаю, что проблема связана с тем, что по умолчанию I_CA имеет нижнюю границу 0. В разделе «Границы» в документация для формата LP, в которой говорится

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

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

person rkersh    schedule 10.07.2016
comment
Большое спасибо! В очень близкой теме: стоит ли мне беспокоиться о наличии такого количества тривиальных равенств (ограничения, называемые e)? Я просто хочу, чтобы они были удобочитаемыми, но я не хочу, чтобы они замедляли работу CPLEX. Главное решение, которое должен сделать cplex, - это бинарные переменные для моей проблемы. - person excalibur1491; 11.07.2016
comment
Лично я не могу сказать, повлияет ли это на производительность или нет в конечном итоге (вы не сказали, насколько велики будут ваши проблемы, и есть ли у вас какие-то временные ограничения). Моделирование само по себе может быть видом искусства. С точки зрения программирования, я не поклонник включения несущественных вещей (т.е. я бы не стал добавлять их, пока они действительно не понадобятся). Однако вы сказали, что это для удобочитаемости (что важно) и что проблема станет более сложной (предположительно, это означает, что они понадобятся в какой-то момент). Так что, возможно, это больше дело вкуса. - person rkersh; 11.07.2016
comment
Вы, вероятно, правы, я не думаю, что они мне нужны, I_XX не будет использоваться где-либо еще, просто XX имеет реальное значение при просмотре ребер на графике для моей задачи. Но вы правы, я избавлюсь от них, они особо не помогают. Что касается размера, я планировал обойти 10 ^ 6 равенств размера не более 16 (lx и ex в моей модели объединены вместе), а затем 10 ^ 6 ограничений индикатора. Всего 10 ^ 6 неизвестных. Может ли CPLEX справиться с этим на порядок? Спасибо - person excalibur1491; 12.07.2016
comment
Да, CPLEX может справиться с проблемой такого размера. См., Например, это ветка developerWorks здесь для получения более подробной информации. - person rkersh; 12.07.2016