La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Programmazione Lineare INTERA Fischetti Cap 5, Potenzialità espressive delle variabili binarie Linearizzazione di espressioni non lineari Branch and Bound.

Presentazioni simili


Presentazione sul tema: "Programmazione Lineare INTERA Fischetti Cap 5, Potenzialità espressive delle variabili binarie Linearizzazione di espressioni non lineari Branch and Bound."— Transcript della presentazione:

1 Programmazione Lineare INTERA Fischetti Cap 5, Potenzialità espressive delle variabili binarie Linearizzazione di espressioni non lineari Branch and Bound Modelli di PLI

2 Perche’ variabili intere? Alcuni problemi non godono della proprieta’ di divisibilita’ (un investimento immobiliare non puo’ venire effettuato per una frazione, la produzione di alcuni beni es. natanti di lusso viene effettuata su commessa per singole produzioni e non per produzioni in serie) Permette di sfruttare tutte le potenzialita’ espressive delle variabili booleane per tradurre in vincoli matematici delle relazioni fra variabili Vero/Falso descritte da espressioni logiche complesse (and logico, implicazioni, etc.) Grazie alla possibilita’ –di linearizzare diverse espressioni non lineari traducendole in espressioni con variabili binarie, –o di approssimare funzioni non lineari con finzioni lineari a tratti, molti problemi la cui descrizione naturale porta a modelli non lineari, possono venire riformulati (o approssimati) attraverso modelli MILP (Mixed Integer Linear Programming), per la soluzione dei quali esistono tecniche molto performanti. Facciamo alcuni esempi di traduzione in espressioni lineari con variabili intere o booleane delle piu’ comuni espressioni logiche o non lineari

3 Implicazioni logiche Siano x A e x B due variabili booleane associate a due decisioni, A e B (x A x B  {0,1}) Si deve modellizzare la relazione logica “se A allora B” (A  B) A=VB=FOccorre vietare l’occorrenza di valori di verita’ che falsificano l’affermazione A  B, cioe’ vietare l’occorrenza A=V, B=F. x A  x BUtilizzando la consueta corrispondenza tra variabili booleane e predicati logici (x A =1  A=V, x A =0  A=F) il vincolo x A  x B implementa questa relazione DIM: il vincolo è soddisfatto per tutti e i soli valori di x A x B che rendono vera l’implicazione

4 And e Or logico Siano x A e x B due variabili booleane associate a due decisioni, A e B (x A x B  {0,1}), e utilizziamo la consueta corrispondenza tra variabili booleane e predicati logici (x A =1  A=V, x A =0  A=F) Si deve modellizzare la relazione logica “A and B” (A  B) Occorre introdurre una nuova variabile booleana x Z  {0,1}, i cui valori ammissibili sono vincolati a rispecchiare i valori della tabella di verità dell’and logico (Z=1  (A=1  B=1)) Occorre vietare che x Z =1 se almeno uno fra x A o x B è 0:  x A  x B –x Z  x A, x Z  x B Occorre imporre che x Z =1 se entrambi x A e x B sono 1:  x A -1 –x Z  x A + x B -1 Per imporre che valga A  B basta imporre il vincolo x Z =1 Si deve modellizzare la relazione logica “A or B” (A  B) E’ sufficiente un’unico vincolo lineare che richieda l’occorrenza dei valori di verità che verificano l’affermazione Aor B.  x A,  x B –x Z  x A, x Z  x B in modo tale che x Z sia 1 non appena almeno una delle variabili è 1  x A x B –x Z  x A + x B in modo tale che x Z valga 0 se entrambe valgono 0  x A x BPer imporre che valga A  B basta imporre il vincolo x Z =1 ma anche (se non ricorre in altre espressioni, per cui si rende necessario introdurre la variabile x Z ) solo il vincolo 1  x A + x B DIM: costruire le tabelle di verità ESERCIZIO: come modellizzereste l’espressione logica “aut aut”? (OR ESCLUSIVO)

5 Fixed charge: il significato Modellizza il concetto di costo fisso legato all’espletamento di una attivita’. Si paga un costo costante solo se l’attivita’ viene intrapresa, e a prescindere dal livello a cui viene svolta. E’ il caso del costo di costruzione di un impianto a cui si sommano dei costi operativi legati alla gestione e al suo utilizzo (es energia) I quali dipendono dal livello di produzione. Occorre che nel modello sia necessario far pagare il costo fisso solo nel momento in cui il livello di uso e’ strettamente positivo ma non quando e’ nullo. Questa struttura e’ presente nei problemi affrontati in fase di design, in cui si pianifica l’impianto (la rete, la struttura) avendo presente come sara’ utilizzato. Sono decisioni di livello strategico (di che cosa mi doto) che si sommano a quelle di livello operativo (come si usa cio’ di cui mi sono dotato). Dal punto di vista matematico questo concetto e’ espresso dalla funzione non lineare Min f(x) = Min (cx+g se x>0, 0 else) dove g rappresenta il costo fisso da pagare solo se l’ultizzo x e’ strettamente positivo

6 Fixed charge: come si linearizza Si deve descrivere il livello di una attivita’ attraverso l’uso di una variabile continua x  0 alla quale sono associati costi lineari c e dei costi fissi g che entrano in gioco non appena x assume valori POSITIVI Min f(x) = Min (cx+g se x>0, 0 else) Sia M un upper bound per x (0  x  M) Introduciamo y  {0,1} intesa come la variabile booleana associata alla decisione “x>0?” Min f(x) = Min cx + gy: x  My, y  {0,1} f(x) x g

7 Vincoli di tipo Or (Vincoli, non variabili!!) Consideriamo i due vincoli a 1 : 3x 1 + 2x 2  18 a 2 : x 1 + 4x 2  16 Se considero il sistema composto dai due vincoli, richiedo il soddisfacimento di entrambi i vincoli, che devono essere contemporaneamente verificati. Mi pongo nell’intersezione dei due semispazi (regione convessa) Al contrario, quando la regione ammissibile e’ l’Unione e non l’Intersezione dei due semispazi associati a ciascuno dei vincoli, l’ammissibilita’ è garantita quando anche uno solo dei due vincoli è soddisfatto Come modellizzare questa condizione?. La regione ammissibile in R 2 risulta NON CONVESSA 9 6812

