Pour le déploiement, vous devez utiliser les formats de données d'entrée et de sortie suivants pour les modèles OPL Decision Optimization.
Formats de données OPL
tupleset
, pour chaque table que vous utilisez. L'exemple suivant montre un extrait d'un modèle 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 {
[...]
}
Données d'entrée
Les données d'entrées peuvent être ajoutées à partir d'une source de données externe. Les données d'entrée des modèles OPL peuvent être fournies dans l'un des ces formats :
- fichier
.csv
- fichier
.dat
- Document JSON
- Les fichiers de classeurs Microsoft Excel (
.xlsx
et ".xls
) sont obsolètes.Pour se connecter à des fichiers Microsoft Excel, utiliser un connecteur de données. Le connecteur de données transforme votre fichier Excel en un fichier '
.csv
. Pour plus d'informations, voir Données référencées.
- Fichier .dat
- Toutes les structures de données OPL sont prises en charge. Exemple :
{Parameters = <100, 5000>; Hubs = { <"G">, <"H"> }; Spokes = { <"A", 360, 1080>, <"B", 400, 1150> };
- Document JSON ou classeur Microsoft Excel
- Vous ne pouvez utiliser que
tuples
ettuple sets
comme entrées dans le modèle OPL.Les types pris en charge pour les zones de tuples sont
int
,float
oustring
.Pour mapper les valeurs d'entrée à votre modèle OPL, vous devez suivre ces règles :- L'élément OPL doit avoir le même nom que la propriété JSON ou le classeur Excel.
- Un ensemble de tuples peut être rempli par un tableau de propriétés JSON ou une feuille de calcul.
- Un élément tuple peut être alimenté par un objet de propriété JSON ou par une feuille Excel à une seule ligne.
Le format JSON peut être utilisé pour l'intégration du modèle OPL afin de faciliter la génération des données d'entrée et l'analyse des résultats.{ "Parameters": { "maxTrucks": 100, "maxVolume": 5000 }, "Hubs": [ { "name": "G" }, { "name": "H" } ], "Spokes": [ { "name": "A", "minDepTime": 360, "maxArrTime": 1080 }, { "name": "B", "minDepTime": 400, "maxArrTime": 1150 }, . . . }
Vous pouvez utiliser un fichier Excel au lieu d'un fichier .dat. Cette option est différente de IBM ILOG CPLEX Optimization Studio où le fichier Excel doit être spécifié comme source externe dans le fichier
.dat
. Dans Decision Optimization le fichier Excel doit être inclus dans le modèle et ne peut pas être appelé à partir d'un fichier.dat
.
La limitation à l'utilisation de tuples et d'ensembles de tuples en tant qu'entrée OPL a pour but de faciliter l'intégration avec les sources de données. Par exemple, il est possible d'accéder à des sources de données SQL et d'en extraire des données avec un minimum d'effort ; NoSQL il est possible d'accéder à des sources de données et de transformer automatiquement les données en tables. Si nécessaire, le développeur du modèle d'optimisation peut reformuler les données pour remplir d'autres structures de données pendant l'optimisation, mais cette manipulation ne doit pas affecter les données d'entrée ou de sortie.
Données de sortie
Si votre résultat est un fichier texte, la fonction objective et les valeurs des variables de décision sont fournies dans un format non structuré.
Si votre format de sortie est JSON, '.csv
ou Excel, vous devez définir ce que vous souhaitez exporter vers le client dans le bloc de post-traitement. Le post-traitement est tout le code qui suit la section subject to
dans le fichier .mod
. Ainsi, pour définir une sortie JSON, " .csv
ou Excel, vous devez déclarer des ensembles de n-uplets ou de n-uplets dans le post-traitement.
Si vous ne déclarez pas d'éléments de sortie dans le bloc de post-traitement du fichier .mod
, aucune donnée de sortie n'est générée.
Dans l'exemple suivant, le fichier de sortie contiendra la valeur de Result
et NbTrucksOnRouteRes
ainsi que la fonction objective car ces éléments sont définis dans le post-traitement.
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};