You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GAMS Cplex求解最小网络流问题:输出含不存在弧的修正求助

修正GAMS网络流模型:解决不存在弧的输出问题

我帮你排查出两个关键问题,直接导致GAMS输出了不存在的弧,下面是修正后的完整代码和详细解释:

问题根源

  1. 弧集合定义错误:你写的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的弧。
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:54:36