8 Come rendere ridondante un vincolo di  ?  tutta Aumentando il suo rhs di una quantita’  in modo da includere tutta la regione ammissibile indotta dagli altri vincoli 9 6812 x 1 + 4x 2  16+ 20 x 1 + 4x 2  16 + 20   =20 Traslo il vincolo a 2 di 20 per includere tutte le soluzioni del vincolo a 1.

9 Come rendere ridondante un vincolo? Traslo il vincolo a 1 di 30 per includere tutte le soluzioni del vincolo a 2 9 6812 3x 1 + 2x 2  18 + 30 3x 1 + 2x 2  18   =30

10 Modellizzo con una variabile booleana la decisione in merito a quale vincolo traslare (o l’uno o l’altro poichè uno deve rimanere attivo) 3x 1 + 2x 2  18 + 30 (1-z)con z  {0,1} x 1 + 4x 2  16 + 20 z Dati due vincoli, la scelta consiste nel traslare o l’uno o l’altro. In generale, sia M una costante sufficientemente ampia, e a i il vettore dei coefficienti del vincolo i esimo, di termine noto b i, i=1,2 definisco il sistema : a 1 x  b 1 + Mz a 2 x  b 2 + M (1-z) z  {0,1}

11 Generalizzo: come imporre il soddisfacimento di k vincoli su m (k<m) Date m disuguaglianze {a i x  b i, i=1..m} di cui devono esserne soddisfatte almeno (esattamente) k<m, sia M una costante in Z + tale che il vincolo a i x  M+b i, e’ soddisfatto per ogni x  F, i=1..m Si esprime la condizione tramite il sistema di vincoli: – a i x  b i +Mz i i=1..m –  i z i  m-k (  i z i = m-k ) – z i  {0,1}

12 Rappresentazione binaria di generiche variabili intere Data x intera, compresa in un intervallo [0,U] Sia n = floor(lg 2 U) (2 n  U<2 n+1 ) Allora x =  i=0..n 2 i y i con y i  {0,1}  i=0..n 2 i y i  U Esempio, 0  x  21 e x  Z, equivale a imporre y 0 + 2y 1 + 4y 2 + 8y 3 + 16y 4  21 con y 0, y 1, y 2, y 3, y 4  {0,1}

13 Funzioni con n possibili valori discreti f(x) = d 1 o d 2 o…d n La funzione f(x) puo’ solo assumere uno fra n valori distinti f(x) =  i=1..n d i y i con y i  {0,1} tale che  i=1..n y i = 1 Caso particolare: funzione di proiezione: f(x) implementa la selezione di una delle n componenti del vettore degli argomenti x  R n

14 Variabili Semi-Continue predefinite in Mosel !!! Data una variabile z a valori in {0, [a,..b]} Come modellizzarla? Introduco y  {0,1} e pongo ay  z  by Per y=1 ho a  z  b Per y=0 ho z=0 0ab

15 Funzioni lineari a tratti f(x) =b 1 se x=0, b 1 +a 1 x se 0<x  v 1, b 2 +a 2 x se v 1 <x  v 2, b 3 +a 3 x se v 2 <x  v 3, … dove b i è l’ intercetta della retta i con l’asse y. Inoltre vale (b i+1 + a i+1 v i ) = (b i + a i v i )  v i per la continuita’ v1v2v3 a1 a2 a3 z1z1 z2z2 z3z3 b1b1 x f(x) Indicando con r i la i-esima retta, di equazione b i +a i x quando f è convessa allora f(x) è equivalente al massimo delle rette f(x) = Max i {r i (x)} b2b2 b3b3b3b3 In tal caso, volendo minimizzare f(x) è sufficiente definire una nuova variabile z, imporre z  r i (x)  i, e minimizzare z

16 Funzioni lineari a tratti: descrizione puntuale in funzione delle rette f(x) = b 1 se x=0, b 1 +a 1 x se 0<x  v 1, b 2 +a 2 x se v 1 <x  v 2, b 3 +a 3 x se v 2 <x  v 3, …  z i semicontinua, denota il valore di x nell’ intervallo [v i-1, v i ] con y i v i-1  z i  y i v i e y i  {0,1} (z i ha valore 0 o in [v i-1, v i ] come da def di variabili semicontinua) Pongo x = z 1 + z 2 + z 3 e f(x) =  i b i y i + a i z i v1v2v3 a1 a2 a3 z1z1 z2z2 z3z3 b1b1 x f(x) f(x) =  i b i y i + a i z i subject to: x = z 1 + z 2 + z 3 v i-1 y i  z i  v i y i  i  i y i = 1 y i  {0,1}  i b2b2

17 Funzioni lineari a tratti: descrizione puntuale in funzione dei valori  i nei kinck points v i f(x) e’ la spezzata (lineare a tratti) che unisce i punti (v i,  i ) al variare di i. f(x) non deve necessariamente essere convessa o concava x appartiene all’intervallo [v 1,..,v 4 ] e puo’ venire espresso come combinazione convessa dei punti v i x =  i ( i v i ) con i  0 e  i i =1 Poiche’ i punti v i non sono linearmente indipendenti (generano uno spazio di dimensione 2, una retta) il valore dei moltiplicatori i per uno stesso x non e’ unico. Lo diventa se si impone che solo 2 coefficienti, fra loro adiacenti, possano essere >0. Quindi se x  [v i, v i+1 ] allora x= i v+ i+1 v i+1 con i+1 =(1- i ) In tal caso, per la linearita’ della funzione in ciascun intervallo [v i, v i+1 ] vale che f(x) = f( i v+ i+1 v i+1 ) =  i i (f(v i )) =  i i (  i ) v1v2v4 11 22 33 44 x f(x) v3

18 Funzioni lineari a tratti: descrizione puntuale in funzione dei valori  i assunti nei kinck points v i v1v2v4 11 22 33 44 x f(x) f(x) =  i i f(v i ) subject to: x =  i i v i 1  y 1 i  y i-1 + y i  i =2..k-1 k  y k-1  i i = 1  i y i = 1 i  0  i y i  {0,1}  i v3 Modello MILP Poichè una sola variabile y i puo’ essere 1, questa alza l’upper bound da 0 a 1 a due coeffiecienti di indice consecutivo, pari al prioprio e al precedente

