LPL-Einführung1 kommune.lpl Eine Einführung in LPL A LP-Language
LPL-Einführung2 Projektziele Erstellung eines LPL-Programmes. Erklärung der wesentlichen Elemente. Erklärung der einzelnen Schritte.
LPL-Einführung3 Grundelemente des Programms MODEL SET PARAMETER VARIABLE CONSTRAINT MAXIMIZE oder MINIMZE END
LPL-Einführung4 MODEL-Sektion MODEL Kommune; Ein Kommentar kann eingefügt werden, indem er in (*Text*) hinter dem Semikolon eingefügt wird. MODEL kommune; (*Beispiel*)
LPL-Einführung5 SET-Sektion SET In dieser Sektion werden die Indexmengen definiert, und es können sofort die Werte zugeordnet werden. i = /1 2 3/; j = /1:3/;
LPL-Einführung6 Besonderheiten der SET-Definition ALIAS –Der Index wird intern als Zahl verarbeitet. Da er als Zahlenwert wenig aussagekräftig ist, kann man einen sog. ALIAS-Name vergeben, der hinter dem Index durch Punkt getrennt angefügt wird: –Index.Alias Kommentar kann wieder hinter dem Semikolon in (* Kommentar *) eingefügt werden. –i = / 1.alias1 2.alias2 3.alias3 /; (* Kommentar *) Beispiel: –j = / 1.K1 2.K2 3.K3 /; (* Kommunen *) –i = / 1.ZU 2.BA 3.HI /; (* Pflanzsorten *)
LPL-Einführung7 PARAMETER-Sektion In dieser Sektion werden alle Daten symbolisch definiert. Es können durch die „= Zuweisung“ unmittelbar folgend die Datenwerte zugewiesen werden.
LPL-Einführung8 PARAMETER-Definition 1 Syntax: –name1 = wert1;(* Einzelwert *) –name2 {Indexmenge} = [wert1 wert2.. ]; Mehrfachindizierte Parameter –name{i-menge1,j-menge2} = Wertzuweisung;
LPL-Einführung9 PARAMETER-Definition 2 Wertzuweisung: name {i,j} = /: : 1 w11 w12 w13 2 w21 w22 w23 3 w31 w32 w33/; (* Text *) Falls der Name nicht aussagekräftig genug ist, kann man einen (* Kommentar *) anfügen.
LPL-Einführung10 PARAMETER-Definition 3 In einem Vektor oder einer Matrix können Werte durch ihren sog. "Default" ersetzt werden: "." Für Untergrenzen: 0 Für Obergrenzen: ∞
LPL-Einführung11 PARAMETER gesamt land {j} = [ ]; untergrenze {i,j} = /: : /; obergrenze {i,j} = /: : /; wasser {j} = [ ]; quote {i} = [ ]; faktor {j} = [ ]; ertrag {i} = [ ];
LPL-Einführung12 VARIABLE-Sektion In dieser Sektion werden die Variablen definiert. Gleichzeitig kann man zwischen kontinuierlichen und ganzzahligen Variablen unterscheiden. Schließlich kann man sinnvolle Namen konstruieren.
LPL-Einführung13 VARIABLE 1 Syntax: – name1; (* Einzelvariable *) – name2 {i}; (* Einfach indizierte V. *) – name3 {i,j}; (* Mehrfach indizierte V. *)
LPL-Einführung14 VARIABLE 2 Es ist sinnvoll, den Variablen mnemotechnische Namen zu geben. Die Namen können laut LPL-Syntax fast beliebig lang sein; sie müssen mit einem Buchstaben beginnen. Wichtig: Der anschließende Optimierer XA unterscheidet nur Namen der Länge mit 8 Zeichen!
LPL-Einführung15 VARIABLE 3 Will man eine ganzzahlige Variable definieren, so wird INTEGER und das Werteintervall hinzugefügt: var {j} INTEGER [0,100]; 0 ≤ var ≤ 100 → ganzzahlige Variable.
LPL-Einführung16 VARIABLE-Definition 1 Der Name der Variablen wird durch einen String nach der Definition und vor dem Semikolon gebildet: –variablenname 'string'; Ein String 'string" = 'za1a2' besteht aus: –z = eine Zahl, die angibt, wieviele der ersten z Buchstaben des Variablennamens verwendet werden. –a1 und a2 sind die ALIAS der Indizes 1 und 2 ersetzt.
LPL-Einführung17 VARIABLE-Definition 2 Die Variablen des Beispiels: –anbau {i,j}; –Jetzt würden i bzw. j durch die Indizes der Mengen i und j ersetzt. Unter Benutzung der ALIAS: –anbau {i,j} '4a1a2'; –Jetzt würden i bzw. j durch die ALIAS der Mengen i und j ersetzt: –anbaZUK1 Anbau von Zucker in Komm. K1
LPL-Einführung18 CONSTRAINT-Sektion Dieser Teil enthält die Nebenbedingungen des Modells und die Definition der Zielfunktion. Nebenbedingung: –name: funktional = rechte Seite; Zielfunktion: –zielname: funktional;
LPL-Einführung19 CONSTRAINT-Definition: name Einzelname: name: einfach indizierter Name: name {i}: mehrfach indiz. Name: name {i,j}: bedingter Name: name {i | log. Beding.}: –log. Bedingung: i 4: i<>5; –name {i,j | name2} nur falls name2 ungleich dem Default-Wert
LPL-Einführung20 CONSTRAINT: name-Konstruktion Der Namen einer Bedingung kann analog zum Variablennamen durch einen String unter Nutzung der ALIAS konstruiert werden: nebenbedname {i} '6a1': ergibt die Zeile: nebenbZU
LPL-Einführung21 Beispiele von NB-Namen nebenbedingung: flaeche {i}: lowerbounds {i,j | untergrenze}: gewinn:
LPL-Einführung22 CONSTRAINT-Definition: funktional Ein funktional ist ein nach den Regeln der Arithmetik aufgebauter Ausdruck. Operatoren: +, -, *, SUM {i} Indizes sind in eckige Klammern zu setzen, wenn sie keine Mengen sind.
LPL-Einführung23 Beispiele für Funktionale lbound {i,j}: anbau [i,j]>=ugrenze [i,j]; flaeche{i}: SUM {i} anbau [i,j]<=land [j]; kont{j}: SUM {i} verbrauch [i]*anbau [i,j] <= wasser [j]; gewinn: SUM {i,j} ertrag [i]*anbau [i,j];
LPL-Einführung24 Alternative Formulierungen lbound {i,j}: anbau[i,j] >= ugrenze[i,j]; lbound {i,j}: anbau >= ugrenze; flaeche {j}: SUM {i} anbau <= land; flaeche {i}: SUM {i} anbau[i,j] <= land [j]; kont {j}: SUM {i} verbrauch[i] * anbau[i,j] <= wasser[j]; kont {j}: SUM {i} verbrauch * anbau <= wasser; Jedoch Vorsicht: Die Bindung zu den Mengen muss eindeutig sein!
LPL-Einführung25 Zielfunktion Die Zielfunktion ist ein Funktional ohne rechte Seite: –gewinn: SUM {i,j} ertrag * anbau; Die Optimierungsrichtung wird durch MAXIMIZE bzw. MINIMIZE bestimmt: –MAXIMIZE gewinn;
LPL-Einführung26 END-Sektion Jedes Programm wird beschlossen durch: –END (ohne Seminkolon!)
LPL-Einführung27 Lösung mit LPL und XA Wenn bei der Compilierung kein Fehler auftritt, wird automatisch XA aufgerufen und das entsprechende LP-Modell gelöst. Es gibt zwei Lösungsdarstellungen: 1.SOL-File = Lösung in Kurzform 2.PRN-File = Ausführliche Lösungsdarstellung
LPL-Einführung28 Auszug aus dem SOL-File "MPSXNAME","$$$ ","Mon May 05 08:44: ", "MAX" 11, 9, , 10 "anbaZUK1", , , , "IN", "anbaBAK1", ,"(NB) ", "anbaZUK2", , , , "LOWER", "(NB) ", , "(RS) ", "anbaBAK3", , , , "UPPER", "(RS) ", , "(NB) ",
LPL-Einführung29 PRN-File Sektion Statistik STATISTICS - FILE: $$$ TITLE: MPSXNAME Mon May 05 08:44: xa VERSION 10.0 Intel Extended-DOS x86 USABLE MEMORY 7,605K BYTES VARIABLES 9 MAXIMUM 50,000 3 LOWER, 0 FIXED, 4 UPPER, 0 FREE CONSTRAINTS 11 MAXIMUM 10,000 0 GE, 2 EQ, 9 LE, 0 NULL/FREE, 0 RANGED. CAPACITY USED BY CATEGORY- 0.0% VARIABLE, 0.1% CONSTRAINT, 48 NON-ZEROS, WORK 778,338 MAXIMIZATION. MPS FORMAT- OBJECTIVE: gew RHS:..rhs RANGE: ? BOUND: Bounds
LPL-Einführung30 PRN-File Sektion Lösung O P T I M A L S O L U T I O N ---> OBJECTIVE SOLVE TIME 00:00:00 ITER 10 MEMORY USED 0.0%
LPL-Einführung31 PRN-File Sektion Variablen File: $$$ Mon May 05 08:44: Page 1 SOLUTION (Maximized): MPSXNAME | Variable | Activity | Cost | Variable | Activity | Cost | I anbaZUK | anbaZUK | | REDUCED COST | REDUCED COST |
LPL-Einführung32 PRN-File Sektion Constraints File: $$$ Mon May 05 08:44: Page 2 CONSTRAINTS: MPSXNAME |Constraint| Activity | RHS |Constraint| Activity | RHS | I flaechK < I flaechK < | | DUAL VALUE | DUAL VALUE |