如何在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
相关产品推荐
相关产品推荐

