Problema di RO in OPL
Salve a tutti! Da qualche giorno sto lavorando su un problema di RO, materia a cui mi sto approcciando da poco ma che mi affascina
Il problema è il seguente: https://drive.google.com/file/d/0B09vVJ ... sp=sharing
Purtroppo non sono sicuro di averne individuato la tipologia e questo non mi consente di formulare un modello matematico da poter implementare via software.
Spero che qualcuno abbia qualche suggerimento in merito, di sicuro ho ancora molto da imparare!
Grazie in anticipo!

Il problema è il seguente: https://drive.google.com/file/d/0B09vVJ ... sp=sharing
Purtroppo non sono sicuro di averne individuato la tipologia e questo non mi consente di formulare un modello matematico da poter implementare via software.

Spero che qualcuno abbia qualche suggerimento in merito, di sicuro ho ancora molto da imparare!
Grazie in anticipo!

Risposte
Rivedendola la modificherei così:
$min \sum_{i=1}^3 sum_{j=1}^10 c_(i,j) y_(i,j)+ 11/10 sum_{i=1}^3 sum_{j=1}^10 f_(i,j) y_(i,j) + 0sum_{i=1}^3 sum_{j=1}^5 x_(i,j) $
$s.t $
$ sum_{j=1}^5 x_(i,j) <= p_i$ con $i=1,2,3$
$ sum_{i=1}^3 x_(i,j)=r_j $ con $ j=1,...,5$
$M(y_(i,j)+y_(i,j+5))>=x_(i,j) $ con $ i=1,2,3$ e$ j=1,...,5$
$y_(i,j)+y_(i,j+5)<=1$
$sum_{i=1}^3 sum_{j=1}^10 c_(i,j) y_(i,j)+ 11/10 sum_{i=1}^3 sum_{j=1}^10 f_(i,j) y_(i,j)<=b$
$x_(i,j)>=0$ con $i=1,2,3$ e $j=1,...5$
$y in {0,1}^(3xx10)$
$M$ è un valore molto grande. Sicuramente se assegni $M=1000$ va bene. L'importante è che quel vincolo imponga che almeno uno [nota]Il fatto che se ne attivi uno solo è invece regolato dal vincolo successivo[/nota] tra $y_(i,j)$ e $ y_(i,j+5$ sia attivato, ovvero valga $1$.
$min \sum_{i=1}^3 sum_{j=1}^10 c_(i,j) y_(i,j)+ 11/10 sum_{i=1}^3 sum_{j=1}^10 f_(i,j) y_(i,j) + 0sum_{i=1}^3 sum_{j=1}^5 x_(i,j) $
$s.t $
$ sum_{j=1}^5 x_(i,j) <= p_i$ con $i=1,2,3$
$ sum_{i=1}^3 x_(i,j)=r_j $ con $ j=1,...,5$
$M(y_(i,j)+y_(i,j+5))>=x_(i,j) $ con $ i=1,2,3$ e$ j=1,...,5$
$y_(i,j)+y_(i,j+5)<=1$
$sum_{i=1}^3 sum_{j=1}^10 c_(i,j) y_(i,j)+ 11/10 sum_{i=1}^3 sum_{j=1}^10 f_(i,j) y_(i,j)<=b$
$x_(i,j)>=0$ con $i=1,2,3$ e $j=1,...5$
$y in {0,1}^(3xx10)$
$M$ è un valore molto grande. Sicuramente se assegni $M=1000$ va bene. L'importante è che quel vincolo imponga che almeno uno [nota]Il fatto che se ne attivi uno solo è invece regolato dal vincolo successivo[/nota] tra $y_(i,j)$ e $ y_(i,j+5$ sia attivato, ovvero valga $1$.
Ciao! Innanzitutto grazie per la risposta
In effetti è vero il testo non è che sia molto chiaro, io lo avevo inquadrato in una sorta di Problema dei Trasporti.
Secondo questo modello:
$ min sum_(i = 1)^(n) c_(ij)x_(ij) $
$ sum_(j = 1)^(n) x_(ij)=a_(i) $ $ i=1...m $
$ sum_(i = 1)^(n) x_(ij)=b_(j) $ $ j=1...n $
Ora arrivano le domande, quindi preparati!
1. L'aggiornamento dei costi annuali delle navi credo sia una mera aggiunta, per rendere il problema più reale.
Non ho capito bene la somma di $ 11/10 $ , potresti chiarirmi meglio questa scelta?
2. Il vettore Y, purtroppo in OPL non mi viene molto facile dargli una forma in quanto non saprei come gestire la
dichiarazione del doppio indice, nel tuo modello credo sia questa
anche qui mi aiuterebbe un ulteriore chiarimento.
Per ora questi sono i dubbi che ho, poichè ho subito implementato nel software. Ti linko un file così ti fai una piccola idea.
https://drive.google.com/file/d/0B09vVJ ... sp=sharing
Ti ringrazio ancora!

