[Scip] Frage zu scipo_enfolp
Marco Rügen
mruegen at zedat.fu-berlin.de
Thu Jul 9 11:24:33 MEST 2009
Hi,
ich benutze Scip 1.1.0/Soplex1.4.0 um ein Binary Linear Program zu lösen.
Das besondere an meinem Problem ist, dass ich Constraints nicht im
vorraus hinzufügen möchte sondern erst wenn die bestimmte Ungeleichungen
verletzt wurden.
Ich möchte also ein Minimierungproblem lösen, dass zunächst keine
Constraints enthält.
Was ich getan habe:
Einen (und nur den einen) Constraint handler implementiert:
ConshdlrTriangles(
)
: ObjConshdlr("triangles", "Graph cluster triangles",
-1000000, 2, 1, -1, -1, -1, 0,
FALSE, FALSE, FALSE, TRUE)
So hat der Constraint Handler für das Constraint enforcement die höchste
Priorität und der Constraint Handler für den Feasibility check die
zweithöchste.
Was ich denke, dass SCIP nun tut:
SCIP relaxiert zunächst die Binary constraints und löst das LP.
Mit dieser LP Lösung ruft Scip die Callback function scip_enfolp meines
constraint handlers auf.
In dieser Funktion überprüfe ich, ob eine der Ungleichungen nicht
erfüllt wurde. Falls nicht füge ich dem Problem die entsprechenden
Constraints hinzu.
Habe ich neue Constraints hinzugefügt, setze ich das *resut argument auf
den Wert SCIP_CONSADDED.
Jetzt löst SCIP hoffentlich das LP nochmal (weil es ja neue Constraints
gibt).
Wird scip_enfolp aber das nächste mal aufgerufen, so verletzt die
aktuelle LP solution immer noch Ungleichungen, für die ich bereits
vorher Constraints hinzugefügt habe.
Wo liegt das Problem?
Nochmal was ich eigentlich tun will:
Constraints hinzufügen gleich nachdem SCIP für den jeweils bisherigen
Satz an Constraints eine valide LP Lösung gefunden hat.
Vielen Dank,
Marco
Zur Information:
Bsp. füge ich für die Ungleichung x1+x2-x3<=1 das Constraint
folgendermaßen hinzu:
SCIP_CONS* cons1;
SCIP_CALL_EXC(SCIPcreateConsLinear(scip, & cons1,
string(string(x1->name)+x2->name+x3->name+"_1").c_str(), 0, NULL, NULL,
-SCIPinfinity(scip), 1, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE,
FALSE, FALSE, FALSE));
SCIP_CALL_EXC(SCIPaddCoefLinear(scip, cons1, x1, 1.0));
SCIP_CALL_EXC(SCIPaddCoefLinear(scip, cons1, x2, 1.0));
SCIP_CALL_EXC(SCIPaddCoefLinear(scip, cons1, x3, -1.0));
SCIP_CALL_EXC(SCIPaddCons(scip, cons1));
More information about the Scip
mailing list