如何在OPL CPLEX中计算时变集合各时段的元素数量
在OPL CPLEX中计算时变集合各时段元素数量并生成数组
你可以通过以下步骤实现需求:
1. 保留原时变集合定义
先保留你已定义的元组与集合数据:
tuple TimeVaryingSet { int Slot; {int} values; } TimeVaryingSet Damagedlines[Slot] = [ <1,{30,67,17,54,12,49,11,48}>, <2,{30,67,17,54,12,49,11,48}>, <3,{17,54,12,49,11,48}>, <4,{17,54,12,49,11,48}>, <5,{17,54,12,49,11,48}>, <6,{12,49,11,48}>, <7,{11,48}>, <8,{}> ];
2. 生成元素数量数组
声明整数数组,用card()函数计算集合元素个数,通过生成器表达式遍历所有时段:
int damagedLineCount[Slot] = [card(Damagedlines[s].values) | s in Slot];
该数组会直接存储每个时段对应的集合元素数量。
3. 验证输出结果
若需要查看计算结果,可在execute块中打印数组内容:
execute { writeln("各时段集合元素数量:"); for(var s in Slot) { writeln("时段 ", s, ": ", damagedLineCount[s]); } }
完整代码示例
整合后的完整OPL代码如下:
tuple TimeVaryingSet { int Slot; {int} values; } // 定义时变集合 TimeVaryingSet Damagedlines[Slot] = [ <1,{30,67,17,54,12,49,11,48}>, <2,{30,67,17,54,12,49,11,48}>, <3,{17,54,12,49,11,48}>, <4,{17,54,12,49,11,48}>, <5,{17,54,12,49,11,48}>, <6,{12,49,11,48}>, <7,{11,48}>, <8,{}> ]; // 生成各时段元素数量数组 int damagedLineCount[Slot] = [card(Damagedlines[s].values) | s in Slot]; // 执行输出 execute { writeln("各时段集合元素数量:"); for(var s in Slot) { writeln("时段 ", s, ": ", damagedLineCount[s]); } }
运行代码后,会输出每个时段的集合元素数量,damagedLineCount数组可直接在后续模型逻辑中调用。
内容的提问来源于stack exchange,提问作者Vandana Kumari
相关产品推荐
相关产品推荐

