Soluzione di problemi di ottimizzazione Problema di ottimizzazione: min z = c x A x b x 0 Possibili ulteriori vincoli (Es.: x INTERO) Soluzione: Trovare x* tale che c x* <= c x per ogni x A x b, x>=0 MPL-LE.1 Solutori di problemi di PL/PLI Input: n, m, (c), (A), (b) Eventuali altri vincoli (interezza variabili) Output: z, (x) Informazioni aggiuntive (variabili duali, costi ridotti, ) MPL-LE.2
Uso di Modelli Matematici (1) Es: 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 Determinare la dieta (mix di alimenti) di costo minimo, assicurando il fabbisogno giornaliero di ogni sostanza MPL-LE.3 Uso di Modelli Matematici (2) x j = quantità di alimento j nella dieta (j=1,,n) Modello matematico: min Σ j=1,n c j x j Σ j=1,n a ij x j b i x j 0 i = 1,, m j = 1,., n MPL-LE.4
Dieta - esempio n = 5 m = 8 c j = {10,8,15,6,16} 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-LE.5 Soluzione 1: scrittura manuale Definizione di un file di input (testo) per un risolutore (es. Cplex) /* 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-LE.6
Soluzione 2: scrittura su File Scrittura automatica del file di input (testo) void diet( n, m, a, b, c) { int i, j; FILE *fou; } fou = fopen( diet.lp,w); fprintf(fou, MINIMIZE\n Z: ); for (j = 1; j <= n; j++) fprintf(fou, +%d x%d,c[j], j ); fprintf(fou, \n SUBJECT TO \n ); for (i = 1; i <= m; i++) { fprintf(fou, CONSTR%d :,i ); for (j = 1; j <= n; j++) fprintf(fou, +%d x%d,a[i,j],j); fprintf(fou, >= %d \n,b[i] ); } fprintf(fou, END\n ); fclose(fou); MPL-LE.7 Soluzione 3: MPL Modello MPL del problema { 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-LE.8
Soluzione 4: MPL+DATABASE Modello MPL del problema integrato con una base di dati { Diet.mpl } TITLE Example OPTIONS DatabaseType = Access DatabaseAccess = diet.mdb" INDEX nutrients := DATABASE( sostanze", sostanzaid"); foods := DATABASE( cibi", ciboid"); DATA Required[nutrients] = DATABASE( sostanze", min_req"); Cost[foods] = DATABASE( cibi", costo_unit"); A[foods,nutrients] = DATABASE("valori", foods="idfoods", nutrients="idnutrients"); DECISION x[foods] EXPORT ACTIVITY TO DATABASE( sostanze ); MODEL MIN z = SUM(foods: Cost*x) ; SUBJECT TO CONSTR[nutrients] : SUM(foods: A*x) > Required[nutrients] END MPL-LE.9 MPL: Introduzione (1) MPL è un pacchetto software che permette di implementare problemi di Programmazione Lineare (PL) e Programmazione Lineare Intera (PLI) in modo chiaro, efficiente e conciso. E dotato di un linguaggio ad alto livello che permette di descrivere sistemi anche molto complessi. Realizza la separazione tra dati e modello. MPL-LE.10
MPL: Introduzione (2) I modelli sono indipendenti dal risolutore impiegato e dalla piattaforma sulla quale sono eseguiti (Windows, Unix, Macintosh, OSF Motif) Permette di importare i dati da diverse sorgenti (file di testo, excel, database, ) Nell output sono indicate, in modo comprensibile, tutte le operazioni svolte dal risolutore. Si può interfacciare con strumenti di grafica. MPL-LE.11 MPL: Introduzione (3) Esiste una libreria di oggetti (Optimax 2000) che contiene tutte le funzioni MPL e può essere usata da Visual Basic e Visual C++ E possibile introdurre commenti e definizioni linguistiche che facilitano la comprensione anche ai non programmatori. MPL-LE.12
MPL Modeling System (1) MODELS DATA MPL SOLVERS MPL-LE.13 MPL: Solver MPL si può interfacciare con i seguenti Solvers: CPLEX (ILOG) XPress-MP (DASH Associates) OSL XA FrontLine Lindo FortMP C-Whiz MPL-LE.14
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-LE.15 MPL: Modeling Language (1) Alcune caratteristiche: Utilizzo di nomi lunghi e alias. Importazione dati da altri programmi. Inclusione di file e direttive condizionali (#include, #define, #ifdef, #undef, ) Utilizzo di sommatorie di vettori e matrici. MPL-LE.16
MPL: Modeling Language (2) Lunghezza delle righe: 255 caratteri (i rimanenti vengono ignorati da MPL). 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 più righe. Il punto esclamativo! commenta fino a fine riga. MPL-LE.17 Struttura file MPL (1) Parte I: Dichiarazioni TITLE INDEX DATA DECISION MACRO OPTIONS Nome del Modello (Opzionale) Definizione indici per insiemi Vettori di input e costanti Variabili decisionali Definizione di macro Opzioni varie MPL-LE.18
Struttura file MPL (2) Parte II: Modello MAX/MIN SUBJECT TO BOUNDS INTEGER BINARY FREE END Funzione obiettivo Vincoli del modello Upper e Lower bound Variabili intere Variabili binarie Variabili libere Fine modello MPL-LE.19 MPL: Opzioni E possibile specificare alcune opzioni per MPL. Definizione possibile in qualunque punto del file. Alcune possibili opzioni: directory corrente; controlli sulla definizione delle variabili; tipo e nome del database utilizzato; OPTIONS DatabaseType = Access DatabaseAccess = "kp.mdb" MPL-LE.20
INDEX Gli indici definiscono i domini del problema. Possono essere: Numerici: nutrients:= 1..8; Nominali: foods:=(pasta, ham, cheese, egg, bread); Il numero di caratteri può essere limitato foods :=(pasta,ham,cheese,egg,bread):3; genera (pas, ham, che, egg, bre); MPL-LE.21 INDEX: alias Agli indici nominali si possono associare alias (usati nei file di output al posto dei nomi) : foods:=(pasta,ham,cheese,egg,bread)->(p,h,c,e,b); foods:=(pasta,ham,cheese,egg,bread):1; Si può assegnare ad un indice il nome di un altro (indice alias) INDEX città :=(BO,MI,FO,PD,GE); orig := città; dest := città; DECISION VARIABLES trasp[orig,dest]; MPL-LE.22
INDEX: indici circolari Se i domini rappresentano periodi di tempo è spesso necessario usare operazioni in modulo sul valore dell indice day := (mo,tu,we,th,fr,sa,su) CIRCULAR; month := 1..12 CIRCULAR; Inventory[month+5] se month=9, l indice è (9+5)mod(12) = 2 MPL-LE.23 INDEX: sottoinsiemi Si possono definire sottoinsiemi di indici. Bisogna specificare: l indice di base la lista di valori del sottoinsieme day := (mo,tu,we,th,fr,sa,su); month := 1..12 CIRCULAR; holiday[day] := (sa,su); summer[month] := 7..9; servicedays[day] := (mo,we,fr); repair[month] WHERE (month>=5)and(month<=8); MPL-LE.24
INDEX: importazione da file Gli elementi dell indice possono essere letti da file INDEX plants := INDEXFILE( plants.dat,2);! file 1, Atlanta, 127.35, 221.33 2, Dallas, 112.44, 212.00 PlantMachine[plants,machine] := INDEXFILE( PlantMach.dat );! file plant1, mach1, plant1, mach2, MPL-LE.25 INDEX: importazione da Excel e Db INDEX plants := EXCELRANGE( plants.xls, Plantrg ); Apre il file plants.xls e legge dal primo foglio (o da quello specificato nelle opzioni) gli elementi dal range Plantg fino alla prima cella vuota plants := DATABASE( plants, plantsid ); plants := DATABASE( plants ); plants := DATABASE( plants, location ); plants := DATABASE( plants,where country = Italy ); Apre la tabella plants del database corrente e definisce l indice in base al contenuto dei campi plantsid o location MPL-LE.26
DATA (1) In questa sezione si specificano i coefficienti utilizzati dal modello (costanti o vettori) 1. Costanti: DATA MaxP = 10; MeseFerie = 3; INDEX Pezzi := 1..MaxP; MPL-LE.27 DATA (2) 2. Vettori (contenenti i dati di ingresso) INDEX nutrients := 1..8; DATA Required[nutrients] := (40, 20, 30, 10, 42, 41, 65, 17); Vengono generate le variabili Required1, Required2, Required8 con Required1 = 40, Required2 = 20, Vettore sparso (solo alcuni elementi) Vet[nutrients] := [1: 5.0, 4: 7.5, 8: 10.0]; MPL-LE.28
DATA (3) 3. Matrici (definite per righe) INDEX i := 1..4; j := 1..3; DATA Cost[i,j] := (40, 20, 30, 13, 21, 7, 10, 42, 41, 65, 17, 13); Si possono usare formule e moltiplicatori: A[i] := (3, 4/5, 2*SQR(3)+2, 1/(3+2)) Cost[nutrients] := 1000 (10, 20, 3, 10, 10, 8, 6, 12); il valore 1000 è un moltiplicatore (Cost1=10000) MPL-LE.29 DATA (4) Dati da una fonte esterna: 1. 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 2. File Excel: A[foods,nutrients]=EXCELRANGE( input.xls", foods"); MPL-LE.30
DATA (5) 3. Database Access DATA Cost[foods] = DATABASE( cibi", costo_unit"); Carica nel vettore cost il contenuto della colonna costo_unit della cartella cibi del database corrente. MPL-LE.31 VARIABILI DECISIONALI (1) DECISION In questa sezione sono definite le variabili del problema. Per definire un insieme di variabili con lo stesso nome, si indica il nome del vettore e la dimensione del vettore stesso. X[foods]; MPL-LE.32
VARIABILI DECISIONALI (2) Si possono definire variabili multidimensionali. MultiVar[foods,nutrients] -> Y; Si possono definire delle variabili in base a determinate condizioni Production[product,month] WHERE(Demand[product,month] > 0); MPL-LE.33 VARIABILI DECISIONALI (3) Se alcune delle variabili decisionali sono intere bisogna indicare ciò con la parola chiave INTEGER INTEGER VARIABLES MultiVar[foods,nutrients]; Nel caso in cui siano binarie si usa BINARY La definizione può essere fatta alla fine del file MPL MPL-LE.34
VARIABILI DECISIONALI (4) E possibile riportare su database il valore di ciascuna variabile decisionale nella soluzione ottima. x[foods] EXPORT ACTIVITY TO DATABASE( cibi ); Il valore di ogni variabile decisionale viene scritto nella colonna x della tabella cibi del database corrente. E possibile riportare anche informazioni aggiuntive (costo ridotto, ) x[foods] EXPORT ALL TO SPARSEFILE ( Sol.dat ); MPL-LE.35 FUNZIONE OBIETTIVO Esprime la funzione lineare da ottimizzare. Deve essere indicata all inizio del file MPL; preceduta dalla parola chiave MIN o MAX; MAX 3x1 + 5x2 ; MIN Z = SUM(foods:cost*x); MINIMIZE Cost = SUM(foods,nutrients: Y); Il nome è opzionale. MPL-LE.36
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 Name: X1 + X2 + X3 >= 2; I vector constraints sono associati ad indici. CONST[nutrients]: SUM(foods:A*x)>required[nutrients]; CONST[nutrients]: SUM(foods:A*x)>required; MPL-LE.37 VINCOLI (2) E possibile scrivere dei vector constraints anche solo su un sottoinsieme degli indici o in base a determinate condizioni. CONSTR[nutrients=1..4]: CONSTR[foods,nutrients] WHERE (foods > bread): E possibile esportare lo slack del vincolo in file esterni. CONSTR[nutrients] EXPORT TO Sparsefile( const.dat ): MPL-LE.38
DOMINIO VARIABILI E possibile indicare nel modello un lower bound e/o un upper bound per ogni variabile. Si utilizza la parola chiave BOUNDS 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-LE.39 www.maximal-usa.com MPL su web Download software/download Step1: request activation code form Step2: download the software (with http) student version (300 constraints/variables, 100 integer) Step3: install the software (winzip) Step4: activating the Cplex license MPL user manual /mplman/mpltoc.html MPL-LE.40