12.07.2015 Aufrufe

OPL-Modell - Produktionsmanagement - TU Berlin

OPL-Modell - Produktionsmanagement - TU Berlin

OPL-Modell - Produktionsmanagement - TU Berlin

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

<strong>OPL</strong>-Script (I)„An <strong>OPL</strong> statement describes a model for an optimizationapplication. However, there are many applications wheremodel solving is only a part of a more complex application.These applications may need to solve a set of closely relatedmodels, e.g., to analyze the impact of the data; they may needto solve a sequence of models, where the solution of onemodel is the input data of another model; or they may needto have two models cooperate to converge towards a solutionas is often the case in column-generation algorithms …“(Quelle: <strong>OPL</strong> online help)- 3 -18.05.2010


<strong>OPL</strong>-Script (II) Scriptsprache von <strong>OPL</strong> <strong>OPL</strong> Script <strong>Modell</strong> wird von einem <strong>OPL</strong> <strong>Modell</strong> initialisiert <strong>OPL</strong> Script <strong>Modell</strong> enthält Methoden, um das <strong>OPL</strong> <strong>Modell</strong> zu lösen liest und verändert die Daten kann Strukturen des <strong>OPL</strong> <strong>Modell</strong>s übernehmen <strong>OPL</strong> Script unterscheidet sich im Umfang der<strong>Modell</strong>ierungsmöglichkeiten stark von üblichen Scriptsprachen- 4 -18.05.2010


<strong>OPL</strong>-Script (III)PreprocessingPostprocessingFlow ControlEigene Syntax (nicht <strong>OPL</strong>-Syntax & <strong>OPL</strong>-Script-Syntax verwechseln!)Klassische Skript-ProgrammierspracheExecute-Block (2. Fallstudie)Main-Block (heute!)In <strong>Modell</strong>dateiIm Anschluss an das <strong>OPL</strong>-<strong>Modell</strong>Lösen des <strong>Modell</strong>s wird per Script-Befehl gestartet- 5 -18.05.2010


Main-Block setof(string) Products = ...; // Produkte setof(string) Stages = ...; // Fertigungsstufen float capConsumption[Products][Stages] = ...; // Kapazitätsverbrauch von Produkt p von Fertigungsstufe s float availCap[Stages] = ...; // verfügbare Maschinenkapazität von Fertigungsstufe s float profitMargin[Products] = ...; // Deckungsbeitrag von Produkt p dvar float+ x[Products]; // Produktionsmenge von Produkt p maximize sum(p in Products) profitMargin[p]*x[p]; subject to {<strong>OPL</strong>-<strong>Modell</strong>(<strong>OPL</strong>-Syntax verwenden!) // Maschinenkapazität forall(s in Stages) sum(p in Products) capConsumption[p,s]*x[p]


