Per la distribuzione è necessario utilizzare i seguenti formati di dati di input e output per i modelli OPL Decision Optimization.
Formati di dati OPL
tupleset
, per ogni tabella utilizzata. L'esempio seguente mostra un estratto di un modello OPL: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 {
[...]
}
Dati di input
I dati di input possono essere popolati da una fonte di dati esterna. I dati di input per i modelli OPL possono essere forniti in uno di questi formati:
.csv
lima.dat
lima- Documento JSON
- I file delle cartelle di lavoro di Microsoft Excel (
.xlsx
e ".xls
) sono deprecati.Per collegarsi ai file di Microsoft Excel, utilizzare un connettore dati. Il connettore dati trasforma il file Excel in un file "
.csv
. Per ulteriori informazioni, vedere Dati di riferimento.
- file .dat
- Sono supportate tutte le strutture dati OPL. Ad esempio:
{Parameters = <100, 5000>; Hubs = { <"G">, <"H"> }; Spokes = { <"A", 360, 1080>, <"B", 400, 1150> };
- Documento JSON o cartella di lavoro Microsoft Excel
- È possibile utilizzare solo
tuples
etuple sets
come input nel modello OPL.I tipi supportati per i campi tupla sono
int
,float
ostring
.Per mappare i valori di input nel modello OPL, è necessario seguire queste regole:- L'elemento OPL deve avere lo stesso nome della proprietà JSON o del foglio di lavoro Excel.
- Un insieme di tuple può essere popolato da un array di proprietà JSON o da un foglio di lavoro.
- Un elemento tupla può essere popolato da un oggetto proprietà JSON o da un foglio Excel a riga singola.
Il formato JSON può essere utilizzato per l'integrazione del modello OPL, in modo da facilitare la generazione dei dati di input e l'analisi dei risultati.{ "Parameters": { "maxTrucks": 100, "maxVolume": 5000 }, "Hubs": [ { "name": "G" }, { "name": "H" } ], "Spokes": [ { "name": "A", "minDepTime": 360, "maxArrTime": 1080 }, { "name": "B", "minDepTime": 400, "maxArrTime": 1150 }, . . . }
È possibile utilizzare un file Excel invece di un file .dat. Questa opzione è diversa da IBM ILOG CPLEX Optimization Studio dove il file Excel deve essere specificato come origine esterna nel file
.dat
. In Decision Optimization il file Excel deve essere incluso nel modello e non può essere richiamato da un file.dat
.
La limitazione all'uso di tuple e insiemi di tuple come input OPL serve a facilitare l'integrazione con le fonti di dati. Ad esempio, è possibile accedere alle sorgenti di dati SQL e creare un flusso di dati con un minimo sforzo; è possibile accedere alle sorgenti di dati NoSQL e trasformare automaticamente i dati in tabelle. Se necessario, lo sviluppatore del modello di ottimizzazione può riformulare i dati per popolare altre strutture di dati durante l'ottimizzazione, ma questa manipolazione non deve influire sui dati di input o di output.
Dati di output
Se l'output è un file di testo, la funzione obiettivo e i valori delle variabili decisionali sono forniti in un formato non strutturato.
Se il formato di output è JSON, '.csv
o Excel, è necessario definire ciò che si desidera esportare al client nel blocco di post-elaborazione. La post-elaborazione è tutto il codice che segue la sezione subject to
nel file .mod
. Pertanto, per definire l'output JSON, '.csv
o Excel, è necessario dichiarare tuple o insiemi di tuple nella post-elaborazione.
Se non si dichiarano elementi di output nel blocco di postelaborazione del file .mod
, non vengono generati dati di output.
Nell'esempio seguente, il file di output conterrà il valore di Result
e NbTrucksOnRouteRes
e la funzione obiettivo perché questi elementi sono stati definiti nella post-elaborazione.
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};