GAMS Cplex求解最小网络流问题:输出含不存在弧的修正求助
修正GAMS网络流模型:解决不存在弧的输出问题
我帮你排查出两个关键问题,直接导致GAMS输出了不存在的弧,下面是修正后的完整代码和详细解释:
问题根源
- 弧集合定义错误:你写的
Set arc(i,j) arcs from node i to j /1 .2 2 .3 3 .4 1 .4 2 .4/;里,每个弧的i和j之间加了空格(比如1 .2),GAMS会把1和.2当成独立的元素,无法正确识别为i=1到j=2的弧。 - 流量变量未限定在有效弧上:如果变量
x定义为x(i,j),GAMS会生成所有i和j的组合(包括不存在的弧),必须把变量限定在arc(i,j)集合内。
修正后的完整代码
Set i supply nodes /1,2,3,4/; Alias(i,j); // 修正弧集合的写法:i和j之间用点连接,无空格,元素用空格或逗号分隔 Set arc(i,j) arcs from node i to j /1.2 2.3 3.4 1.4 2.4/; Parameter b(i) number of units available or required at node i /1 5, 2 2, 3 -4, 4 -3/; // 补全成本表(假设你原本的4->3成本是2,可根据实际需求修改) Table c(i,j) cost of shipping from node i to node j 1 2 3 4 1 0 3 0 1 2 0 0 6 5 3 0 0 0 0 4 0 0 2 0; // 只在有效弧上定义流量变量 Variable x(arc) flow on arc; Variable z total cost; // 目标函数:最小化总运输成本 Equation obj define objective function; obj.. z =e= sum(arc(i,j), c(i,j)*x(i,j)); // 节点流量平衡约束 Equation balance(i) flow balance at node i; balance(i).. sum(arc(i,j), x(i,j)) - sum(arc(j,i), x(j,i)) =e= b(i); // 模型定义与求解 Model networkflow /all/; Solve networkflow using lp minimizing z; // 只输出有效弧的流量结果 Display x.l, z.l;
关键修正点详解
- 弧集合修正:把
1 .2改成1.2,确保GAMS正确识别每个弧是i到j的连接。 - 变量范围限定:
Variable x(arc)只在已定义的弧上创建变量,避免生成不存在的弧对应的变量。 - 结果输出控制:用
Display x.l只会输出有效弧的流量值,不会显示不存在的弧。 - 成本表补全:我补全了你代码中缺失的
4->3的成本值(设为2),你可以根据实际需求调整。
这样修改后,求解结果就只会显示你定义的那些弧的流量,不会出现不存在的弧了。
内容的提问来源于stack exchange,提问作者mvk
相关产品推荐
相关产品推荐

