如何在CPLEX OPL中创建多集合?路径集合定义报错的修改建议咨询
解决多路径集合的声明与初始化问题
看起来你想一次性创建多个存储路径的集合,但当前的tuple声明和初始化语法有问题。咱们一步步来修正这个问题,同时满足你"创建多个路径集合"的需求:
问题分析
你写的代码:
tuple path{ {int} p; } {path} ps={1,2,3};
这里的核心问题是,你试图用{1,2,3}直接初始化path类型的集合,但每个path实例内部包含的是一个{int}集合,而非单个整数,类型匹配不上,所以才会报错。
解决方案
方案1:正确初始化tuple类型的路径集合
如果你的语言支持tuple与集合的嵌套初始化,需要为每个path实例明确初始化内部的p集合。比如:
tuple path{ {int} p; } {path} ps = { path{p: {1,2}}, path{p: {3,4}}, path{p: {5,6}} };
这样就创建了3个path实例,每个实例的p集合都能正确存储对应的路径节点。
方案2:用数组/列表统一管理多个路径集合
如果不需要用tuple包装,直接用数组或列表来管理多个路径集合会更简洁,和你提到的"创建三个独立集合"思路一致,但更方便批量操作:
{int} paths[3]; // 分别初始化每个路径集合 paths[0] = {1,2}; paths[1] = {3,4}; paths[2] = {5,6};
方案3:保留独立变量的紧凑写法
如果还是想保留独立的变量名,又不想重复写类型声明,可以试试语言支持的批量声明方式:
{int} p1 = {1,2}, p2 = {3,4}, p3 = {5,6};
这种写法和你最初的想法完全匹配,同时避免了冗余的类型声明。
额外提示
如果你的路径是存储<link<i,j>>这种边结构的,记得把集合类型从{int}改成对应的边类型(比如自定义的link tuple),才能正确存储路径中的边。示例如下:
tuple link{ int i; int j; } tuple path{ {link} edges; } {path} ps = { path{edges: { link{i:1,j:2}, link{i:2,j:3} }}, ... };
内容的提问来源于stack exchange,提问作者guanting.lai
相关产品推荐
相关产品推荐