<strong>OPL</strong>-Script - SyntaxausschnittStrukturSyntaxDeklaration var i;Zuweisung i = 1;Blockanweisung{…}if-elseif (a


<strong>OPL</strong>-Script – Methodenbsp.<strong>Modell</strong>bezogene Methoden IloOpl<strong>Modell</strong>(def, cplex) erstellt ein neues <strong>Modell</strong>objekt addDataSource fügt Daten zum <strong>Modell</strong>objekt hinzu generate initialisiert das <strong>Modell</strong>objekt und dessen DatenCplex-bezogene Methoden solve löst das zugehörige <strong>Modell</strong> getNcols gibt Anzahl der Variablen aus getNrows gibt Anzahl der Constriants aus getObjective gibt Zielfunktionswert aus getValue gibt Wert einer Variablen aus- 8 -18.05.2010


<strong>OPL</strong>-Script-Bsp.Definition des <strong>Modell</strong>sAusgabedatei definierenImport von <strong>Modell</strong>datenLösen verschiedener <strong>Modell</strong>eÄndern von <strong>Modell</strong>datenLösen verschiedener <strong>Modell</strong>eAusgabe in DateiLösen verschiedener <strong>Modell</strong>e- 11 -Ausgabedatei schliessen18.05.2010


<strong>Modell</strong> definierenvar myModel = thisOplModel;- 12 -18.05.2010


Verbindung von <strong>Modell</strong>- und DatenfilesetsProducts Stagesparametersproduction_2.modcapConsumption[ ]availCap[ ] profitMargin[ ]variablesx[ ]Objective function and constraintsZF capacityConstraintSkriptmethoden (in <strong>Modell</strong>datei)main{…};<strong>OPL</strong>-Scriptproduction_2.dat(analog zu model)- 13 -18.05.2010


<strong>Modell</strong>daten importierenTypen aus <strong>Modell</strong>importieren……und ändern- 14 -18.05.2010


Typen importieren Skript bekannt machensetsProducts Stagesparametersproduction_2.modcapConsumption[ ]availCap[ ] profitMargin[ ]variablesx[ ]Objective function and constraintsZF capacityConstraintSkriptmethoden (in <strong>Modell</strong>datei)main{…};<strong>OPL</strong>-Scriptproduction_2.dat(analog zu model)- 15 -18.05.2010


Auf Daten des <strong>Modell</strong>s zugreifensetsProducts Stagesparametersproduction_2.modcapConsumption[ ]Skriptmethoden (in <strong>Modell</strong>datei)main{…};availCap[ ] profitMargin[ ]variablesx[ ]Objective function and constraintsZF capacityConstraint<strong>OPL</strong>-Scriptproduction_2.dat(analog zu model)myModel.availCap[F1]- 16 -18.05.2010


Mehrere <strong>Modell</strong>e lösen (I)- 17 -18.05.2010


Mehrere <strong>Modell</strong>e lösen (II)var origMaxCap = myModel.maxCap;for(var i in 1..n){// prepare next iterationvar def = myModel.modelDefinition;var data = myModel.dataElements;model = new IloOplModel(def,cplex);for( var c in myModel.stages){data.maxCap[c] = i*origMaxCap[c];}myModel.addDataSource(data);myModel.generate();<strong>Modell</strong>variablenverändern<strong>Modell</strong> mit neuenDaten initialisieren}if ( cplex.solve() ){ …};<strong>Modell</strong> lösen- 18 -18.05.2010


Auf Methoden zugreifensetsProducts Stagesparametersproduction_2.modcapConsumption[ ]Skriptmethoden (in <strong>Modell</strong>datei)main{…};availCap[ ] profitMargin[ ]variablesx[ ]Objective function and constraintsZF capacityConstraint<strong>OPL</strong>-Scriptproduction_2.dat(analog zu model)cplex.solve()- 19 -18.05.2010


Ergebnisse dokumentierenvar results = new IloOplOutputFile("results.txt");var n = thisModel.n;…for (var i in 1..n){results.writeln("Durchlauf " +i+": capF1="+capF1+" capF2="+capF2);results.writeln("Objective Function: "+ cplex.getObjective());for(var p in thisModel.Products){}…results.writeln("x["+ p+ "]="+ production.x[p]+ " ");}results.writeln("\n \n");Ausgabedatei definieren (+öffnen)ZF-Wert ausgebenresults.close();Ausgabedatei schließen- 20 -18.05.2010


Ausgabedatei anbindensetsProducts Stagesparametersproduction_2.modcapConsumption[ ]Skriptmethoden (in <strong>Modell</strong>datei)main{…};IloOplOutputFileresultsavailCap[ ] profitMargin[ ]variablesx[ ]Objective function and constraintsZF capacityConstraint<strong>OPL</strong>-Scriptproduction_2.dat(analog zu model)results- 21 -18.05.2010


Ergebnisdatei…- 22 -18.05.2010


Weitere Informationen- 23 -18.05.2010


<strong>OPL</strong>-SyntaxGanzzahlige Variablen- 24 - 18.05.2010


Ganzzahlige Variablenint nbPerioden = ...;Intervall definierenHöchstgrenze festlegenrange Perioden 1..nbPerioden;{int} Perioden asSet(1..nbPerioden);dvar int+ produktion in Perioden;oderdvar int+ produktion in 1..nbPerioden;- 25 -18.05.2010


<strong>OPL</strong>-SyntaxBoolsche Variablen- 26 - 18.05.2010


Boolsche Variablendvar boolean ;dvar boolean […];Boolsche Variablen dienen derDarstellung logischer Bedingungen(siehe Studentenvortrag 3)- 27 -18.05.2010


Bedingungen in Summenund Quantoren- 28 - 18.05.2010


Bedingungen in Summen und Quantoren Allgemeine Formulierung forall(t in T) mit Einschränkung des Wertebereichsforall(t in T: t


TippsZur 3. Fallstudie- 30 - 18.05.2010


Tipps - LagerbilanzenZeitdiskretes <strong>Modell</strong> verwendenBerechnung der Lagermenge am Ende jeder PeriodeBerechnung der Lagermenge für Periode t in {1..T}:Lager[t] = Lager[t-1] + Produktionsmenge[t] - Verbrauch[t]Anfangslagerbestand:Lager[0] = AnfangslagerbestandEndlagerbestand:Lager[T] = Endlagerbestand- 31 -18.05.2010


Rechnerübung- 32 -18.05.2010

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!