在OPL/CPLEX中基于现有集合组件创建新集合的技术求助
嘿,我来帮你搞定这个OPL集合转换的问题!你的需求很清晰:把原始的父子元组集合,转换成每个目标项对应所有子项集合的新集合,我来给你修正代码并解释清楚。
首先,你原来的初始化语句问题出在没有正确聚合同一个Item的所有Child到一个集合里,而且语法也不符合OPL的集合推导规则。下面是正确的实现代码:
tuple child{ string Item; string Child; } {child} Children = ...; // 读取原始集合S tuple dependents{ string Item; {string} ItemChildren; } // 正确生成目标集合S'的语句 {dependents} dependentsSet = { <item, {c.Child | c in Children where c.Item == item}> | item in {c.Item | c in Children} };
代码解释:
- 第一步
{c.Item | c in Children}:先从原始集合里提取出所有唯一的目标项(也就是"A"、"B"、"AB"、"C"、"ABC"这些值),避免重复处理同一个Item。 - 第二步
{c.Child | c in Children where c.Item == item}:对每个唯一的item,筛选出原始集合里所有属于这个item的子项,把它们的Child字段收集成一个字符串集合。 - 最后把每个
item和对应的子项集合组合成dependents元组,整体构成你需要的dependentsSet。
这样生成的dependentsSet就完全符合你想要的S'结构:
<"A", {""}><"B", {""}><"AB", {"A", "B"}><"C", {""}><"ABC", {"A", "B", "C", "AB"}>
之后你就可以在约束里正常索引每个Item的ItemChildren集合啦。
内容的提问来源于stack exchange,提问作者tjnel
相关产品推荐
相关产品推荐

