gdxxrw で複数のパラメータを一気に excel に出力する方法

Windows上の)GAMS では Excel とデータをやりとりする際に gdxxrw というプログラムを使います。

具体的には、以下のように間にGDXファイルをというものをはさんでやりとりします。

  • ExcelのデータをGAMSで利用するとき:Excel のデータを gdxxrw を用いて GDX 形式に変換 ⇒ GDXファイルをGAMSで読み込む
  • GAMSのデータをExcelに出力するとき:GAMS から GDX ファイルにデータを出力 ⇒ gdxxrw で GDXファイルの中身をExcelファイルに出力。

私も計算結果は結局、Excelファイルに出力してグラフなどにして見ることが多いので、このgdxxrwというプログラムをよく利用します。

以下は、gdxxrw を利用する際に一度に複数のパラメータの値を Excel に出力するためのコードの例です。

$title 多数のパラメータを一気に excel に出力するコード.
$ontext
Time-stamp:     <2022-09-24 14:23:52 st>
First-written:  <2010/05/22>

多数のパラメータを excel に出力する二つの方法.

アプローチ2のが速い.特に出力するパラメータの数が多くなると実行速度が大幅に違っ
てくる.

$offtext

set     i Sample index / 1*100 /
        j Sample index / 1*100 /
;

parameter a Sample parameter
          b Sample parameter
          c Sample parameter
          d Sample parameter
          e Sample parameter
          f Sample parameter
          g Sample parameter
          h Sample parameter
          l Sample parameter
;
a(i,j) = uniform(0,100);
b(i,j) = uniform(0,100);
c(i,j) = uniform(0,100);
d(i,j) = uniform(0,100);
e(i,j) = uniform(0,100);
f(i,j) = uniform(0,100);
g(i,j) = uniform(0,100);
h(i,j) = uniform(0,100);
l(i,j) = uniform(0,100);
display a, b, c, d, e, f, g, h, l;

*   まず parameter を results_2.gdx に出力する.
execute_unload "results_2.gdx", a, b, c, d, e, f, g, h, l;

*   ----------------------------------------------------------------------
*   アプローチ1
display "com: アプローチ1";
$ontext
こちらは一度の gdxxrw の実行で一つのパラメータを gdx → excel に出力する.
$offtext
execute '=gdxxrw i=results_2.gdx o=results_2_.xlsx par=a rng=sheet_a!A1 rdim=1 cdim=1'
execute '=gdxxrw i=results_2.gdx o=results_2_.xlsx par=b rng=sheet_b!A1 rdim=1 cdim=1'
execute '=gdxxrw i=results_2.gdx o=results_2_.xlsx par=c rng=sheet_c!A1 rdim=1 cdim=1'
execute '=gdxxrw i=results_2.gdx o=results_2_.xlsx par=d rng=sheet_d!A1 rdim=1 cdim=1'
execute '=gdxxrw i=results_2.gdx o=results_2_.xlsx par=e rng=sheet_e!A1 rdim=1 cdim=1'
execute '=gdxxrw i=results_2.gdx o=results_2_.xlsx par=f rng=sheet_f!A1 rdim=1 cdim=1'
execute '=gdxxrw i=results_2.gdx o=results_2_.xlsx par=g rng=sheet_g!A1 rdim=1 cdim=1'
execute '=gdxxrw i=results_2.gdx o=results_2_.xlsx par=h rng=sheet_h!A1 rdim=1 cdim=1'
execute '=gdxxrw i=results_2.gdx o=results_2_.xlsx par=l rng=sheet_l!A1 rdim=1 cdim=1'

*   ----------------------------------------------------------------------
*   アプローチ2
display "com: アプローチ2";
$ontext
こちらは一度の gdxxrw の実行で複数のパラメータを出力する.

それにはパラメータファイルを利用する.
$offtext
*   cmd.txt に以下の内容を出力.
$onecho > cmd.txt
i=results_2.gdx o=results_2.xlsx
par=a rng=sheet_a!A1 rdim=1 cdim=1
par=b rng=sheet_b!A1 rdim=1 cdim=1
par=c rng=sheet_c!A1 rdim=1 cdim=1
par=d rng=sheet_d!A1 rdim=1 cdim=1
par=e rng=sheet_e!A1 rdim=1 cdim=1
par=f rng=sheet_f!A1 rdim=1 cdim=1
par=g rng=sheet_g!A1 rdim=1 cdim=1
par=h rng=sheet_h!A1 rdim=1 cdim=1
par=l rng=sheet_l!A1 rdim=1 cdim=1
$offecho

*   cmd.txt の中身を引数として gdxxrw を実行.
execute '=gdxxrw @cmd.txt';

*   Excel ファイルを開く.
* execute 'shellexecute "results_2.xlsx"';
* execute 'shellexecute "results_2_.xlsx"';

* --------------------
* Local Variables:
* mode: gams
* fill-column: 80
* End: