首页 > 解决方案 > 我怎样才能制作这个套装?

问题描述

设 s 为场景索引,j 为网络节点索引。(s={1*200} , j={1*100}) d(s,j)= 污染场景 s 的总影响,如果污染物是第一个在 j 的场景中检测到。W(s) = d(s,j)<>0 的网络节点子集。W'(s)= W(s) 的子集,使得 d(s,j)<>d(s,j') ,对于所有 j,j' 属于 W'(s)。

如何制作子集 W'(s)?

我收到以下代码错误!我的尝试:

Set
     i /1*100/
     s/1*200/

;

Alias (i,j);
set
     Node(j)
     Wp(Node)
     same(Node)
     U(Node)
     ;

Parameter d(s,j);
scalar t,posMin;


  $call GDXXRW.exe data.xlsx  par=d rng=sheet2!A1:X200
  $GDXIN data.gdx
  $LOAD d
  $GDXIN


Loop(s,
     Node(j)=(j.val);
     while(Card(Node)<>0,
             t=smin(Node$(d(s,Node)),d(s,Node));
             same(Node)$(d(s,Node)=t)=yes;
             posMin=smin(Node,same(Node));

             display t,same, posMin;
             Wp(Node)=Wp(Node)+( Node$(Node.val=posMin));
             display Wp;
             same(Node)$(Node.val=posMin)=no;
             u(Node)=same(Node);
             Node=Node-U;

     );


 );

标签: gams-math

解决方案


如果我正确理解了您的问题和数据类型,这样的事情会起作用吗?:

Given some data:

set s / 1*5 /,
    j / 1*3 /;

alias(j,i);

table d(s,j)

    1   2   3
1   0   20  20
2   0   0   20
3   10  20  30
4   0   0   0
5   0   20  30

;

集合 W 是 s 的子集,仅包含非零行:

set W(s);
W(s) = yes$sum(j, d(s,j));    
display W;

集合 Wp 是 W(s) 的子集,包含 W 的元素减去 j 上的非零重复元素:

set Wp(s);
Wp(s) = yes$W(s);

loop((W(s),i,j),
    if(((d(s,i) eq d(s,j)) and (d(s,i) ne 0) and (ord(i) ne ord(j))),
    Wp(W) = no;
        ));

display Wp;

对我来说,这使得: s={1,2,3,4,5} W={1,2,3,5} Wp={2,3,5}


** 编辑(来自评论)**

创建一个集合 Q。如果您的数据超过两个维度,并且您希望您的集合在两个维度上定义,这就足够了:

set Q(s,j);
Q(s,j) = yes$d(s,j);
display Q;

为每个 s(在 Q 中)创建跨 j 存储最小值的参数:

parameter xp(s);
xp(s) = smin(j$Q(s,j), d(s,j));
display xp;

创建仅保留 j 中最小值的原始数据副本:

parameter d_copy(s,j);
d_copy(s,j) = d(s,j)$(d(s,j) eq xp(s));

随着 j 的增加,删除所有重复项:

loop((s,i,j),
    if((d_copy(s,j) eq d(s,i))$(ord(j) gt ord(i)),
        d_copy(s,j) = 0;
    );
);

display d_copy;

创建对应于最小值的 Q 子集:

set Qp(s,j);
Qp(Q) = yes$d_copy(Q);
display Qp;

推荐阅读