首页 > 解决方案 > 使用带有表数据的“循环”或“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-math

解决方案


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。


推荐阅读