19 PLI: il ruolo del rilassamento continuo e di una buona formulazione Se dal modello di Programmazione Lineare Intera (PLI) rimuoviamo i vincoli di interezza sulle variabili, otteniamo un problema di PL detto rilassamento continuo del problema. I punti interi contenuti nel politopo associato al problema rilassato, sono solo e tutti quelli associati alle soluzioni intere del problema di PLI. Esistono infinte formulazioni valide per il problema di PLI che differiscono solo per il politopo associato al rilassamento continuo. La scelta della formulazione gioca un ruolo fondamentale per l’efficienza del processo risolutivo.

20 Cosa cambia lavorando con variabili intere? La regione ammissibile NON è più CONVESSA Le soluzioni ammissibili sono i soli punti della griglia intera contenuti nel politopo descritto dai vincoli. Nella PL l’ottimo sta su un vertice ma non è detto che tale vertice abbia coordinate intere, anzi può essere ben lontano dall’ottimo intero. L’arrotondamento della soluzione continua non da buoni risultati… Si utilizza un nuovo metodo risolutivo, che usa la PL come black box 5 0 5 Ottimointero Ottimocontinuo Possiamo dare diverse formulazioni equivalenti diverse formulazioni equivalenti, nel senso che descrivono diversi fra loro politopi diversi fra loro contiene ma ciascuno contiene TUTTI e SOLI I punti interi del problema TUTTI e SOLI I punti interi del problema. Issue: la formulazione Curva di isocosto

21 Formulazione Ideale: Il politopo associato ai vincoli ha tutti i vertici con coordinate intere, è la combinazione convessa delle soluzioni intere “CONVEX HULL ” Se conoscessi la formulazione numerica dei vincoli blu, potrei descrivere la regione ammissibile del problema attraverso tali vincoli e risolvere il problema come fosse di PL, ignorando i vincoli di INTEREZZA 5 0 5 OttimoIntero=Ottimocontinuo Quella data dai vincoli BLU è la migliore formulazione fra tutte quelle possibili, poichè descrive un politopo I cui punti interi sono TUTTE e SOLE le soluzioni intere del problema e i cui vertici sono punti interi ideale La formulazione ideale e’ quella piu’ aderente a quella del politopo combinazione convesa ottenuto come combinazione convesa dei punti interi

22 Formulazione Ideale: Il politopo associato ai vincoli descrive la “CONVEX HULL” dei punti interi Esistono casi specifici in cui questo accade naturalmente Dipende da una proprietà algebrica delle matrici dei vincoli detta (TOTALE) UNIMODULARITA’ Alcuni problemi su grafi godono di questa proprietà Quando la matrice dei vincoli è totalmente unimodulare, allora l’ottimo del problema a variabili intere si determina con la sola programazione lineare! 5 0 5 =Ottimointero Ottimocontinuo

23 Branch and Bound Si basa sul concetto del “Dividi et Impera”: dato il problema z* = max {cx: x  X}, dove X=P  Z n con P = {x: Ax  b}, per cui X e’ l’insieme dei punti a coordinate intere contenuti nel politopo P, regione ammissibile X siano X 1,..X m i sottoinsiemi associati a una partizione della regione ammissibile X Allora vale z*= max {z i } dove z i = max {cx: x  X i } per i=1..m Modeli a variabili intere CASO GENERALE Come si risolvono?

24 il Branch and Bound procede partizionando X (insieme delle soluzioni INTERE) in sottoinsiemi {X i } e risolvendo il problema max (cx) su ogni sotto-insieme della partizione, ricorsivamente (divide a loro volta le regioni ammissibili dei sotto-problemi in sottoinsiemi e riappplica il procedimento) fino a che e’ possibile risolvere direttamente max {cx: x  X i } (es, la regione ammissibile X i e’ abbastanza piccola) enumerazione di tutte le possibili soluzioni intere del problema!!! Svolgimento completo della ricorsione  enumerazione di tutte le possibili soluzioni intere del problema!!!   soluzioni: l’enumerazione completa non è possibile, X finito ma ho un numero esponenzialmente grande di soluzioni IDEA promettenti Il Branch and Bound cerca di esplorare solo aree promettenti della regione ammissibile, utilizzando upper e lower bounds al valore ottimo della soluzione per escludere a priori certe aree della regione ammissibile che provatamente non contengono la soluzione ottima (enumerazione implicita)

25 I Bounds: Stime ottimistiche e pessimistiche del valore ottimo della funzione obiettivo Esempio, per un problema di MASSIMO: sia z* = max {cx: x  X}, X=P  Z n, il valore ottimo del problema di massimo di PLI (Programmazione Lineare Intera) dove P = {x: Ax  b} politopo del rilassamento continuo, Z n = {vettori di punti a coordinate intere in R n } Il valore z L = max {cx: x  P}, il valore ottimo del rilassamento Lineare o rilassamento continuo, rappresenta una STIMA OTTIMISTICA (upper bound) del valore OTTIMO z* lower Il valore cx, x  X (x soluzione ammissibile) rappresenta una STIMA PESSIMISTICA di z* o valore euristico (lower bound) z* Max cx Lower bounds Upper bound cx 1 zLzL Ottimo cx 2 cx 3

26 Enumerazione implicita (problema di massimo) Dato un lower bound z’= cx’, x’  X (valore di una soluzione ammissibile) Dato un upper bound z L i per il sottoinsieme X i Se z’  z L i  allora posso evitare l’esplorazione delle soluzioni contenute in X i poichè la miglior soluzione in esso contenuta non è migliore di x’ L’efficienza di un algoritmo di B&B dipende dalla capacità di calcolare bound aderenti a z* Questo giustifica lo sforzo dedicato a determinare la miglior formulazione del problema (che permetta il calcolo di bound aderenti a z* attraverso il calcolo del rilassamento continuo)

27 Un esempio z 0 I = max 5x 1 + 17/4 x 2 : x 1 + x 2 ≤ 5 10x 1 + 6x 2 ≤ 45 x 1, x 2 ≥ 0 x 1, x 2  Z 5 0 5

28 Rilassamenti Un modo per ottenere una stima ottimistica di un problema P (un upper / lower bound per i problemi di massimo / minimo) consiste nel risolvere un problema P^ più facile di P, con una regione ammissibile più ampia di quella di P (F(P)  F(P^)) ottenuta rilassando dei vincoli Il rilassamento utilizzato dai solver è il rilassamento continuo delle variabili intere: esempio, il vincolo x ∊ {0,3} diventa x ∊ [0,3] 02332101