In effetti è vero il testo non è che sia molto chiaro, io lo avevo inquadrato in una sorta di Problema dei Trasporti.
Secondo questo modello:
$ min sum_(i = 1)^(n) c_(ij)x_(ij) $
$ sum_(j = 1)^(n) x_(ij)=a_(i) $ $ i=1...m $
$ sum_(i = 1)^(n) x_(ij)=b_(j) $ $ j=1...n $
Ora arrivano le domande, quindi preparati!

1. L'aggiornamento dei costi annuali delle navi credo sia una mera aggiunta, per rendere il problema più reale.
Non ho capito bene la somma di $ 11/10 $ , potresti chiarirmi meglio questa scelta?
2. Il vettore Y, purtroppo in OPL non mi viene molto facile dargli una forma in quanto non saprei come gestire la
dichiarazione del doppio indice, nel tuo modello credo sia questa
"Intermat":
$ y_(i,j)+y_(i,j+5)=x_(i,j) $ con $ i=1,2,3 $ e$ j=1,...,5 $
anche qui mi aiuterebbe un ulteriore chiarimento.
Per ora questi sono i dubbi che ho, poichè ho subito implementato nel software. Ti linko un file così ti fai una piccola idea.
https://drive.google.com/file/d/0B09vVJ ... sp=sharing
Ti ringrazio ancora!


