[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