Uso di MPL e Solver per problemi LP ed ILP Michele Monaci e Daniele Vigo D.E.I.S. Università di Bologna dvigo@deis.unibo.it rev. 3.0 ottobre 2002 Uso di Modelli Matematici (1) Problema della dieta: n possibili cibi m sostanze nutritive b i fabbisogno giornaliero sostanza i c j costo cibo j a ij quantità di sostanza i per unità di cibo j minimizzare il costo totale assicurando il fabbisogno giornaliero di ogni sostanza MPL.Intro.2 1
Uso di Modelli Matematici (2) Modello matematico: min n = 1 j n j = 1 c j x j = K a x b i 1,, m ij j i x j 0 j = 1, K, n MPL.Intro.3 n = 5 m = 8 c j = { 10, 8, 15, 6, 16 } Dieta - esempio b i = {40,20,30,10,42,41,65,17} a ij = {0, 14, 2, 36, 0, 55, 33, 44 36, 89, 1, 99, 30, 17, 7, 10 8, 42, 15, 9, 26, 3, 23, 11 20, 17, 0, 6, 55, 1, 0, 0 7, 44, 16, 19, 28, 0, 10, 4 } MPL.Intro.4 2
Soluzione 1: scrittura manuale /* file CPLEX */ MINIMIZE z: 10 x1 + 8 x2 + 15 x3 + 6 x4 + 16 x5 SUBJECT TO CONSTR1: 36 x2 + 8 x3 + 20 x4 + 7 x5 >= 40 CONSTR2: 14 x1 + 89 x2 + 42 x3 + 17 x4 + 44 x5 >= 20 CONSTR3: 2 x1 + x2 + 15 x3 + 16 x5 >= 30 CONSTR4: 36 x1 + 99 x2 + 9 x3 + 6 x4 + 19 x5 >= 10 CONSTR5: 30 x2 + 26 x3 + 55 x4 + 28 x5 >= 42 CONSTR6: 55 x1 + 17 x2 + 3 x3 + x4 >= 41 CONSTR7: 33 x1 + 7 x2 + 23 x3 + 10 x5 >= 65 CONSTR8: 44 x1 + 10 x2 + 11 x3 + 4 x5 >= 17 END MPL.Intro.5 Soluzione 2: scrittura su File Void scrivi( n, m, a, b, c) { int i, j; FILE *fout; fout = fopen( input.lp,w); fprintf(fout, MINIMIZE\n Z: ); for ( j = 1; j <= n; j++ ) if (c[j] > 0) fprintf(fout, +%d x%d,c[j], j ); fprintf(fout, \n SUBJECT TO \n ); for ( i = 1; i <= m; i++ ) { fprintf(fout, CONSTR%d :,i ); for ( j = 1; j <= n; j++ ) if (a[i][j]>0) fprintf(fout, +%d x%d,a[i][j],j); fprintf(fout, >= %d \n,b[i] ); } fprintf(fout, END\n ); fclose(fout); } MPL.Intro.6 3
Soluzione 3: MPL { Diet.mpl } TITLE Example INDEX nutrients = 1..8 foods := ( pasta, ham, cheese, egg, bread ) DATA Required[nutrients] = ( 40! Calories [thousands] 20! Protein [grams] 30! Calcium [grams] 10! Iron [milligrams] 42! Avitamin [thousand ius] 41! Thiamine (B1) [milligrams] 65! Riboflavin (B2) [milligrams] 17 );! Niacin [milligrams] Cost[foods] = ( 10, 8, 15, 6, 16 ); A[foods,nutrients] = DATAFILE(input.dat)! Nuritive values of foods. DECISION x[foods]! dollars of food to be purchased daily MODEL MIN z = SUM(foods: Cost*x) ; SUBJECT TO CONSTR[nutrients] : SUM(foods: A*x) > Required[nutrients] END MPL.Intro.7 Soluzione 4: Solver di Excel Problema della Dieta B C D E F G H I J K (1000) (g) (g) (mg) (1000 ius) (B1) (mg) (B2) (mg) (mg) Costo Calorie Proteine Calcio Ferro Vit. A Tiamina Riboflavina Niacina /Kg Fabbisogno giornaliero 40 20 30 10 42 41 65 17 qta (Kg) Cibo 1 0 14 2 36 0 55 33 44 10 0.508369 Cibo 2 36 89 1 99 30 17 7 10 8 0.691981 Cibo 3 8 42 15 9 26 3 23 11 15 1.886085 Cibo 4 20 17 0 6 55 1 0 0 6 0 Cibo 5 7 44 16 19 28 0 10 4 16 0 Contenuto dieta 40 147.9191 30 103.7822 69.79765 45.38221 65 50.03497 costo complessivo ( ) 38.91082 =MATR.SOMMA.PRODOTTO(B7:B11;$K$7:$K$11) =MATR.SOMMA.PRODOTTO(J7:J11;K7:K11) MPL.Intro.8 4
MPL: Introduzione MPL è un pacchetto software che permette di implementare problemi di programmazione lineare (LP) e programmazione lineare intera (ILP) in modo chiaro, efficiente e conciso. E un linguaggio ad alto livello che permette di descrivere sistemi anche molto complessi. E possibile introdurre commenti e definizioni linguistiche che facilitano la comprensione anche ai non programmatori. MPL.Intro.9 MPL: Introduzione (2) I programmi vengono scritti con un semplice editor di testo e sono indipendenti dalla piattaforma sulla quale sono eseguiti (Windows, Unix, Macintosh, OSF Motif). Nell output sono indicate, in modo comprensibile, tutte le operazioni svolte dal risolutore. Si può interfacciare con strumenti di grafica. MPL.Intro.10 5
MPL Modeling System (1) MODELS DATA MPL SOLVERS MPL.Intro.11 MPL Modeling System (2) MPL si può utilizzare i seguenti Solvers: CPLEX OSL XA FrontLine Lindo FortMP C-Whiz XPress-MP MPL.Intro.12 6
MPL: Input data MPL consente di acquisire i dati di input: Direttamente nel file MPL Da file di testo (ASCII) Da database esterno (ACCESS, EXCEL, ODBC, ORACLE...) Da database interno a MPL MPL.Intro.13 MPL Modeling Language Alcune caratteristiche: Utilizzo di nomi lunghi e alias. Importazione dati da altri programmi. Inclusione di file e direttive condizionali. Utilizzo di sommatorie di vettori e matric Lunghezza righe: 255 caratteri (oltre ignorati) Separatori: i diversi statement all interno dello stesso blocco devono essere divisi dal punto e virgola ; Commenti: le parentesi graffe {} racchiudono un blocco di commenti anche su piu` righe. Il punto esclamativo! delimita l inizio di un commento che termina a fine riga. MPL.Intro.14 7
Struttura file MPL (1) Parte 1: Dichiarazioni TITLE: Nome del Modello (Opzionale) INDEX: Definizione indici per insiemi DATA: Vettori di input e costanti DECISION: Variabili decisionali MACRO: Definizione di macro MPL.Intro.15 Struttura file MPL (2) Parte 2: Il modello MODEL MAX/MIN: Funzione obiettivo SUBJECT TO: Vincoli del modello BOUNDS: Upper e Lower bounds sulle variabili INTEGER: Variabili intere BINARY: Variabili binarie FREE: Variabili libere END MPL.Intro.16 8
INDEX (1) Gli indici definiscono i domini del problema. Possono essere: Numerici: nutrients:= 1..8; Nominali: foods:=(pasta, ham, cheese, egg, bread); Associati ad Alias: foods:=(pasta, ham, cheese, egg, bread) -> (p, h, c, e, b); MPL.Intro.17 INDEX (2) E possibile definire indici circolari (modulo) day := (mo, tu, we, th, fr, sa, su) CIRCULAR; month := 1..12 CIRCULAR; sottoinsiemi di indici. holiday[day] := (sa, su); summer[month] := (7..9); MPL.Intro.18 9
DATA (1) In questa sezione si specificano i coefficienti utilizzati dal modello (costanti o vettori) Costanti: MinP:= 1 Vettori: Required[nutrients] := (40, 20, 30, 10, 42, 41, 65, 17); Vengono generate le variabili Required1, Required2, Required3, Required4, Required5, Required6, Required7, Required8 MPL.Intro.19 DATA (2) Dati da una fonte esterna: File di testo: A[foods,nutrients]:=DATAFILE( input.dat"); { input.dat } Calories Protein Calcium Iron VitaminA Thiamine Riboflavin Niacin! (1000) (grams) (grams) (MG) (1000 IU) (MG) (MG) (MG) WheatFlour 0 14 2 36 0 55 33 44 CornMeal 36 89 1 99 30 17 7 10 EvapMilk 8 42 15 9 26 3 23 11 Margarine 20 17 0 6 55 1 0 0 Cheese 7 44 16 19 28 0 10 4 Database Excel: A [foods,nutrients]= EXCELRANGE( input.xls", foods"); MPL.Intro.20 10
DECISION (1) DECISION In questa sezione sono definite le variabili decisionali del problema Per definire un insieme di variabili con lo stesso nome, si indica il nome del vettore e la dimensione del vettore stesso Es: X[foods]; Si possono definire variabili multidimensionali. Es: MultiVar[foods,nutrients] -> Y; MPL.Intro.21 DECISION (2) Se alcune delle variabili decisionali sono intere bisogna indicare ciò con la parola chiave INTEGER Nel caso in cui siano binarie si usa BINARY Es: INTEGER VARIABLES MultiVar[foods,nutrients]; MPL.Intro.22 11
FUNZIONE OBIETTIVO Esprime la funzione lineare da ottimizzare. Deve essere indicata all inizio del file MPL; preceduta dalla parola chiave MIN o MAX; ES: MAX 3x1 + 5x2 ; MIN Z = SUM(foods:cost*x); MINIMIZE Cost = SUM(foods,nutrients : Y) ; MPL.Intro.23 VINCOLI (1) I vincoli del modello vengono definiti immediatamente dopo la funzione obiettivo. Preceduti dalla parola chiave SUBJECT TO Ogni vincolo deve terminare con il carattere ; I plain constraints sono espressi direttamente Es: X1 + X2 + X3 >= 2; I vector constraints sono associati ad indici. Es: CONSTRAINT[nutrients]: SUM(foods:A*x)>required[nutrients]; MPL.Intro.24 12
VINCOLI (2) è possibile scrivere dei vector constraints solo su un sottoinsieme degli indici o in base a determinate condizioni. Es: CONSTR[nutrients=1..4] : CONSTR[foods,nutrients] WHERE (foods > bread) : MPL.Intro.25 VINCOLI (3) VINCOLO NON CIRCOLARE Xj + X(j+1) +.X(j+k) >= a INDEX j:= 1..10; SUM(h=j..j+k: x) >= a VINCOLO CIRCOLARE se j+k > 10 (es.: j=7, k=5) X7 + X8 + X9 + X10 + X1 + X2 >= a INDEX kk:= 1..5; SUM(kk: x[j+kk]) >= a MPL.Intro.26 13
BOUNDS è possibile indicare nel modello un lower bound e/o un upper bound per ogni variabile. Si utilizza la parola chiave BOUNDS Es: BOUNDS X1 >= MinP; y_bound: 2 < Y(1,1) < 8 ; Default: lower bound =0 per tutte le variabili. Il file MPL deve terminare con la parola END MPL.Intro.27 Modello completo { Diet.mpl } TITLE Example INDEX nutrients = 1..8 foods := ( pasta, ham, cheese, egg, bread ) DATA Required[nutrients] = ( 40! Calories [thousands] 20! Protein [grams] 30! Calcium [grams] 10! Iron [milligrams] 42! Avitamin [thousand ius] 41! Thiamine (B1) [milligrams] 65! Riboflavin (B2) [milligrams] 17 );! Niacin [milligrams] Cost[foods] = ( 10, 8, 15, 6, 16 ); A[foods,nutrients] = DATAFILE(input.dat)! Nuritive values of foods. DECISION x[foods]! dollars of food to be purchased daily MODEL MIN z = SUM(foods: Cost*x) ; SUBJECT TO CONSTR[nutrients] : SUM(foods: A*x) > Required[nutrients] END MPL.Intro.28 14
Ambiente MPL MPL.Intro.29 15