29 Ottimo del rilassamento continuo (stima ottimistica su P 0 ) x*= [x 1 = 3.75, x 2 = 1.75], z L = 24.06 Poichè x 0 non e’ intero, allora applico la divisione della regione ammissibile e la ricorsione agendo su una delle due variabili che ha valore frazionario nell’ottimo del rilassamento continuo: es. x 1 = 3.75 Per definire i due sottoinsiemi, aggiungo un diverso vincolo per ciascuno (rispettivamente x 1  4, x 1  3) tale che partiziona la regione ammissibile di P 0 in due sottoinsiemi eliminando una parte del rilassamento continuo a cui appartiene l’ottimo continuo corrente, ove x 1 assume valori frazionari nell’intervallo aperto (3,4), eliminando così dal processo di ricerca, tutti i punti tali di R 2 tali che 3<x 1 <4.

30 Un esempio z 0 I = max 5x 1 + 17/4 x 2 : x 1 + x 2 ≤ 5 10x 1 + 6x 2 ≤ 45 x 1, x 2 ≥ 0 x 1, x 2  Z x 1 ≤ 3 oppure x 1 ≥ 4 5 0 5 x*

31 Prima partizione di X: branching su x 1 da luogo a due sottoproblemi P1= max 5x 1 + 17/4 x 2 : x 1 + x 2 ≤ 5 10x 1 + 6x 2 ≤ 45 x 1, x 2 ≥ 0 x 1, x 2  Z x 1 ≤ 3 P2 = max 5x 1 + 17/4 x 2 : x 1 + x 2 ≤ 5 10x 1 + 6x 2 ≤ 45 x 1, x 2 ≥ 0 x 1, x 2  Z x 1 ≥ 4 5 4

32 Branching su x 1 Ho eliminato x*!! I sotto-problemi attivi sono le foglie dell’albero corrente, nella fattispecie (P1) e (P2). P0P0 z L 0 = 24.06 x1=3.75, x2=1.25 P1 P2 x1 ≤ 3x1 ≥ 4

33 Risolviamo il rilassamento di P1 z 1 = max 5x 1 + 17/4 x 2 : x 1 + x 2 ≤ 5 10x 1 + 6x 2 ≤ 45 x 1, x 2 ≥ 0 x 1, x 2  Z x 1 ≤ 3 Soluzione ottima del rilassamento x*(P 1 L ): x 1 =3, x 2 =2, con valore z 1 L = 23.5 x*(P 1 L ) e’ INTERA!!! 5 03 x* 2 1

34 Chiudo il nodo di P1 per OTTIMALITA’ La soluzione x=[3,2] è l’ottimo candidato, ma non posso dimostrarne l’ottimalità globale…il bound su P 0 è superiore (24.06>23.5) e ci sono ancora foglie dell’albero aperte…risolviamo P 2 partendo dal suo rilassamento P0P0 z L 0 = 24.06 x1=3.75, x2=1.25 P1 P2 x1 ≤ 3x1 ≥ 4 z L 1 = 23.5 x1=3, x2=2

35 Risolviamo il rilassamento di P2 P 2 = max 5x 1 + 17/4 x 2 : x 1 + x 2 ≤ 5 10x 1 + 6x 2 ≤ 45 x 1, x 2 ≥ 0 x 1, x 2  Z x 1 ≥ 4 0 5 x* La soluzione ottima del rilassamento lineare di (P2) si trova nel punto x1 = 4, x2 = 0.83, con valore z 2 L = 23.54 > 23.5 valore dell’ottimo candidato x* Non posso escludere che in P 2 ci sia una soluzione migliore di x*  Devo procedere con il branching sulla variabile frazionaria x 2

36 espando il nodo P2 facendo branching su x2 P0P0 z L 0 = 24.06 x1=3.75, x2=1.25 P1 P2 x2 ≤ 0 x1 ≥ 4 z L 1 = 23.5 x1=3, x2=2 z 2 L = 23.54 x1 = 4, x2 = 0.83 P3P4 x2 ≥ 1 x1 ≤ 3

37 branching su x 2 P3 = max 5x 1 + 17/4 x 2 : x 1 + x 2 ≤ 5 10x 1 + 6x 2 ≤ 45 x 1, x 2 ≥ 0 x 1, x 2  Z x 1 ≥ 4 x 2 ≤ 0 Il rilassamento vale 22.5 x’ = [4.5,0] in x’ = [4.5,0] dominato da x*. Si vede che ha ottimo intero in x* 3 =[4,0] a costo z L 3 =20 P4 = max 5x 1 + 17/4 x 2 : x 1 + x 2 ≤ 5 10x 1 + 6x 2 ≤ 45 x 1, x 2 ≥ 0 x 1, x 2  Z x 1 ≥ 4 x 2 ≥1 Problema inammissibile! 5 5 x* 3 x’

38 Nessuna foglia dell’albero da esplorare! Posso certificare l’ottimalità di x=[3,2] P0P0 z L 0 = 24.06 x1=3.75, x2=1.25 P1 P2 x2 ≤ 0 x1 ≥ 4 z L 1 = 23.5 x1=3, x2=2 z 2 L = 23.54 x1 = 4, x2 = 0.83 P3P4 x2 ≥ 1 x1 ≤ 3 z 3 L = 22.5 x1 = 4.5, x2 = 0 Infeasible!!

39 model ModelName uses "mmxprs"; declarations x1, x2 : mpvar ! sono continue e non negative per default a1,a2,a3,a4: linctr Objective:linctr end-declarations Objective := 5*x1 + (17/4) *x2 a1:= 10*x1 + 6*x2 <= 45 a2:= x1 + x2 <=5 procedure writesol maximize (Objective) writeln("z* \tx1 \tx2 \n", getobjval, "\t", x1.sol,"\t", x2.sol,"\n") end-procedure writeln("P0, bound al nodo radice") writesol writeln("P1, x1<=3") a3:= x1<=3 writesol write("P1 ha soluzione intera, chiudo il nodo \n\n") writeln("P2, x1>=4") a3:= x1>=4 writesol writeln("P2 ha soluzione continua non dominata, devo fare branching \n\n") writeln("P3, x1>=4 e x2=0") a4:= x2<=0 ! x2=0 writesol writeln("P3: soluzione dominata dall'ottimo candidato, chiudo P3") writeln("P4, x1>=4 e x2>=1") a4:= x2>=1 ! infeasible writeln("P4: sottoproblema infeasible, chiudo P4") writeln("\n non ci sono + nodi aperti in coda\n", " posso certificare l'ottimalita' dell'ottimo candidato STOP") end-model

