Para el despliegue debe utilizar los siguientes formatos de datos de entrada y salida para los modelos OPL Decision Optimization.
Formatos de datos OPL
tupleset
, por cada tabla que utilices. El siguiente ejemplo muestra un extracto de un modelo 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 {
[...]
}
Datos de entrada
Los datos de entrada pueden rellenarse desde un origen de datos externo. Los datos de entrada para los modelos de OPL se pueden proporcionar en uno de estos formatos:
- Archivo
.csv
- Archivo
.dat
- Documento JSON
- Los archivos de libros de Microsoft Excel (
.xlsx
y '.xls
) están obsoletos.Para conectarse a archivos de Microsoft Excel, utilice un conector de datos. El conector de datos transforma su fichero Excel en un fichero '
.csv
'. Para más información, véase Datos de referencia.
- Archivo .dat
- Todas las estructuras de datos de OPL están soportadas. Por ejemplo:
{Parameters = <100, 5000>; Hubs = { <"G">, <"H"> }; Spokes = { <"A", 360, 1080>, <"B", 400, 1150> };
- Documento JSON o libro de Microsoft Excel
- Sólo puede utilizar
tuples
ytuple sets
como entradas en el modelo OPL.Los tipos soportados para los campos de tupla son
int
,float
ostring
.Para correlacionar los valores de entrada con el modelo OPL, debe seguir estas reglas:- El elemento OPL debe tener el mismo nombre que la propiedad JSON o la hoja de cálculo Excel.
- Un conjunto de tuplas puede rellenarse mediante una matriz de propiedades JSON o una hoja de cálculo.
- Un elemento tupla puede rellenarse con un objeto de propiedad JSON, o con una hoja Excel de una sola fila.
El formato JSON se puede utilizar para la integración de modelos OPL para que sea más fácil generar datos de entrada y analizar los resultados.{ "Parameters": { "maxTrucks": 100, "maxVolume": 5000 }, "Hubs": [ { "name": "G" }, { "name": "H" } ], "Spokes": [ { "name": "A", "minDepTime": 360, "maxArrTime": 1080 }, { "name": "B", "minDepTime": 400, "maxArrTime": 1150 }, . . . }
Puede utilizar un archivo Excel en lugar de utilizar un archivo .dat. Esta opción es diferente de IBM ILOG CPLEX Optimization Studio donde el archivo Excel debe ser especificado como una fuente externa en el archivo
.dat
. En Decision Optimization el archivo Excel debe incluirse con el modelo y no puede llamarse desde un archivo.dat
.
La limitación de utilizar sólo tuplas y conjuntos de tuplas como entrada OPL es para facilitar la integración con fuentes de datos. Por ejemplo, se puede acceder a fuentes de datos SQL y realizar un flujo de datos con un mínimo esfuerzo; NoSQL y transformar los datos automáticamente en tablas. Si es necesario, el desarrollador de modelos de optimización puede reformular los datos para llenar otras estructuras de datos durante la optimización, pero esta manipulación no debe afectar a los datos de entrada o salida.
Datos de salida
Si su salida es un archivo de texto, la función objetivo y los valores de las variables de decisión se proporcionan en un formato no estructurado.
Si su formato de salida es JSON, ' .csv
, o Excel, entonces debe definir lo que desea exportar de vuelta al cliente en el bloque de post-procesamiento. El postprocesamiento es todo el código que sigue a la sección subject to
en el archivo .mod
. Por lo tanto, para definir la salida JSON, ' .csv
o Excel, debe declarar la tupla o los conjuntos de tuplas en el postprocesamiento.
Si no declara elementos de salida en el bloque de postprocesamiento del archivo .mod
, no se generarán datos de salida.
En el siguiente ejemplo, el archivo de salida contendrá el valor de Result
y NbTrucksOnRouteRes
y la función objetivo porque estos elementos se definen en el postprocesamiento.
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};