Formati dei dati di input e output per Decision Optimization Modelli OPL
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:
lima.csv
lima.dat
- Documento JSON
- I file delle cartelle di lavoro di Microsoft Excel (
e ".xlsx
) sono deprecati..xls
Per collegarsi ai file di Microsoft Excel, utilizzare un connettore dati. Il connettore dati trasforma il file Excel in un file "
. Per ulteriori informazioni, vedere Dati di riferimento..csv
- 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
etuples
come input nel modello OPL.tuple sets
I tipi supportati per i campi tupla sono
,int
ofloat
.string
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
. In Decision Optimization il file Excel deve essere incluso nel modello e non può essere richiamato da un file.dat
..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, '
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 .csv
nel file subject to
. Pertanto, per definire l'output JSON, '.mod
o Excel, è necessario dichiarare tuple o insiemi di tuple nella post-elaborazione..csv
Se non si dichiarano elementi di output nel blocco di postelaborazione del file
, non vengono generati dati di output..mod
Nell'esempio seguente, il file di output conterrà il valore di
e Result
e la funzione obiettivo perché questi elementi sono stati definiti nella post-elaborazione.NbTrucksOnRouteRes
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};