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
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
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
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