Nella tua c'è un problema (credo solo di scrittura sul forum) nella f.o. Devono essere saturati entrambi gli indici del vettore altrimenti non ha senso. Inoltre uno dei due vincoli, se è il vincolo relativo al budget, è troppo stringente. Infatti non necessariamente va speso interamente.
Le cose che ho scritto:
La prima (ovvero la moltiplicazione per $11/10$) è data semplicemente dal fatto che oltre ai costi di affitto delle navi, che secondo la mia notazione sono: $sum_{i=1}^3 sum_{j=1}^10 f_(i,j) y_(i,j) $ ci sono anche i "costi annuali di investimento" che il problema dice siano pari proprio ad $1/10$ della tabella 4 ovvero proprio quella dei costi degli affitti delle navi. Quindi:
$sum_{i=1}^3 sum_{j=1}^10 f_(i,j) y_(i,j) +1/10 sum_{i=1}^3 sum_{j=1}^10 f_(i,j) y_(i,j)$ $=11/10sum_{i=1}^3 sum_{j=1}^10 f_(i,j) y_(i,j) $
Per l'altro dubbio:
Io "sdoppio" il vettore $x$ perchè mi serve sapere se il collegamento del impianto $i$ con il mobilificio $j$ è stato fatto con la nave o con il treno. Quindi scrivo che se, ad esempio, il mobilificio $1$ è collegato all'impianto $1$ ho che $x_(1,1)=1$ perchè il collegamento è attivo. Ora con tale componente del vettore $x$ non saprei dire se è stato collegato via mare o via treno. Quindi creo il vettore $y$ dicendo che con le $i $ indico sempre gli impianti e con le $j$ indico i mobilifici e il modo in cui sono raggiunti. Quindi se: $y_(1,1)=1$ allora il mobilificio è stato raggiunto via treno, mentre se $y_(1,6)=1$ il mobilificio è stato raggiunto via mare. Da questo dovresti capire il perchè della disuguaglianza. Avendo ipotizzato che si può collegare un impianto con un mobilificio solo in un modo allora ho imposto che se $x_(1,1)=1$ allora solo uno dei due collegamenti può essere scelto ovvero deve valere che alternativamente (EXOR) si abbia $y_(1,1)=1$ oppure $y_(1,6)=1$. Un modo per scriverlo in maniera compatta è proprio quello che ti ho indicato. La somma $+5$ nel pedice $j$ è dovuto dal fatto che i mobilifici sono $5$ e che ho indicato in questo modo i collegamenti:
$y_(1,1)=1 => text(collegamento ) I_1 M_1 text( via treno)$
$y_(1,2)=1 => text(collegamento ) I_1 M_2 text( via treno)$
$y_(1,3)=1 => text(collegamento ) I_1 M_3 text( via treno)$
$y_(1,4)=1 => text(collegamento ) I_1 M_4 text( via treno)$
$y_(1,5)=1 => text(collegamento ) I_1 M_5 text( via treno)$
$y_(1,6)=1 => text(collegamento ) I_1 M_1 text( via nave)$
$y_(1,7)=1 => text(collegamento ) I_1 M_2 text( via nave)$
$y_(1,8)=1 => text(collegamento ) I_1 M_3 text( via nave)$
$y_(1,9)=1 => text(collegamento ) I_1 M_4 text( via nave)$
$y_(1,10)=1 => text(collegamento ) I_1 M_5 text( via nave)$
Ovviamente vale la stessa cosa per gli impianti $I_2$ e $I_3$.
Non ti so dare un aiuto su come usare gli indici. Magari potresti provare a cambiare i pedici e riscrivere in un altro modo la stessa cosa. Se ha problemi potresti (non so se ti sia di aiuto) eliminare il vettore $x$ e lasciare solo il vettore $y$ facendo la prima sommatoria con $j$ che varia da $1$ a $10$ tanto grazie al vincolo che ti ho appena spiegato non può capitare di contare due volte il collegamento tra un impianto e un mobilificio. Ovviamente tale ultimo vincolo lo dovresti leggermente modificare avendo eliminato $x$ (dovrebbe in tal caso funzionare $y_(i,j)+y_(i,j+5)<=1 $)
Le cose che ho scritto:
La prima (ovvero la moltiplicazione per $11/10$) è data semplicemente dal fatto che oltre ai costi di affitto delle navi, che secondo la mia notazione sono: $sum_{i=1}^3 sum_{j=1}^10 f_(i,j) y_(i,j) $ ci sono anche i "costi annuali di investimento" che il problema dice siano pari proprio ad $1/10$ della tabella 4 ovvero proprio quella dei costi degli affitti delle navi. Quindi:
$sum_{i=1}^3 sum_{j=1}^10 f_(i,j) y_(i,j) +1/10 sum_{i=1}^3 sum_{j=1}^10 f_(i,j) y_(i,j)$ $=11/10sum_{i=1}^3 sum_{j=1}^10 f_(i,j) y_(i,j) $
Per l'altro dubbio:
Io "sdoppio" il vettore $x$ perchè mi serve sapere se il collegamento del impianto $i$ con il mobilificio $j$ è stato fatto con la nave o con il treno. Quindi scrivo che se, ad esempio, il mobilificio $1$ è collegato all'impianto $1$ ho che $x_(1,1)=1$ perchè il collegamento è attivo. Ora con tale componente del vettore $x$ non saprei dire se è stato collegato via mare o via treno. Quindi creo il vettore $y$ dicendo che con le $i $ indico sempre gli impianti e con le $j$ indico i mobilifici e il modo in cui sono raggiunti. Quindi se: $y_(1,1)=1$ allora il mobilificio è stato raggiunto via treno, mentre se $y_(1,6)=1$ il mobilificio è stato raggiunto via mare. Da questo dovresti capire il perchè della disuguaglianza. Avendo ipotizzato che si può collegare un impianto con un mobilificio solo in un modo allora ho imposto che se $x_(1,1)=1$ allora solo uno dei due collegamenti può essere scelto ovvero deve valere che alternativamente (EXOR) si abbia $y_(1,1)=1$ oppure $y_(1,6)=1$. Un modo per scriverlo in maniera compatta è proprio quello che ti ho indicato. La somma $+5$ nel pedice $j$ è dovuto dal fatto che i mobilifici sono $5$ e che ho indicato in questo modo i collegamenti:
$y_(1,1)=1 => text(collegamento ) I_1 M_1 text( via treno)$
$y_(1,2)=1 => text(collegamento ) I_1 M_2 text( via treno)$
$y_(1,3)=1 => text(collegamento ) I_1 M_3 text( via treno)$
$y_(1,4)=1 => text(collegamento ) I_1 M_4 text( via treno)$
$y_(1,5)=1 => text(collegamento ) I_1 M_5 text( via treno)$
$y_(1,6)=1 => text(collegamento ) I_1 M_1 text( via nave)$
$y_(1,7)=1 => text(collegamento ) I_1 M_2 text( via nave)$
$y_(1,8)=1 => text(collegamento ) I_1 M_3 text( via nave)$
$y_(1,9)=1 => text(collegamento ) I_1 M_4 text( via nave)$
$y_(1,10)=1 => text(collegamento ) I_1 M_5 text( via nave)$
Ovviamente vale la stessa cosa per gli impianti $I_2$ e $I_3$.
Non ti so dare un aiuto su come usare gli indici. Magari potresti provare a cambiare i pedici e riscrivere in un altro modo la stessa cosa. Se ha problemi potresti (non so se ti sia di aiuto) eliminare il vettore $x$ e lasciare solo il vettore $y$ facendo la prima sommatoria con $j$ che varia da $1$ a $10$ tanto grazie al vincolo che ti ho appena spiegato non può capitare di contare due volte il collegamento tra un impianto e un mobilificio. Ovviamente tale ultimo vincolo lo dovresti leggermente modificare avendo eliminato $x$ (dovrebbe in tal caso funzionare $y_(i,j)+y_(i,j+5)<=1 $)
Buondì!
Per quanto riguarda il modello da me postato è solo la generalizzazione del Problema dei Trasporti, a mo' di esempio.
Ho provato a implementare la tua soluzione, non ho trovato problemi poi nel gestire gli indici.
Anche se tu non conosci OPL ti scrivo il codice perchè è comunque comprensibile:
dvar float+ X[Impianti][MMobilifici] in 0..1; <- questi sono i vincoli di appartenenza all' insieme {0,1} 3x5
dvar float+ Y[Impianti][Mobilifici] in 0..1; <- questi sono i vincoli di appartenenza all' insieme {0,1} 3x10
minimize sum( i in Impianti) sum(j in Mobilifici) Costi[j]*Y[j] + sum(i in Impianti)sum(j in Mobilifici)11/10*(Affitto[j])*Y[j]; <-funzione obiettivo, gli indici sono dichiarati a parte, è una caratteristica del linguaggio ma sono quelli da te proposti, cioè Impianti=3 e Mobilici=10
subject to {
forall (j in MMobilifici)
sum(i in Impianti) X[j] == Richiesta[j]; <- MMobilifici=5 così non avevo problemi con il linguaggio
forall(i in Impianti)forall (j in MMobilifici)
Y[j]+Y[j+5]==X[j]; <-yi,j+yi,j+5=xi,j con i=1,2,3 ej=1,...,5
//X[j]+X[j+5]<=1; Ho anche implementato questa in un altro file ma alla fine il risultato è identico
forall (i in Impianti)
sum(j in Mobilifici) Costi[j]*Y[j] + sum(j in Mobilifici)11/10*(Affitto[j])*Y[j]<=Budjet;
}
Ora sono sorti due problemi nel tuo modello, il primo deriva dai vincoli di X e Y. Essendo 0 e 1 numeri interi avrei dovuto mettere il tipo int, purtroppo lanciata l'esecuzione non da alcuna soluzione, quindi scritto float+ cioè numeri a virgola mobile positivi. Questo comporta che anche i mumeri compresi tra 0 e 1 sono prei in considerazione e non credo che debba essere così.
Il secondo problema, credo sia un problema, riguarda le soluzioni:
// solution (feasible relaxed sum of infeasibilities) with objective 45
// Quality Bound infeasibilities--unscaled (scaled):
// Y(1)(1) =1.00000e+000 (1.00000e+000) <- qua dovrebbero esserci i costi di trasporto per milione di assi
// Y(1)(2) =5.00000e+000 (5.00000e+000) ma se abbiamo dalla tab3 che in treno costa 61(mila€) e via
// Y(1)(3) =3.00000e+000 (3.00000e+000) mare 31 che va aggiornato con 1/10 della relativa posizione
// Y(1)(4) =4.00000e+000 (4.00000e+000) in tab4, non dovrebbero esserci queste cifre?
// Y(1)(5) =2.00000e+000 (2.00000e+000) dovrebbe esserci il prù piccolo valore tra treno e mare, o almeno
// X(1)(1) =2.00000e+000 (2.00000e+000) così mi sarei aspettato o_O
// X(2)(1) =1.00000e+000 (1.00000e+000)
// X(3)(1) =1.00000e+000 (1.00000e+000)
// X(1)(2) =6.00000e+000 (6.00000e+000)
// X(2)(2) =1.00000e+000 (1.00000e+000)
// X(3)(2) =1.00000e+000 (1.00000e+000)
// X(1)(3) =4.00000e+000 (4.00000e+000)
// X(2)(3) =1.00000e+000 (1.00000e+000)
// X(3)(3) =1.00000e+000 (1.00000e+000)
// X(1)(4) =5.00000e+000 (5.00000e+000)
// X(2)(4) =1.00000e+000 (1.00000e+000)
// X(3)(4) =1.00000e+000 (1.00000e+000)
// X(1)(5) =3.00000e+000 (3.00000e+000)
// X(2)(5) =1.00000e+000 (1.00000e+000)
// X(3)(5) =1.00000e+000 (1.00000e+000)
// Max. unscaled (scaled) bound infeas. = 6 (6)
// Max. unscaled (scaled) Ax-b resid. = 3.72438e-010 (7.27418e-013)
// Max. unscaled (scaled) |x| = 7 (7)
// Max. unscaled (scaled) |slack| = 6.74799e+006 (13179.7) <- questo dovrebbe essere il budjet annuale
//
Y = [[2 6 4 5 3 1 1 1 1 1]
[1 1 1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1 1 1]]; <- anche qua mi aspettavo la presenza del minimo valore tra treno e mare....poi questi 1 e 0
non mi spiego cosa ci facciano qui
X = [[3 7 5 6 4 0 0 0 0 0]
[2 2 2 2 2 0 0 0 0 0]
[2 2 2 2 2 0 0 0 0 0]];
Io ovviamente sono un neofita della RO, ma non mi sembra coerente questa soluzione rispetto a quello che anche logicamente ci si poteva aspettare, ma potrei anche sbagliarmi.
Spero che tu ci capisca qualcosa dal codice perchè è vicino sia all'espressione matematica che a quella del linguaggio orale, anche perchè così tu puoi verificare la struttura del tuo modello.
Spero in una tua illuminazione!
Per quanto riguarda il modello da me postato è solo la generalizzazione del Problema dei Trasporti, a mo' di esempio.
Ho provato a implementare la tua soluzione, non ho trovato problemi poi nel gestire gli indici.
Anche se tu non conosci OPL ti scrivo il codice perchè è comunque comprensibile:
dvar float+ X[Impianti][MMobilifici] in 0..1; <- questi sono i vincoli di appartenenza all' insieme {0,1} 3x5
dvar float+ Y[Impianti][Mobilifici] in 0..1; <- questi sono i vincoli di appartenenza all' insieme {0,1} 3x10
minimize sum( i in Impianti) sum(j in Mobilifici) Costi[j]*Y[j] + sum(i in Impianti)sum(j in Mobilifici)11/10*(Affitto[j])*Y[j]; <-funzione obiettivo, gli indici sono dichiarati a parte, è una caratteristica del linguaggio ma sono quelli da te proposti, cioè Impianti=3 e Mobilici=10
subject to {
forall (j in MMobilifici)
sum(i in Impianti) X[j] == Richiesta[j]; <- MMobilifici=5 così non avevo problemi con il linguaggio
forall(i in Impianti)forall (j in MMobilifici)
Y[j]+Y[j+5]==X[j]; <-yi,j+yi,j+5=xi,j con i=1,2,3 ej=1,...,5
//X[j]+X[j+5]<=1; Ho anche implementato questa in un altro file ma alla fine il risultato è identico
forall (i in Impianti)
sum(j in Mobilifici) Costi[j]*Y[j] + sum(j in Mobilifici)11/10*(Affitto[j])*Y[j]<=Budjet;
}
Ora sono sorti due problemi nel tuo modello, il primo deriva dai vincoli di X e Y. Essendo 0 e 1 numeri interi avrei dovuto mettere il tipo int, purtroppo lanciata l'esecuzione non da alcuna soluzione, quindi scritto float+ cioè numeri a virgola mobile positivi. Questo comporta che anche i mumeri compresi tra 0 e 1 sono prei in considerazione e non credo che debba essere così.
Il secondo problema, credo sia un problema, riguarda le soluzioni:
// solution (feasible relaxed sum of infeasibilities) with objective 45
// Quality Bound infeasibilities--unscaled (scaled):
// Y(1)(1) =1.00000e+000 (1.00000e+000) <- qua dovrebbero esserci i costi di trasporto per milione di assi
// Y(1)(2) =5.00000e+000 (5.00000e+000) ma se abbiamo dalla tab3 che in treno costa 61(mila€) e via
// Y(1)(3) =3.00000e+000 (3.00000e+000) mare 31 che va aggiornato con 1/10 della relativa posizione
// Y(1)(4) =4.00000e+000 (4.00000e+000) in tab4, non dovrebbero esserci queste cifre?
// Y(1)(5) =2.00000e+000 (2.00000e+000) dovrebbe esserci il prù piccolo valore tra treno e mare, o almeno
// X(1)(1) =2.00000e+000 (2.00000e+000) così mi sarei aspettato o_O
// X(2)(1) =1.00000e+000 (1.00000e+000)
// X(3)(1) =1.00000e+000 (1.00000e+000)
// X(1)(2) =6.00000e+000 (6.00000e+000)
// X(2)(2) =1.00000e+000 (1.00000e+000)
// X(3)(2) =1.00000e+000 (1.00000e+000)
// X(1)(3) =4.00000e+000 (4.00000e+000)
// X(2)(3) =1.00000e+000 (1.00000e+000)
// X(3)(3) =1.00000e+000 (1.00000e+000)
// X(1)(4) =5.00000e+000 (5.00000e+000)
// X(2)(4) =1.00000e+000 (1.00000e+000)
// X(3)(4) =1.00000e+000 (1.00000e+000)
// X(1)(5) =3.00000e+000 (3.00000e+000)
// X(2)(5) =1.00000e+000 (1.00000e+000)
// X(3)(5) =1.00000e+000 (1.00000e+000)
// Max. unscaled (scaled) bound infeas. = 6 (6)
// Max. unscaled (scaled) Ax-b resid. = 3.72438e-010 (7.27418e-013)
// Max. unscaled (scaled) |x| = 7 (7)
// Max. unscaled (scaled) |slack| = 6.74799e+006 (13179.7) <- questo dovrebbe essere il budjet annuale
//
Y = [[2 6 4 5 3 1 1 1 1 1]
[1 1 1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1 1 1]]; <- anche qua mi aspettavo la presenza del minimo valore tra treno e mare....poi questi 1 e 0
non mi spiego cosa ci facciano qui
X = [[3 7 5 6 4 0 0 0 0 0]
[2 2 2 2 2 0 0 0 0 0]
[2 2 2 2 2 0 0 0 0 0]];
Io ovviamente sono un neofita della RO, ma non mi sembra coerente questa soluzione rispetto a quello che anche logicamente ci si poteva aspettare, ma potrei anche sbagliarmi.
Spero che tu ci capisca qualcosa dal codice perchè è vicino sia all'espressione matematica che a quella del linguaggio orale, anche perchè così tu puoi verificare la struttura del tuo modello.
Spero in una tua illuminazione!

