gams-math - 使用带有表数据的“循环”或“for”来提取每一行数据,并将提取的数据用于 gams 中的两个参数
问题描述
我是 GAMS 新手,我有一个 3 行 6 列的表格数据。我想使用循环或 for 语句提取每一行并将其数据用于两个参数(提取具有 6 个元素的每一行并将前三个元素用于一个参数,将其他三个元素用于第二个参数)。我尝试同时使用它们,但是对于循环,我收到的参数为零值,这是不正确的,对于 for 语句,我收到了一些错误。这是我的第一行代码,它同时使用了“loop”和“for”(我每次都单独使用它们,但为了显示我的代码是什么,我只是把它们写在一起)。请帮我。谢谢
scalars j;
sets
o /red,green,blue/
p /b1,b2,b3,p1,p2,p3/
k /1*3/;
Table sup(*,*)
b1 b2 b3 p1 p2 p3
red 12 15 20 200 50 50
green 16 17 0 150 50 0
blue 13 18 0 100 50 0 ;
parameters Bid_Red(k),Pmax_Red(k),t;
*for statement***************
for(j= 1 to 3,
t=card(o)+j;
Bid_Red(k)$( ord(k) = j )=sup('red',j);
Pmax_Red(k)$( ord(k) = j )=sup('red',t);
);
*loop statement***************
t=card(o);
loop(k,
Bid_Red(k)=sup('red',k);
Pmax_Red(k)=sup('red',k+t);
);
display Bid_red, Pmax_Red
解决方案
GAMS 的核心特性之一是它如何处理集合结构和索引。我建议查看优秀的文档,例如关于集合定义的https://www.gams.com/latest/docs/UG_SetDefinition.html,以真正了解如何充分利用它。
在您的情况下,您可以按以下方式进行。p
是一个集合。创建它的一些子集p_
和b_
,由语法给出subset_name(set_name)
。
sets p_(p) / p1, p2, p3 /,
b_(p) / b1, b2, b3 /;
在适当的维度(即完整集)上创建参数,并在您感兴趣的子集上定义它们:
parameters bid_red(o,p),pmax_red(o,p);
bid_red(o,b_) = sup(o,b_);
pmax_red(o,p_) = sup(o,p_);
然后display bid_red, pmax_red;
给出:
---- 21 PARAMETER bid_red
b1 b2 b3
red 12.000 15.000 20.000
green 16.000 17.000
blue 13.000 18.000
---- 21 PARAMETER pmax_red
p1 p2 p3
red 200.000 50.000 50.000
green 150.000 50.000
blue 100.000 50.000
如果您确实想选择单独的行,您可以pmax_red('red',p_)
在代码中使用 eg。这本质上只是子集的一种特殊情况,其中子集的大小为 1。
推荐阅读
- javascript - 返回未定义而不是数字的函数
- android - 如何解决 kotlin 中的预期类主体错误
- cookies - 如何在服务器端 Blazor 中访问 HttpContext?
- r - 当 SPDF 为空时,在 Leaflet for Shiny 中的反应子集后绘制 SpatialPolygonsDataFrame 会返回错误
- javascript - 将函数的点击事件设置为按钮
- php - php上的href链接不传递变量
- javascript - Karma / Webpack / 伊斯坦布尔的覆盖问题
- docker - 如何在 hub.docker.com 上搜索我的私人仓库
- sql - 如何改进我在 oracle 中的删除语句?
- google-api - Google AdSense Managament API 总是返回 0 条记录