40 esercizio Sulla falsariga della slide precedente, sviluppare l’albero del B&B utilizzando Xpress come solver per la programmazione lineare, facendo branching su x 2 alla prima iterazione

41 Schema dell’algoritmo di B&B (problema di massimo) Inizializzazione: T := {(P 0 )}, ℓ := 0, LB := −∞, x ∗ non definita; 1.Se esiste un nodo attivo in T, scegli un nodo attivo (P k ), altrimenti ritorna la soluzione ottima x ∗, STOP; 2. Risolvi il rilassamento lineare di (P k ), determinando o una soluzione ottima x(k) di valore z(k) L, oppure che il rilassamento lineare di (P k ) e’ vuoto. (a) Se il rilassamento lineare di (P k ) ´e vuoto: pota (P k ) da T (potatura per inammissibilita´); (b) Se z(k) L ≤ LB, allora (P k ) non puo’ avere soluzioni migliori di quella corrente x ∗ : pota (P k ) da T (potatura per dominanza del bound); (c) Se x(k) i  Z  i  I, allora x(k) ´e ottima per (P k ) e ammissibile per (P 0 ), dunque Se cx(k) > LB, poni x ∗ := x(k) e LB := cx(k); Pota (P k ) da T (potatura per ottimalita’); 3. Se nessuno dei casi (a), (b), (c) si verifica, allora scegli un indice h  I tale che x(k) h  Z, fai branching sulla variabile x h, ponendo come figli di (P k ) in T i problemi (P ℓ+1 ) := (P ℓ ) ∩ {x h ≤ ⌊ x(k) h ⌋ }, (P ℓ+2 ) := (P ℓ ) ∩ {x h ≥ ⌈ x(k) h ⌉ } Poni ℓ := ℓ + 2, torna ad 1. LB: valore dell’ottimo candidato x*, T struttura dell’albero, ℓ indice dei nodi di T

42 Potatura di un nodo (fathoming) Può accadere per 3 condizioni Nodo dominato: il suo bound è peggiore del valore dell’ottimo candidato Soluzione rilassata ammissibile: la soluzione del rilassamento è ammissibile  e’ l’ottimo del sotto-problema associato al nodo. Sotto-problema senza soluzioni esplicitamente implicita In tutti e 3 i casi si evita di esplorare esplicitamente il sottoalbero avente per radice il nodo della potatura: si parla di esplorazione implicita. Tanto + cio’ accade quanto + il processo di soluzione e’ efficiente (esponenziale nel caso pessimo)

43 Elementi di scelta ci sono delle scelte che condizionano le prestazioni del metodo (non il risultato finale) 1.Selezione del prossimo nodo da valutare (strategia di esplorazione dell’albero) 2.Selezione della variabile su cui fare branching (priorita’ fra classi, o per valore del rilassamento continuo) 3.Selezione del tipo di rilassamento da utilizzarsi per il calcolo del bound

44 1) Scelta del nodo da esplorare Posso esplorare l’albero delle decisioni secondo le classiche politiche topologiche o in base a un criterio di priorita’: Depth first Breadth first Best bound first Ibride (DF + BB)

45 Depth first: procede in profondita’ cercando una foglia dell’albero risolvibile che fornisca una soluzione ammissibile velocemente: spesso fallisce (non e’ una ricerca guidata dall’ informazione), non da garanzia sulla qualita’ della soluzione prodotta, ma genera pochi nodi attivi nodi attivi. P 0 z0=45 P1 z1=42.7 z2=44 P2 P3 z3=41.5P4 z4=40 P6 z6=38.9 P8 z8=37.6 P7 z7=38.6 P10 z10=36.3 P12 P11 z*11=35 P9 z9=34.8 P5 z5=40.1 Si sfrutta la Riottimizzazione: VELOCE

46 Breadth first: procede in ampiezza generando tutti i nodi al medesimo livello l prima di procedere al livello successivo. esponenzialinodi attivi cresce con 2 Dimensioni esponenziali dell’albero: Il numero dei nodi attivi cresce con 2 l. P0P0 P1 P2 P3P4 P5P6 P7 P8

47 Best Bound First: Ad ogni iterazione seleziona il nodo attivo + promettente = col bound migliore: genera + nodi di DF, (potenzialmente esponenziale) ma la ricerca e’ guidata dall’informazione P 0 z0=45 P1 z1=43 P2 z2=42.8 P3 z3=42P4 z4=39.6 P5 z5=41 P6 z6=37 P7 z7=35P8 z8=37.8 Richiede apposite strutture dati per gestire i nodi attivi Heap per coda di priorità Si tende a rimanere in superficie in T  Pochiaggiornamenti di x* P10 z10=40.8z9=40.1 P9 z11=40.3 P11 P12 z12=38.9 z13=38.1 P13P14 z14=40

48 Ibride (DF+BBF) Procede con la struttura del depth first ma ad ogni iterazione sceglie il fratello con il bound migliore; Oppure: Depth first fino a che non ha determinato una soluzione ammissibile, poi best bound first

49 Per questo problema il valore del rilassamento continuo si puo’ calcolare manualmente senza l’ausilio di un solver, secondo un procedimento di tipo GREEDY come descritto nel seguito. Esempio: confrontiamo diverse politiche di esplorazione dell’ albero di B&B per un’istanza del problema di zaino binario. Per questo problema il valore del rilassamento continuo si puo’ calcolare manualmente senza l’ausilio di un solver, secondo un procedimento di tipo GREEDY come descritto nel seguito. P = max {vx : px  q, x i  {0,1}  i  1,..,n, con q,v i,p i  0} 1.Ordinare gli elementi in modo decrescente secondo il rapporto (valore/peso) (v i /p i  v i+1 /p i+1 ) 2.Inserire gli elementi in soluzione secondo tale ordine, con valore 1 se il peso e’ compatibile con la capacita’ residua, con valore frazionario pari al rapporto capacita’-residua /peso in caso contrario La soluzione e’ un vettore con un unico elemento frazionario Si consideri l’istanza max 3x 1 + 7x 2 + 9x 3 + 7x 4 + 2x 5 : 4x 1 + 8x 2 + 6x 3 + 10x 4 + 3x 5  25x i  {0,1}  i  1,..,5 e si confrontino le strategie di esplorazione Best Bound e Depth First in base al numero di nodi dell’albero che vengono generati