La soluzione con numeri non binari non ha nessun senso logico. La soluzione non potrà mai e poi mai avvicinarsi a quella giusta. Mi preoccupa di più il fatto che non ti trovi soluzione con le variabili binarie. Prova a eliminare il vincolo dato dal budget (quello con la $b$)...se ti da una soluzione con una $text(f.o.)>b$ allora era giusto che non trovasse alcuna soluzione. La correttezza del mio modello non è dimostrata da nulla..però non credo sia molto lontano dalla correttezza. Forse c'è qualche piccolo problema. Però sei sicuro di aver definito bene i vettori e le matrici?
PS: Ti sei dimenticato di moltiplicare la componente $x_(i,j)$ con la componente $p_i$ del vettore $p$. Se non ti desse ancora una soluzione prova a mettere il $>=$.
PS: Ti sei dimenticato di moltiplicare la componente $x_(i,j)$ con la componente $p_i$ del vettore $p$. Se non ti desse ancora una soluzione prova a mettere il $>=$.
"Kizaru":
forall (j in MMobilifici)
[size=150]sum(i in Impianti) X[j] == Richiesta[j]; <- MMobilifici=5 così non avevo problemi con il linguaggio[/size]
forall(i in Impianti)forall (j in MMobilifici)
Y[j]+Y[j+5]==X[j]; <-yi,j+yi,j+5=xi,j con i=1,2,3 ej=1,...,5
//X[j]+X[j+5]<=1; Ho anche implementato questa in un altro file ma alla fine il risultato è identico
forall (i in Impianti)
sum(j in Mobilifici) Costi[j]*Y[j] + sum(j in Mobilifici)11/10*(Affitto[j])*Y[j]<=Budjet;
}
Rileggendo l'esercizio ho trovato un problema nella formulazione che ti ho proposto...proprio nel vincolo che ti ho evidenziato. Ora magari lo riguardo. Il problema è che $p_i$ è la produzione massima che riesce a fornire l'impianto quindi non lo posso moltiplicare per il vettore binario...altrimenti avrei che per ogni mobilificio l'impianto è in grado di produrre $p_i$ mentre è vero che in totale riesce a produrre $p_i$
Scusa volevo fare un quote e invece ho fatto una modifica alla prima risposta...
Ho modificato la formulazione. La trovi nella mia prima risposta! Scusa del casino che ho creato con le risposte...
Comunque te la quoto qui:

