0

Ich bin ziemlich neu in CPLEX und ich schreibe ein sehr einfaches Modell, das CPLEX nicht erfüllen will. Ich weiß, dass mein Modell "ausführlich" ist, da ich Variablen habe, die einfach anderen Variablen entsprechen, aber es ist mein erster Schritt zu einem komplizierteren Modell, also möchte ich es so. Ich verstehe nicht, warum das CPLEX verärgern würde.CPLEX ersetzt die Gleichheit nicht korrekt?

Das Modell, das ich habe, ist:

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 

Diese anscheinend keine Lösung haben (es tut, oder zumindest das ist meine Absicht, aber CPLEX sagt nein!).

Aber dann ersetze ich die Gleichung e8 in l3 und ich bekomme die Lösung, die ich wollte! Hier ist der Code:

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 

Beide sind meine Augen, die genau das gleiche Modell. Was mache ich falsch, damit das erste Modell keine Lösung hat, obwohl es der zweiten entspricht, die eine Lösung hat?

Btw, die Lösung ist:

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 

Das Problem selbst nicht einmal ein MIP ist (weil ich meine booleans in dieser ersten Version behoben, aber es wird eine richtige MIP sein). Ändert das etwas? Ich sehe wirklich nicht, was das Problem ist.

Dank

Antwort

1

Ich glaube, das Problem auf die Tatsache zurückzuführen ist, dass I_CA standardmäßig von 0. Im Bounds Abschnitt im documentation for the LP format es sagt

auch verpflichtet, ein niedriger hat

obere und untere Grenze kann separat eingegeben werden ... mit der Standarduntergrenze von 0 (Null) und der Standardobergrenze von + ∞ bleibt in Kraft, bis die Grenze explizit geändert wird.

Wenn Sie I_CA free zu den Grenzen für Ihre erste LP-Datei hinzufügen, wird es machbar.

+0

Großartig, danke! In einem sehr verwandten Thema: sollte ich besorgt sein über so viele "triviale" Gleichheiten (die Einschränkungen namens "e")? Ich möchte sie nur zur besseren Lesbarkeit haben, aber ich möchte nicht, dass sie CPLEX verlangsamen. Die Hauptentscheidungen, die cplex treffen muss, sind die binären Variablen für mein Problem. – ddeunagomez

+0

Persönlich kann ich nicht sagen, ob dies die Leistung beeinflussen wird oder nicht (Sie haben nicht gesagt, wie groß Ihre Probleme sein werden und ob Sie eine zeitliche Beschränkung hatten). Modellierung kann eine Kunstform für sich sein. Aus der Sicht der Programmierung bin ich kein Fan von Dingen, die nicht essentiell sind (d. H., Ich würde sie nicht hinzufügen, bis sie tatsächlich benötigt werden). Sie haben jedoch gesagt, dass dies der Lesbarkeit dient (was wichtig ist) und dass das Problem komplexer wird (was vermutlich bedeutet, dass sie irgendwann benötigt werden). Also, vielleicht ist es mehr eine Frage des Geschmacks. – rkersh

+0

Sie haben wahrscheinlich recht, ich glaube nicht, dass ich sie brauche, das I_XX hat gewonnen, t wird nirgendwo sonst verwendet, es ist nur das "XX" hat eine tatsächliche Bedeutung beim Betrachten von Kanten in einem Graphen für mein Problem. Aber du hast recht, ich werde sie loswerden, sie helfen nicht wirklich viel. Was die Größe anbelangt, plane ich, ungefähr 10^6 Gleichheiten der Größe höchstens 16 (die lx und ex in meinem Modell zusammengeführt), dann 10^6 Indikatorbeschränkungen. Insgesamt 10^6 Unbekannte. Ist das eine Größenordnung, die CPLEX bewältigen kann? Danke – ddeunagomez