1. ホーム
  2. loops

[解決済み] GAMSでマクロ/ループを作成する

2022-02-17 16:50:47

質問

GAMSで以下のセットとパラメータを考える。

set i  / 1,3 /
    j  / j1,j2,j3 /;

parameter stock(i,j);

パラメータに特定の値を入れたいと考える。

stock("1","j1") = 10;
stock("3","j3") = 10;

それを2行で書くのではなく、マクロ、$setGlobal、loop(または同様のもの)を使って、まず(1)どのセットに対してそれを行うかを指定し、(2)次に式を1行で書くだけでいいのでしょうか。

サブセットを作ることができる

set subset_i(i) / 1,3/
    subset_j(j) / j1,j3 /;

そして、これらのサブセットをループします。

loop(subset_i,
   loop(subset_j,
      stock(i,j) = 10;
   );
);

しかし、その後、各組み合わせの値を取得します。

1   j1  10
1   j2  10
1   j3  10
3   j1  10
3   j2  10
3   j3  10

欲しいのは、ただひとつ。

1   j1  10
3   j3  10

どうすればいいんだ?

どのように解決するのですか?

設定したいのは、まさに対角線(1-j1; 2-j2)なのでしょうか?それとも、これは単なるランダムな例で、マッピングは別のものでもよいのでしょうか?もし対角線であれば、次のようにすればよいでしょう。

set i  / 1,2 /
    j  / j1,j2 /;

parameter stock(i,j);

stock(i,j)$(ord(i)=ord(j)) = 10;

display stock;

EDIT(コメント/編集された質問を元に)。

また、対角線についてだけでなければ、より一般的な写像を明示的に定義することもできます。これは次のようにできる。

set i        / 1,  3      /
    j        / j1, j2, j3 /
    map(i,j) / 1.j1, 3.j3 /;

parameter stock(i,j);

stock(map(i,j)) = 10;

display stock;