2013-03-17 17 views
5

Ecco il mio problema completo:Come posso scrivere una condizione if per la mia variabile in GLPK?

enter image description here

Informazioni:

* Max. investimento totale: $ 125

* pay-off è la somma delle unità comprato x pay-off/unità

* Costo dell'investimento: Buy-in di costo + costo/unità x numero di quote, se si acquista presso almeno un'unità

* Il costo è somma dei costi per gli investimenti

Vincoli:

* L'utente non può investire sia in 2 e 5.

* Y Puoi investire in 1 solo se investi almeno uno tra 2 e 3.

* Devi investire almeno due di 3,4,5.

* Non è possibile investire più del numero massimo di unità.

Problema: Massimizzare il profitto: pay-off - costo

xi: # of units i ∈ {1,2,3,4,5} 
yi=1 if xi>0 else yi=0 
cost = sum{i in I} buyInCost_i * yi + cost-unit_i*xi 
pay-off = sum{i in I} (pay-off/unit)_i*xi 
profit = pay-off - cost 

Maximize profit 

Subject to 

y2+y5 <= 1 
y1<= y2+y3 
y3+y4+y5 >= 2 
x1<=5, x2<=4, x3<=5, x4<=7, x5<=3 
cost<=125 

Ecco la mia domanda:

Per esempio io ho questa variabile binaria y

yi=1 if xi>0 else yi=0 and i ∈ {1,2,3,4,5} 

io ho dichiarato come set di dati

set I; 

data; 

set I := 1 2 3 4 5; 

Non so come aggiungere la condizione if else alla variabile y in glpk. Puoi aiutarmi per favore?

mio modellazione:

set I; 

/*if x[i]>0 y[i]=1 else y[i]=0 ?????*/ 
var y{i in I}, binary; 

param a{i in I}; 
/* buy-in cost of investment i */ 

param b{i in I}; 
/* cost per unit of investment i */ 

param c{i in I}; 
/* pay-off per unit of investment i */ 

param d{i in I}; 
/* max number of units of investment i */ 

var x{i in I} >=0; 
/* Number of units that is bought of investment i */ 

var po := sum{i in I} c[i]*x[i]; 

var cost := sum{i in I} a[i]*y[i] + b[i]*x[i]; 

maximize profit: po-cost; 

s.t. c1: y[2]+y[5]<=1; 
s.t. c2: y[1]<y[2]+y[3]; 
s.t. c3: y[3]+y[4]+y[5]>=2; 
s.t. c4: x[1]<=5 
    x[2]<=4 
    x[3]<=5 
    x[4]<=7 
    x[5]<=3; 

s.t. c5: cost <=125; 
s.t. c6{i in I}: M * y[i] > x[i]; // if condition of y[i] 

set I := 1 2 3 4 5; 
param a := 
1 25 
2 35 
3 28 
4 20 
5 40; 

param b := 
1 5 
2 7 
3 6 
4 4 
5 8; 

param c := 
1 15 
2 25 
3 17 
4 13 
5 18; 

param d := 
1 5 
2 4 
3 5 
4 7 
5 3; 

param M := 10000; 

sto ottenendo questo errore di sintassi:

 problem.mod:21: syntax error in variable statement 
     Context: ...I } ; param d { i in I } ; var x { i in I } >= 0 ; var po := 
     MathProg model processing error 
+0

Che cos'è x_i? È una variabile continua, integer o binaria o è in input di dati? – raoulcousins

+0

xi è il numero del prodotto i che viene acquistato. Questi valori dovrebbero essere trovati dal programma per ottimizzare. –

+0

Penso che la tua risposta potrebbe essere qui, ma non ho mai usato GLPK: http://en.wikibooks.org/wiki/GLPK/GMPL_Workarounds – raoulcousins

risposta

8

Non si può direttamente farlo (non c'è modo di scrivere 'direttamente' un vincolo in una if LP).

Tuttavia, ci sono soluzioni alternative per questo. Ad esempio, è possibile scrivere:

M * yi > xi 

dove M è un grande costante (superiore a qualsiasi valore di xi).

questo modo:

  • se xi > 0, quindi il vincolo è equivalente a yi > 0, che è yi == 1 dal yi è binaria (se M è abbastanza grande).
  • se xi == 0, quindi il vincolo viene sempre verificato e yi sarà uguale a 0 poiché il tuo obiettivo è in aumento con yi e stai riducendo a icona.

in entrambi i casi, il vincolo è equivalente al test if.

+0

Grazie, Nicholas. Ho eseguito il mio codice ma mi ha dato questo errore di sintassi e non riesco a capirlo. Puoi aiutarmi per favore? Ho modificato la mia domanda con il mio errore di modellazione e sintassi. –

+0

Mi dispiace, non conosco il tuo linguaggio di modellazione; tuttavia, sembra che la tua dichiarazione 'var {x in I}> = 0;' non sia corretta. Potrebbe esserci un modo migliore per farlo, ma ti suggerisco di dichiarare la variabile come gli altri 'var {x in I};' e quindi aggiungi 'x [i]> = 0' come hai fatto con gli altri vincoli (per ogni 'i'). Se questo non funziona, ti suggerisco di postare un'altra domanda specifica sull'errore di sintassi nel tuo modello, più probabilmente otterrai aiuto (ci sono poche possibilità che qualcuno guardi questa domanda ora, dato che hai accettato una risposta). –

+0

Inoltre, se aggiungi un'altra domanda, dovresti aggiungere un tag per il linguaggio di modellazione specifico che usi (sembra per me "ampl", ma non ne sono sicuro e, come ho detto, non li uso) . 'glpk' è in realtà il lp solver 'core': può essere usato con un programma stand-alone, come' glpsol', ecc; ma è anche una libreria 'C', quindi taggare' glpk' è un po 'fuorviante (i tuoi problemi sembrano essere più con il linguaggio di modellazione che con il solutore stesso). –