部署时,您必须为 OPL Decision Optimization模型使用以下输入和输出数据格式。
OPL 数据格式
tupleset
。 下面的示例显示了一个 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 {
[...]
}
输入数据
输入数据可以从外部数据源填充。 OPL 模型的输入数据可以下列其中一种格式来提供:
.csv
锉刀.dat
锉刀- JSON 文档
- Microsoft Excel 工作簿(
.xlsx
和 ".xls
)文件已废弃。要连接 Microsoft Excel 文件请使用数据连接器。 数据连接器将 Excel 文件转换为 "
.csv
文件。 更多信息,请参阅参考数据。
- .dat 文件
- 支持所有 OPL 数据结构。 例如
{Parameters = <100, 5000>; Hubs = { <"G">, <"H"> }; Spokes = { <"A", 360, 1080>, <"B", 400, 1150> };
- JSON 文档或 Microsoft Excel 工作簿
- 在 OPL 模型中,您只能使用
tuples
和tuple sets
作为输入。支持的元组字段类型包括
int
、float
或string
。要将输入值映射到 OPL 模型,必须遵循下列规则:- OPL 元素必须与 JSON 属性或 Excel 工作表同名。
- 元组集合可以由 JSON 属性数组或工作表进行填充。
- 元组元素可由 JSON 属性对象或单行 Excel 表填充。
JSON 格式可以用于 OPL 模型集成,以便更容易生成输入数据和解析结果。{ "Parameters": { "maxTrucks": 100, "maxVolume": 5000 }, "Hubs": [ { "name": "G" }, { "name": "H" } ], "Spokes": [ { "name": "A", "minDepTime": 360, "maxArrTime": 1080 }, { "name": "B", "minDepTime": 400, "maxArrTime": 1150 }, . . . }
您可使用 Excel 文件来代替使用 .dat 文件。 此选项与 IBM ILOG CPLEX Optimization Studio 不同,后者必须在
.dat
文件中将 Excel 文件指定为外部源。 在 Decision Optimization中,Excel 文件必须与模型一起包含,并且不能从.dat
文件中调用。
只使用元组和元组集作为 OPL 输入的限制是为了便于与数据源集成。 例如,可以访问 SQL 数据源并以最小的工作量进行数据流;NoSQL数据源可以被访问,数据可以自动转换为表格。 如有必要,优化模型开发者可以在优化期间重新规划数据以填充其他数据结构,但此处理不得影响输入或输出数据。
输出数据
如果输出是文本文件,那么目标函数和决策变量的值将以非结构化格式提供。
如果输出格式是 JSON、".csv
或 Excel,则必须在后处理块中定义要导出到客户端的内容。 后处理是指 subject to
文件中 .mod
部分之后的所有代码。 因此,要定义 JSON、".csv
或 Excel 输出,必须在后处理中声明元组或元组集。
If you 不声明 output elements in the post-processing block of the .mod
file, 不产生输出数据。
在下面的示例中,输出文件将包含 Result
和 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};