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

GAMS多OD对运输网络模型:eq3与eq4索引错误修正求助

修正GAMS多OD对运输网络模型中的eq3和eq4索引错误

你的eq3和eq4存在索引重复定义和求和范围错误的问题,以下是修正后的语法及完整代码:

错误分析与修正要点

方程eq3(链路流量守恒)

原代码重复嵌套(r,s)索引,导致GAMS无法正确识别求和范围。正确逻辑是:链路a的流量x(a)等于所有OD对(r,s)下,属于该OD对的路径b上的流量f(r,s,b)乘以路径b经过链路a的指示变量del(r,s,b,a)的总和。

修正后的eq3:

eq3(a)..x(a)=e=sum((r,s,b)$paths(r,s,b), f(r,s,b)*del(r,s,b,a));

或拆分求和(可读性更强,效果一致):

eq3(a)..x(a)=e=sum((r,s), sum(b$paths(r,s,b), f(r,s,b)*del(r,s,b,a)));

方程eq4(OD对流量守恒)

原代码sum中错误包含(r,s)索引,且未约束路径b属于当前OD对(r,s)。正确逻辑是:每个OD对(r,s)的总路径流量之和等于该OD对的需求demand(r,s,'d')。

修正后的eq4:

eq4(r,s)..sum(b$paths(r,s,b), f(r,s,b))=e=demand(r,s,'d');

完整修正后的代码

/ minimize travel time in multiple origin destination pair
sets a "links" /l1*l19/
b "path sets" /p1*p25/
r "origin node" /1,4/
s "destination node" /2,3/;

table demand(r,s,*) "demand between rs pairs"
    d
1.2 11000
1.3 24000
4.2 13000
4.3 6000
;

Table link_data(a,*) "free travel time ta0"
        length  ta0     Capacity
l1      7       7       800
l2      9       9       400
.
.
l19     11      11      600
;

set paths(r,s,b) "paths in origin r to destiantion s"
/1.2.p1*p8, 1.3.p9*p14, 4.2.p15*p19, 4.3.p20*p25 /
;


table del(r,s,b,a) "parameter to show path b passes through link a from r to s"

        l1  l2  l3  l4  l5  l6  l7  l8  l9  l10 l11 l12 l13 l14 l15 l16 l17 l18 l19
1.2.p1  0   1   0   0   0   0   0   0   0   0   1   0   0   0   0   0   0   1   0
1.2.p2  1   0   0   0   1   0   1   0   1   0   1   0   0   0   0   0   0   0   0
.
.
1.3.p14 0   1   0   0   0   0   0   1   0   0   0   0   0   1   0   1   1   0   0
4.2.p15 0   0   0   1   0   0   0   0   0   0   0   1   0   1   1   0   0   0   0
.
.
4.3.p25 0   0   1   0   0   1   0   0   0   0   0   1   0   1   0   1   0   0   0

;

variables of "objective function"
        t(a) "travel time in link a"
        x(a) "vehicle in link a"
        f(r,s,b) "vehicle flow in origin r to destination s on path b";

f.lo(r,s,b)=0;
x.up(a)= link_data(a,'capacity')*10;
x.lo(a)=0;

equations eq1,eq2,eq3,eq4;

eq1..of=e=sum(a,t(a)); 
eq2(a)..t(a)=e=link_data(a,'ta0')*(1+0.15*(x(a)/link_data(a,'Capacity'))**4);

eq3(a)..x(a)=e=sum((r,s,b)$paths(r,s,b), f(r,s,b)*del(r,s,b,a));

eq4(r,s)..sum(b$paths(r,s,b), f(r,s,b))=e=demand(r,s,'d');

Model mc / all /;

solve mc minimizing of using NLP ;

display f.l ;

修正说明

  1. eq3:移除重复的(r,s)索引嵌套,通过$paths(r,s,b)过滤出合法的路径-OD对组合,确保求和范围正确。
  2. eq4:仅对当前OD对(r,s)下的路径b求和,保证每个OD对的流量总和匹配对应需求,避免索引混淆。

内容的提问来源于stack exchange,提问作者yousuf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 01:05:52