Ho modificato la formulazione. La trovi nella mia prima risposta! Scusa del casino che ho creato con le risposte...

Comunque te la quoto qui:
"Intermat":
Rivedendola la modificherei così:
$min \sum_{i=1}^3 sum_{j=1}^10 c_(i,j) y_(i,j)+ 11/10 sum_{i=1}^3 sum_{j=1}^10 f_(i,j) y_(i,j) + 0sum_{i=1}^3 sum_{j=1}^5 x_(i,j) $
$s.t $
$ sum_{j=1}^5 x_(i,j) <= p_i$ con $i=1,2,3$
$ sum_{i=1}^3 x_(i,j)=r_j $ con $ j=1,...,5$
$M(y_(i,j)+y_(i,j+5))>=x_(i,j) $ con $ i=1,2,3$ e$ j=1,...,5$
$y_(i,j)+y_(i,j+5)<=1$
$sum_{i=1}^3 sum_{j=1}^10 c_(i,j) y_(i,j)+ 11/10 sum_{i=1}^3 sum_{j=1}^10 f_(i,j) y_(i,j)<=b$
$x_(i,j)>=0$ con $i=1,2,3$ e $j=1,...5$
$y in {0,1}^(3xx10)$
$M$ è un valore molto grande. Sicuramente se assegni $M=1000$ va bene. L'importante è che quel vincolo imponga che almeno uno [nota]Il fatto che se ne attivi uno solo è invece regolato dal vincolo successivo[/nota] tra $y_(i,j)$ e $ y_(i,j+5$ sia attivato, ovvero valga $1$.
Buondì!
Sto progetto è un incubo, sto lavorando su altri modelli ma nulla
Per quanto riguarda la tua revisione il codice è questo:
int NImpianti = ...;
int NMobilifici = ...;
range Impianti = 1..NImpianti;
range Mobilifici = 1..NMobilifici;
range MMobilifici = 1..5;
int Budjet=...;
int M=1000;
int Costi[Impianti][Mobilifici] = ...;
int Affitto[Impianti][Mobilifici] = ...;
int Produzione[Impianti] = ...; //Produzione dell'impianto In
int Richiesta[Mobilifici] = ...; //Domanda del mobilificio Fn
dvar float+ X[Impianti][MMobilifici];
dvar int+ Y[Impianti][Mobilifici] in 0..1;
minimize sum( i in Impianti) sum(j in Mobilifici) Costi[j]*Y[j] + sum(i in Impianti)sum(j in Mobilifici)11/10*(Affitto[j])*Y[j] + 0*sum(i in Impianti) sum(j in MMobilifici)X[j];
subject to {
forall(i in Impianti)
sum(j in MMobilifici) X[j] <= Produzione;
forall (j in MMobilifici)
sum(i in Impianti) X[j] == Richiesta[j];
forall(i in Impianti)forall (j in MMobilifici)
M*(Y[j]+Y[j+5])>=X[j];//yi,j+yi,j+5=xi,j con i=1,2,3 ej=1,...,5
forall(i in Impianti)forall(j in MMobilifici)
X[j]+X[j+5]<=1; <- qua si generano 6 errori
forall (i in Impianti)
sum(j in Mobilifici) Costi[j]*Y[j] + sum(j in Mobilifici)11/10*(Affitto[j])*Y[j]<=Budjet;
}
Purtroppo in quel punto del codice riporta 6 errori:
Descrizione Risorsa Percorso Ubicazione Type
CPLEX(default) cannot extract expression: forall(i in 1..3) (forall(j in 1..5) X[(i)][(j)]+X[(i)][(j+5)] <= 1).
CPLEX(default) cannot extract expression: forall(i in 1..3) (forall(j in 1..5) X[(i)][(j)]+X[(i)][(j+5)] <= 1).
CPLEX(default) cannot extract model: IloAlgorithm cannot extract extractable.
Index out of bound for array "X(1)": 6.
OPL cannot extract expression: forall(i in 1..3) (forall(j in 1..5) X[(i)][(j)]+X[(i)][(j+5)] <= 1).
OPL cannot extract expression: X[(i)][(j)]+X[(i)][(j+5)] <= 1.
In pratica gli indici sforano e il motore non riesce a estrarre l'espressione, non ho idea del preciso senso ma credo sia perchè gli risulti una cosa insensata
Beh ci perderò su un'altra giornata

