Für den Einsatz müssen Sie die folgenden Eingabe- und Ausgabedatenformate für OPL Decision Optimization Modelle verwenden.
OPL-Datenformate
tupleset
deklarieren. Das folgende Beispiel zeigt einen Auszug aus einem OPL-Modell:tuple parameters {
int maxTrucks;
int maxVolume;
}
parameters Parameters = ...;
tuple location {
key string name;
}
{location} Hubs = ...;
tuple spoke {
key string name;
int minDepTime;
int maxArrTime;
};
{spoke} Spokes = ...;
dvar int+ TruckOnRoute[Routes][TruckTypeIds] in 0..Parameters.maxTrucks;
[...]
minimize TotalCost;
subject to {
[...]
}
Eingabedaten
Die Eingabedaten können aus einer externen Datenquelle gefüllt werden. Die Eingabedaten für OPL-Modelle können in einem der folgenden Formate bereitgestellt werden:
- Datei
.csv
- Datei
.dat
- JSON-Dokument
- Microsoft Excel-Arbeitsmappendateien (
.xlsx
und ".xls
) sind veraltet.Um eine Verbindung zu Microsoft Excel-Dateien herzustellen, verwenden Sie einen Daten-Connector. Der Data-Connector wandelt Ihre Excel-Datei in eine '
.csv
-Datei um. Weitere Informationen finden Sie unter referenzierte Daten.
- .dat file
- Alle OPL-Datenstrukturen werden unterstützt. Beispiel:
{Parameters = <100, 5000>; Hubs = { <"G">, <"H"> }; Spokes = { <"A", 360, 1080>, <"B", 400, 1150> };
- JSON-Dokument oder Microsoft Excel-Arbeitsmappe
- Sie können nur
tuples
undtuple sets
als Eingaben im OPL-Modell verwenden.Unterstützte Typen für Tupelfelder sind
int
,float
oderstring
.Um die Eingabewerte Ihrem OPL-Modell zuzuordnen, müssen Sie die folgenden Regeln befolgen:- Das OPL-Element muss denselben Namen haben wie das JSON-Merkmal oder das Excel-Arbeitsblatt.
- Ein Tupelset kann von einem JSON-Eigenschaftenarray oder einem Arbeitsblatt gefüllt werden.
- Ein Tupel-Element kann mit einem JSON-Eigenschaftsobjekt oder mit einer einzeiligen Excel-Tabelle gefüllt werden.
Das JSON-Format kann für die OPL-Modellintegration verwendet werden, sodass es einfacher ist, Eingabedaten zu generieren und die Ergebnisse syntaktisch zu analysieren.{ "Parameters": { "maxTrucks": 100, "maxVolume": 5000 }, "Hubs": [ { "name": "G" }, { "name": "H" } ], "Spokes": [ { "name": "A", "minDepTime": 360, "maxArrTime": 1080 }, { "name": "B", "minDepTime": 400, "maxArrTime": 1150 }, . . . }
Sie können eine Excel-Datei anstelle einer .dat-Datei verwenden. Diese Option unterscheidet sich von IBM ILOG CPLEX Optimization Studio, wo die Excel-Datei als externe Quelle in der
.dat
-Datei angegeben werden muss. In Decision Optimization muss die Excel-Datei dem Modell beigefügt werden und kann nicht aus einer.dat
-Datei aufgerufen werden.
Die Beschränkung auf die Verwendung von Tupeln und Tupelmengen als OPL-Eingabe soll die Integration mit Datenquellen erleichtern. So kann zum Beispiel mit minimalem Aufwand auf SQL-Datenquellen zugegriffen und Daten gestreamt werden; NoSQL-Datenquellen können angesprochen und Daten automatisch in Tabellen umgewandelt werden. Bei Bedarf kann der Entwickler des Optimierungsmodells die Daten während der Optimierung neu formulieren, um andere Datenstrukturen zu füllen. Diese Manipulation darf aber die Eingabe- oder Ausgabedaten nicht beeinflussen.
Ausgabedaten
Wenn Ihre Ausgabe eine Textdatei ist, werden die Zielfunktion und die Werte der Entscheidungsvariablen in einem unstrukturierten Format bereitgestellt.
Wenn Ihr Ausgabeformat JSON, " .csv
oder Excel ist, müssen Sie im Nachbearbeitungsblock festlegen, was Sie zurück zum Client exportieren möchten. Die Nachbearbeitung umfasst den gesamten Code, der auf den subject to
-Abschnitt in der .mod
-Datei folgt. Um also eine JSON-, " .csv
oder Excel-Ausgabe zu definieren, müssen Sie Tupel oder Tupelmengen in der Nachbearbeitung deklarieren.
Wenn Sie nicht anmelden Elemente im Nachbearbeitungsblock der .mod
Datei ausgeben, werden keine Ausgabedaten erzeugt.
Im folgenden Beispiel enthält die Ausgabedatei den Wert von Result
und NbTrucksOnRouteRes
sowie die Zielfunktion, da diese Elemente im Post-Processing definiert werden.
subject to {
[...]
}
tuple result {
float totalCost;
}
result Result;
execute {
Result.objValue = cplex.getObjValue();
}
tuple nbTrucksOnRouteRes {
key string spoke;
key string hub;
key string truckType;
int nbTruck;
}
{nbTrucksOnRouteRes} NbTrucksOnRouteRes =
{<r.spoke, r.hub, t, TruckOnRoute[r][t]> | r in Routes, t in TruckTypeIds :
TruckOnRoute[r][t] > 0};