GAMS 错误 121 - 索引 gdx 数据时出现问题
GAMS Error 121 - Issue with indexing gdx data
我很难从 .gdx 文件中读取我需要的数据。我已成功从 Excel 加载文件,但当我尝试访问我需要的索引时出现错误:
Sets
t time intervals / t1*t12 / [b] !! set definition[/b]
i customers / c1*c5 /
r row labels /r1*r97/
c column labels /c1,c2,c3,c4,c5/;
parameter p(r,c); [b]!! reading the table from Excel[/b]
$CALL GDXXRW Curve.xlsx trace=3 par=p rng=Sheet1!a1:f97 rdim=1 cdim=1
$gdxin Curve.gdx
$load p
$gdxin
parameter h; [b] !! reading the scalar[/b]
$CALL GDXXRW load.xlsx trace=3 par=h rng=Sheet1!i2:i2 dim=0
$GDXIN load.gdx
$LOAD h
$GDXIN
cost .. z =e= sum(t, maxLoad - sum(i, u(i,t)*cons(i)*clpu(t)*p(h,i)));
current_load(t) .. sum(i, u(i,t)*cons(i)*clpu(t)*p(i,h)) =l= maxLoad;
代码有多个错误,但我遇到的第一个错误是在读取 p(h,i)(粗体行)时。我需要来自 gdx 的数据,这些数据在我也从其他 gdx 读取的 h 列中,以及与我用于其他变量的 i 相同的第 i 行。
我不确定我附上的代码是否足够,如有遗漏请提前致歉。
您将 p(r ,c) 定义为参数。而 h 作为另一个参数。 p(h,I) 没有意义。
当您使用参数 p 时,您必须具有索引 ( r,c)。不是 (h,I) .
这就是问题所在。但是我现在知道如何设置我想要读取的所需索引。
以下代码解决了索引问题:
Sets
t time intervals / t1*t12 /
i customers / c1*c5 /
r row labels /r1*r97/;
parameter p(r,i), h;
$CALL GDXXRW Curve.xlsx trace=3 par=p rng=Sheet1!b1:g97 rdim=1 cdim=1 par=h rng=Sheet1!i2:i2 dim=0
$gdxin Curve.gdx
$load p h
$gdxin
display p, h;
cost .. z =e= sum(t, maxLoad - sum((i,r)$[ord(r)=h], u(i,t)*cons(i)*clpu(t)*p(r,i)));
关键在于将 h 值分配给索引 r 的 ord() 运算符:(i,r)$[ord(r)=h]
我很难从 .gdx 文件中读取我需要的数据。我已成功从 Excel 加载文件,但当我尝试访问我需要的索引时出现错误:
Sets
t time intervals / t1*t12 / [b] !! set definition[/b]
i customers / c1*c5 /
r row labels /r1*r97/
c column labels /c1,c2,c3,c4,c5/;
parameter p(r,c); [b]!! reading the table from Excel[/b]
$CALL GDXXRW Curve.xlsx trace=3 par=p rng=Sheet1!a1:f97 rdim=1 cdim=1
$gdxin Curve.gdx
$load p
$gdxin
parameter h; [b] !! reading the scalar[/b]
$CALL GDXXRW load.xlsx trace=3 par=h rng=Sheet1!i2:i2 dim=0
$GDXIN load.gdx
$LOAD h
$GDXIN
cost .. z =e= sum(t, maxLoad - sum(i, u(i,t)*cons(i)*clpu(t)*p(h,i)));
current_load(t) .. sum(i, u(i,t)*cons(i)*clpu(t)*p(i,h)) =l= maxLoad;
代码有多个错误,但我遇到的第一个错误是在读取 p(h,i)(粗体行)时。我需要来自 gdx 的数据,这些数据在我也从其他 gdx 读取的 h 列中,以及与我用于其他变量的 i 相同的第 i 行。 我不确定我附上的代码是否足够,如有遗漏请提前致歉。
您将 p(r ,c) 定义为参数。而 h 作为另一个参数。 p(h,I) 没有意义。 当您使用参数 p 时,您必须具有索引 ( r,c)。不是 (h,I) .
这就是问题所在。但是我现在知道如何设置我想要读取的所需索引。 以下代码解决了索引问题:
Sets
t time intervals / t1*t12 /
i customers / c1*c5 /
r row labels /r1*r97/;
parameter p(r,i), h;
$CALL GDXXRW Curve.xlsx trace=3 par=p rng=Sheet1!b1:g97 rdim=1 cdim=1 par=h rng=Sheet1!i2:i2 dim=0
$gdxin Curve.gdx
$load p h
$gdxin
display p, h;
cost .. z =e= sum(t, maxLoad - sum((i,r)$[ord(r)=h], u(i,t)*cons(i)*clpu(t)*p(r,i)));
关键在于将 h 值分配给索引 r 的 ord() 运算符:(i,r)$[ord(r)=h]