50 Inizio comune a entrambe le politiche: secondo l’ordinamento non decrescente del rapporto valore/peso, le variabili sono ordinate come x3, x2, x1, x4, x5 Rilassamento continuo al nodo radice P1: x 1 =[1,1,1,7/10,0], z 1 =23.9 Espando P1, facendo branching sulla variabile x 4. Nel vettore x i, soluzione del rilassamento continuo del nodo i esimo dell’albero di B&B, sono evidenziati in rosso i valori delle variabili fissate dai branching fatti lungo il cammino dalla radice fino al nodo i. Dal branching binario su x 4, creo i due sottoproblemi P2 e P3: P2=P1  (x 4 =1): x 2 =[1/4,1,1, 1,0], z 2 =23.75 feasible P3=P1  (x 4 =0): x 3 =[1,1,1, 0,1], z 3 =21 feasible!  Chiudo Chiudo il nodo P3, resta aperto solo P2, poiche’ il valore del suo rilassamento 23.75 non è dominato dal valore dell’ottimo candidato z 3 =21. Espando P2, facendo branching su x 1 : creo P4 e P5: P4=P2  (x 1 =1): x 4 =[1,5/8,1, 1,0], z 4 =23.375 P5=P2  (x 1 =0): x 5 =[0,1,1, 1,1/3], z 5 =23.66 QUI si differenziano le 2 strategie: DF espande P4, BF espande P5

51 Se implementassi la politica DF creerei i seguenti nodi nell’ordine indicato: Espando il nodo P4, facendo branching su x 2 e creando P6 e P7: chiudo P6=P4  (x 2 =1): x 6 =[1,1,1/2,1,0], z 6 =21.5: dominato da z 3 (z * deve essere intero) chiudo il nodo P6. chiudo P7=P4  (x 2 =0): x 7 =[1,0,1,1,1], z 7 =21 feasible! chiudo il nodo P7 Espando il nodo P5, facendo branching su x 5 e creando i nodi P8 e P9: chiudo P8=P5  (x 5 =1): x 8 =[0,3/4,1,1,1], z 8 =21.25 dominato da z 3, chiudo il nodo 8 chiudo P9=P5  (x 5 =0): x 9 =[0,1,1,1,0], z 9 =23 feasible! chiudo il nodo 9. x 9 è il nuovo ottimo candidato e anche l’ottimo globale del problema, avendo esaurito la coda dei nodi aperti.

52 Se implementassi la politica BF creerei i seguenti nodi nell’ordine indicato: Espando P5 (x 5 =[0,1,1, 1,1/3], z 5 =23.66) facendo branching su x 5 e creando P8 e P9 chiudo P8=P5  (x 5 =1): x 8 =[0,3/4,1,1,1], z 8 =21.25 dominato da z 3, chiudo il nodo 8 chiudo chiudoper dominanzaP4senza aver generato P6 e P7 P9=P5  (x 5 =0): x 9 =[0,1,1,1,0], z 9 =23 feasible! chiudo il nodo e chiudo per dominanza P4 senza aver generato P6 e P7. Avendo esaurito la coda dei nodi aperti, l’ottimo candidato x 9 è l’ottimo globale! BF ha processato 5+2=7 nodi. DF ha processato 5+4=9 nodi.

53 Elementi di scelta ci sono delle scelte che condizionano le prestazioni del metodo (non il risultato finale) 1.Selezione del prossimo nodo da valutare (strategia di esplorazione dell’albero) 2.Selezione della variabile su cui fare branching (priorità fra classi, o valore delle variabili nel rilassamento continuo) 3.Selezione del tipo di rilassamento da utilizzarsi per il calcolo del bound Come impostare queste opzioni per l’ottimizzatore Xpress nei modelli Mosel ? RefManual_XpressOptimizer.June2009.pdf Si veda il manuale RefManual_XpressOptimizer.June2009.pdf sul sito del corso Sez. 4.3 pg 19

54 2) Selezione della variabile di branching (in presenza di + variabili frazionarie nella soluzione ottima del rilassamento) design >> uso 1.Riprodurre una priorità strategica delle decisioni (design >> uso nel facility location) 2.Basarsi sulla max frazionarietà (x ~ n.5) (opzione di default nei solver) generazione dinamica delle colonne, trattata nel seguito 3.Basarsi su un principio ad hoc di classificazione delle soluzioni intere che elimini l’ottimo continuo partizionando la regione ammissibile in modo bilanciato, e in modo compatibile con le regola di descrizione delle variabili (colonne della matrice dei vincoli) in uno spazio decisionale potenzialmente diverso. Tale compatibilità è condizione necessaria per gestire la generazione dinamica delle colonne, trattata nel seguito 4.GUB Generalized Upper Bound: quando il modello contiene il vincolo che impone una sola variabile pari a 1 in un dato set ∑ i  S x i =1  il branching binario più bilanciato si ottiene partizionando l’insieme S in S1 e S2 con |S1|=|S2| e modificando il vincolo nei due figli in ∑ i  S1 x i =1 e ∑ i  S2 x i =1 rispettivamente. NB xi  Z   xj  Z  xi  S1  xj  S2 Criterio ideale Criterio ideale: ripartisce le regioni ammissibili dei sottoproblemi in maniera bilanciata  limita la profondità dell’albero Per implementare l’equiripartizione si utilizzando 4 criteri, ciascuno dei quali garantisce anche che la soluzione associata al punto di ottimo del rilassamento continuo del nodo padre non appartiene alla regione ammissibile di nessuno dei nodi figli:

55 Un esempio per il criterio 1: Uncapacitated Facility Location date n località J={1..n} ove realizzare k<n facilities (centri di servizio quali magazzini, centri assistenza, punti di vendita, siti produttivi, etc..) noti i costi fissi di installazione f j  localita’ j  J dati m clienti I={1..m} noti i costi di servizio c ij per servire l’utente i  I tramite il centro di servizio realizzato in j  J Determinare costo totale “dove localizzare i k centri a costo totale minimo?” costo totalecosti fissi costi di servizio Il costo totale include sia i costi fissi di installazione delle facilities che i costi di servizio dei clienti

