2016-05-21 5 views
1

Wie schreibe ich solche Einschränkungen in CPLEX (Linear-Programmierung)?Einschränkungen - lineare Programmierung- CPLEX

forall(p in P, x in X, y in Y) 
    if ((remx[p,x] <= 0) OR (remy[p,y] <= 0)) then 
    pbl[p,x,y] == 0 // MUST be 0 
    else 
    pbl[p,x,y] == 1 OR == 0 // can be 0 or 1 

wo PBL eine Entscheidungsvariable ist (Matrix), und REMx Remy ist eine normale variable Matrix und p, x, y Indizes sind.

kann ich nicht verwenden, wenn-dann

Danke, glaube

Antwort

1

ich dies nicht mit (kontinuierlich) lineare Programmierung durchgeführt werden kann, sondern gemischt-ganzzahlige Programmierung mit uns Binärgrößen verwenden können.

Eine Möglichkeit, dies zu attackieren wird mit einer Reihe von Ungleichheiten, so etwas wie:

remx[p,x] <= 0 + bx[p,x]*M 
remx[p,x] >= 0 - (1-bx[p,x])*M 
remy[p,y] <= 0 + by[p,y]*M 
remy[p,y] >= 0 - (1-by[p,y])*M 
pbl[p,x,y] >= bx[p,x]+by[p,y]-1 
pbl[p,x,y] <= bx[p,x] 
pbl[p,x,y] <= bx[p,x] 
bx[p,x],bx[p,x] in {0,1} 

wo M eine ausreichend große Zahl anzeigt (sie bilden eine Schranke für remx und remy). Alternativ können Sie die Anzeige Einschränkungen in Cplex verwenden Auswirkungen zu modellieren:

bx[p,x]=0 => remx[p,x] <= 0 
bx[p,x]=1 => remx[p,x] >= 0 
by[p,y]=0 => remy[p,y] <= 0 
by[p,y]=1 => remy[p,y] >= 0 
pbl[p,x,y] = 1 => bx[p,x]+by[p,y] = 2 
pbl[p,x,y] = 0 => bx[p,x]+by[p,y] <= 1 

(Hinweis: Die Frage hat sich geändert, so dass diese Fragmente nicht mehr 100% richtig).

+0

Es funktioniert! Aber ich habe etwas ... pbl [p, x, y] muss 0 sein, wenn die Bedingung wahr ist, aber wenn nicht, könnte 1 oder 0 sein ... Ich meine, es gibt andere Einschränkungen, die das verwalten –

+1

One Weg Implikationen sind in der Regel einfacher zu modellieren –

+0

Also, ist es möglich, es ohne gemischt-ganzzahlige Programmierung zu tun? –