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

如何在GAMS中定义网络流问题的特殊集合(8*8网格场景)

GAMS中8×8网格邻接集合与源汇节点对的正确定义

一、邻接集合nb的修正

你原代码中直接用i-1这类操作是错误的,因为GAMS的集合元素(如i1、j1)是字符串标识,无法直接进行算术运算。必须通过ord()函数获取元素的序号,结合边界条件来定义邻接关系:

set i / i1 * i8 /;
set j / j1 * j8 /;
alias (i,ii),(j,jj);

* 网格节点集合
set V(i,j);
V(i,j) = yes;
display V;

* 邻接集合:(i,j)的上下左右有效邻节点
set nb(i,j,ii,jj);
nb(i,j,ii,jj) = (ord(ii) = ord(i)-1 and ord(jj) = ord(j) and ord(i) > 1)  // 上邻(排除第一行)
              or (ord(ii) = ord(i)+1 and ord(jj) = ord(j) and ord(i) < 8)  // 下邻(排除第八行)
              or (ord(jj) = ord(j)-1 and ord(ii) = ord(i) and ord(j) > 1)  // 左邻(排除第一列)
              or (ord(jj) = ord(j)+1 and ord(ii) = ord(i) and ord(j) < 8); // 右邻(排除第八列)
display nb;

这段代码会准确生成你预期的邻接关系:边界节点仅包含有效方向的邻节点,内部节点包含四邻节点。

二、成对源汇节点集合的定义

为了让每个源节点对应唯一汇节点(对应不同商品),建议先定义商品索引集合k,再分别绑定源、汇节点:

* 商品集合,数量与源/汇对一致
set k / k1*k7 /;

* 源节点集合:k1对应(2,1),k2对应(2,2)…
set source(k,i,j);
source('k1','i2','j1') = yes;
source('k2','i2','j2') = yes;
source('k3','i2','j5') = yes;
source('k4','i2','j6') = yes;
source('k5','i6','j2') = yes;
source('k6','i8','j1') = yes;
source('k7','i8','j5') = yes;

* 汇节点集合:k1对应(2,3),k2对应(2,7)…
set sink(k,i,j);
sink('k1','i2','j3') = yes;
sink('k2','i2','j7') = yes;
sink('k3','i5','j3') = yes;
sink('k4','i5','j5') = yes;
sink('k5','i6','j8') = yes;
sink('k6','i7','j8') = yes;
sink('k7','i8','j8') = yes;

display source, sink;

这种方式能清晰维护源汇的成对关系,后续网络流模型中可直接通过k索引调用对应商品的起点和终点。


内容的提问来源于stack exchange,提问作者A.Omidi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 07:38:17