56 Uncapacitated Facility Location Modello di PLI per UFL Uncapacitated Facility Location Min fy + cx :  j y j = k (vincolo di cardinalità)  i x ij  m y j  j  J (vincolo aggregato di consistenza logica)  j x ij =1  i  I (vincolo di semiassegnamento) designy j  {0,1}  j  J variabile di design usox ij  {0,1}  i  I,  j  J variabile di uso opzionale I due gruppi di variabili X e Y attengono a livelli decisionali diversi, livello tattico le Y, livello operativo le X. Questa gerarchia si deve riflettere nella priorita’ di scelta come variabili di branching nell’ambito dell’algoritmo di Branch & Bound

57 facili Rappresentazione grafica di una soluzione ammissibile per k=4 Note le y, le x sono facili: a ogni cliente i si assegna la facility j aperta + vicina In assenza del vincolo di capacità si tratta di una decisione locale, poiche la decisione del cliente i non influisce sulla decisione degli altri clienti.. Priorità nel branching alle variabili di design Y A C D B 1 1 9 8 7 6 5 4 3 2 10 12 13 14 15 11

58 Diverso è il caso in cui le facilities offrono una quantità limitata di servizio Cap j e i clienti hanno una domanda di servizio >0 Dem i (si dicono problemi capacitati) In tal caso, la capacità del centro va ripartita tra i clienti, ed esiste interdipendenza tra le decisioni dei diversi clienti. Ciononostante, noti i centri aperti, l’assegnazione dei clienti se questi possono suddividere la propria domanda su più centri, è un problema facile (flusso di costo minimo). Altrimenti, in caso di selezione esclusiva (ogni cliente soddisfa la propria domanda attraverso un solo centro) il problema è difficile. Flusso di costo minimo su grafo bipartito capacitato ACDB 198765432101213141511 Cap A Cap D Cap C Cap B Dem 1 Dem 6 Dem 15 … …… … … … … … … … … … ….

59 esercizi Confronta con Xpress il valore del rilassamento continuo della formulazione compatta del Uncapacitated Facility Location (UFL) e della formulazione estesa, in cui gli n vincoli di consistenza sono sostituiti dagli m  n vincoli di implicazione x ij  y j. Quale delle due formulazioni e’ migliore? Perche’? Formulare i modelli di PLI per le varianti del problema con serventi capacitati (ogni cliente ha una domanda di servizio e ogni servente una massima capacita’) nei casi di unico servente per ogni cliente o piu’ serventi.

60 Modello di PLI per Capacitated FL: aggiungiamo una domanda per ogni cliente e una capacità di servizio per ogni facility Min fy + cx :  j y j = k (vincolo di cardinalita’)  i x ij  m y j  j  J (vincolo di consistenza aggregato) # n x ij  y j  j  J,  i  I (vincolo di consistenza esplicito) # m*n  i dem i x ij  Cap  j  J(vincolo di capacità)  i dem i x ij  Cap y j  j  J(vincolo di capacità & vincolo di consistenza)  j x ij =1  i  I(vincolo di semiassegnamento) y j  {0,1}  j  J variabile di design x ij  {0,1}  i  I variabile di uso opzionale I vincoli di capacità possono inglobare i vincoli di consistenza se il termine noto viene moltiplicato per la variabile y. Una variante del modello prevede di utilizzare al posto delle x ij binarie delle variabili flow ij che esprimono la domanda del cliente i servita dalla facility j e vale flow ij = dem i x ij Il vincolo di assegnamento viene sostituito dal vincolo Il vincolo di assegnamento viene sostituito dal vincolo  j flow ij = dem i La scelta fra modelli diversi va basata sulla vicinanza del valore del rilassamento continuo al valore dell’ottimo intero (qualità del bound) che è totale nel caso di formulazione ideale.

61 Esempio per la regola 3: Modello di set partitioning per il Aircraft Crew Scheduling (ACS) problem Dato un set di voli, V={1..n} Dato un insieme di turni (sequenza di voli ) ammissibili Dati i costi di ciascun turno ammissibile Il problema ACS viene descritto come selezionare il sottoinsieme di turni di costo minimo che partizionano l’insieme V

62 Osservazione: il numero di turni ammissibili può essere molto elevato. E’ preferibile descriverlo in modo IMPLICITO Dato un set di voli, V={1..n} Date delle regole per fare un turno ammissibileDate delle regole per fare un turno ammissibile (turno = sequenza di voli tali che i voli –Siano una sequenza compatibile spazio-tempo –La durata media delle ore di volo giornaliere sia < 9 –Inizi e termini presso una base… ) Dati i costi di ciascun turno ammissibile Selezionare il sottoinsieme di turni di costo minimo che partizionano V Le colonne del problema (i turni ammissibili) possono essere definiti implicitamente implicitamente fornendo il set dei voli e le regole per costruire turni ammissibili.  una colonna e’ descritta da un’insieme di decisioni prese in un apposito spazio decisionale, diverso da quello di partenza.  La regola di branching deve potersi integrare con le regole per la costruzione di un turno ammissibile, nell’ambito di quello spazio decisionale.

63 Modello di set partitioning per ACS: Matrice caratteristica dei turni (pairing) A = [a ij ] dove a ij  {0,1} (a ij =1 se volo i  turno j) Vettore dei costi c = [c 1,..,c n ] Vettore delle variabili x  {0,1} n (x j =1 se il turno j e’ selezionato in soluzione) 1 Min cx : Ax=1 n, x j  {0,1}

64 Esempio [A98] LegFromToTdepTarr L 1AB6:3012:30 L 2BA14:3021:30 L 3BC10:1511:45 L 4CB12:1513:45 L 5BC14:1515:45 L 6CB16:1517:45 REGOLE REGOLE: Crew Base Stations = {A,B} Max.num.duty = 2 durata (duty)  12h 32h  riposo (d1,d2)  Max {9h  3/2·durata (d1)} Costo = numero giorni

65 Insieme dei turni ammissibili (Legal Pairings) P P1={1 / 2} P2={1 / 3,4,2} P3={1,5 / 4,2}P4={1,5,6 / 2} P5={3,4} P6={3,6} P7={5,6} P8={3,4,5,6} P9={2 / 1} ~P1P10={2 / 1,5,6} P11={3 / 4,5,6}P12={5 / 4} Pairings NON ammissibili nella partizione o dominati da altri che coprono gli stessi leg ma con costo minore: P13={3 / 4} dominato da P5, P16={3 / 6} dominato da P6, P14={3,4,5 / 4} ripetizione di 4, P17={5 / 4,5,6} ripetizione di 5, P15={3,4,5 / 4,5,6} ripetizione di 4 e 5