Sto progetto è un incubo, sto lavorando su altri modelli ma nulla

Per quanto riguarda la tua revisione il codice è questo:
int NImpianti = ...;
int NMobilifici = ...;
range Impianti = 1..NImpianti;
range Mobilifici = 1..NMobilifici;
range MMobilifici = 1..5;
int Budjet=...;
int M=1000;
int Costi[Impianti][Mobilifici] = ...;
int Affitto[Impianti][Mobilifici] = ...;
int Produzione[Impianti] = ...; //Produzione dell'impianto In
int Richiesta[Mobilifici] = ...; //Domanda del mobilificio Fn
dvar float+ X[Impianti][MMobilifici];
dvar int+ Y[Impianti][Mobilifici] in 0..1;
minimize sum( i in Impianti) sum(j in Mobilifici) Costi[j]*Y[j] + sum(i in Impianti)sum(j in Mobilifici)11/10*(Affitto[j])*Y[j] + 0*sum(i in Impianti) sum(j in MMobilifici)X[j];
subject to {
forall(i in Impianti)
sum(j in MMobilifici) X[j] <= Produzione;
forall (j in MMobilifici)
sum(i in Impianti) X[j] == Richiesta[j];
forall(i in Impianti)forall (j in MMobilifici)
M*(Y[j]+Y[j+5])>=X[j];//yi,j+yi,j+5=xi,j con i=1,2,3 ej=1,...,5
forall(i in Impianti)forall(j in MMobilifici)
X[j]+X[j+5]<=1; <- qua si generano 6 errori
forall (i in Impianti)
sum(j in Mobilifici) Costi[j]*Y[j] + sum(j in Mobilifici)11/10*(Affitto[j])*Y[j]<=Budjet;
}
Purtroppo in quel punto del codice riporta 6 errori:
Descrizione Risorsa Percorso Ubicazione Type
CPLEX(default) cannot extract expression: forall(i in 1..3) (forall(j in 1..5) X[(i)][(j)]+X[(i)][(j+5)] <= 1).
CPLEX(default) cannot extract expression: forall(i in 1..3) (forall(j in 1..5) X[(i)][(j)]+X[(i)][(j+5)] <= 1).
CPLEX(default) cannot extract model: IloAlgorithm cannot extract extractable.
Index out of bound for array "X(1)": 6.
OPL cannot extract expression: forall(i in 1..3) (forall(j in 1..5) X[(i)][(j)]+X[(i)][(j+5)] <= 1).
OPL cannot extract expression: X[(i)][(j)]+X[(i)][(j+5)] <= 1.
In pratica gli indici sforano e il motore non riesce a estrarre l'espressione, non ho idea del preciso senso ma credo sia perchè gli risulti una cosa insensata

Beh ci perderò su un'altra giornata

Ma gli indici sono gli stessi di prima...mi sembra strano!
"Kizaru":
Buondì!![]()
forall(i in Impianti)forall(j in MMobilifici)
X[j]+X[j+5]<=1; <- qua si generano 6 errori
Ci va $y$ non $x$!!!