66 Modello ACS A = 11000110010 11000110010 00101101100 01101100101 01011010111 00011011110 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 = 1 1 1 1 1 1 x i  {0,1} c = [2,2,1,1,1,2,2,1,2,2,2]

67 Come genero i turni? I modelli di set partitioning si utilizzano perchè hanno – Un duality gap molto ridotto (differenza tra il valore del rilassamento continuo z L e il valore ottimo intero z*) anche se hanno –  Un elevatissimo numero di variabili = colonne della matrice A Si utilizzano quando so gestire in modo efficiente le dimensioni del set di colonne  dinamicacolonne on- demand ho un algoritmo per la generazione dinamica delle colonne (colonne on- demand!!) In ACS: i turni ammissibili sono potenzialmente in numero esponenziale rispetto ai voli: come li genero? In modo dinamico, come cammini (ammissibili) in un grafo particolare. la regola di branching deve essere COMPATIBILE con la modalità di generazione delle colonne del modelloQuindi la regola di branching deve essere COMPATIBILE con la modalità di generazione delle colonne del modello Vediamo a titolo di esempio, come modellizzare i turni come cammini ammissibili su apposite reti

68 reti spazio temporale Un tipo di Flight Network: le reti spazio temporale Gli archi rappresentano sia voli (dati) che decisioni (variabili) sit connections: connessione fra l’arrivo di un volo e la partenza di un volo successivo nel giorno corrente layover che collegano un volo a un altro volo del giorno successivo collegamenti fra il nodo s associato alla base e ciascun volo in partenza dalla base, collegamenti tra voli che terminano presso la base e il nodo t associato a tale base Ogni turno é un cammino tra s e t, ma non vale l’inverso i.e., l’ammissibilità di un layover dipende dall’intero duty che lo precede

69 Space-time Network Flight 1: A –B 08:00 – 09:00 Flight 2: B –C 10:00 – 11:00 Flight 3: C –D 13:00 – 14:00 Flight 4: D –A 15:00 – 16:00 Legs Sit connections o layover A e’ la base degli equipaggi

70 I turni sono cammini sulla rete dei voli: un esempio di rete di compatibilità 1 nodo  volo, 1 arco  coppia di voli compatibili JFKBOSBOSJFK JFK BOS BOS JFK 8:15 9:45 16:00 17:30 375 PHLBOS PHL BOS 45 13:30 15:15 JFKPHLPHLJFK JFK PHL 210 PHL JFK 9:00 10:00 240 14:00 15:00

71 Branching sulle componenti frazionarie di x: Imporre x j =1  mettere il turno j in soluzione Imporre x j =0  escludere il turno j dalla soluzione squilibratala regione ammissibile del ramo x j =0 è ~ quella del padre!!  Partizione squilibrata, la regione ammissibile del ramo x j =0 è ~ quella del padre!! escludere il turno  Complicato escludere il turno j dalla soluzione nel ramo x j =0 (?? come proibire QUEL cammino sulla flight network ??) Branching sulla decisione di svolgere due voli v 1, v 2 di seguito in uno stesso turno: regola del follow on I sottoproblemi P s e P s+1 associati ai nodi figli dopo il branching sulla coppia di voli (v 1,v 2 ) e la loro regione ammissibile F(P): F(P s ) = { tutte le soluzioni in cui i voli v 1 e v 2 NON SONO mai di seguito nello stesso turno } F(P s+1 ) = { tutte le soluzioni in cui i voli v 1 e v 2 SONO di seguito nello stesso turno }

72 Teorema dei Follows-on HP: x é una soluzione frazionaria del set partitioning   due colonne (turni) j,k tali che 0 < x j, x k < 1. Infatti una singola variabile non puo’ essere l’unica a valore frazionario avendo ogni equazione, associata a uno specifico volo, termine noto =1.  una riga (volo) r tale che a rj =a rk =1, per l’argomento precedente.  una riga (volo) s, con v s compatibile con v r, tale che a sj =1 & a sk =0. DIM: se per assurdo cosi’ non fosse (a sj =a sk =1), e cio’ non valesse nemmeno per alcun successore ne predecessore di v s lungo il turno j, allora il turno j coinciderebbe con il turno k o ne sarebbe un sottoinsieme, risultando quindi dominato, non in soluzione ottima. Il branching la regione ammissibile in base alla regola: Il branching partiziona la regione ammissibile in base alla regola: I voli r e s sono coperti da turni diversi, oppure sono nello stesso turno ma non in sequenza I voli r e s sono coperti in sequenza dallo stesso turno  = vrvr Turno j Turno k vsvs

73 Follows-on per ACS: è un esempio di come il criterio di branching garantisce la equiripartizione della regione ammissibile fra i due nodi dell’albero derivati dal branching ed è compatibile con la regola di generazione dei turni per la generazione di colonne Siano r e s due voli operabili in successione (collegati da un arco) Il branching Follow-on(r,s) si implementa nella topologia della rete su cui si effettua la generazione dei turni come cammini Flight Network: rete di compatibilità dei voli Ramo = del branching: la rete si modifica rimuovendo dalla rete tutti gli archi uscenti da r e tutti quelli entranti in s, tranne l’arco (r,s), in modo che r abbia un unico successore. Ramo  del branching: la rete si modifica rimuovendo l’arco (r,s) dalla rete, in modo che la sequenza di voli r,s non possa comparire in alcun cammino (turno) generato sulla rete.

74 Esercizio settimanale Esercizio: Formula il problema di Air Crew Scheduling settimanale per il seguente input: Voli da a td tafreq (settimanale) 1AB8:009:00 1,2,3,4,5 2BC10:0011:00 1,2,3,4,5,6,7 3CD13:0014:00 1,2,3,4,5,6 4CA15:0016:00 1,2,3,4,5,6,7 5DA15:0016:00 1,2,3,4,5,7 6AB17:0018:00 1,2,3,4,5,6,7 7BC11:0012:00 1,2,3,4,5 Regole: 1h fra 2 voli consecutivi; non + di 6hdi volo al giorno in un turno; A,C,D sono basi, turni di al + 2 giorni.


Scaricare ppt "Programmazione Lineare INTERA Fischetti Cap 5, Potenzialità espressive delle variabili binarie Linearizzazione di espressioni non lineari Branch and Bound."

Presentazioni simili


Annunci Google