[懐古シリーズ]GAMSでDEA-CCRモデルのプログラムを作成


懐古シリーズは引き続き、自作プログラムたちの紹介。もう10年近く前に作ったやつなのでもっと効率的な記述方法はあるかもしれないですが。備忘録として。

DEA(CCRモデル)のGAMSプログラム(2007/12/7)

需要が全く無いのは分かるけども,あくまで自己満足のために自作したGAMSプログラムを置いていくことにする.今回はDEA-CCR Model.
$title Data  Envelopment Analysis - DEA(CCR Model dual)
**********************************************************
*2007/12/01
*programmed by dice-K (Harmony*Harmony)
*
**********************************************************

*変数及びDMUの宣言*
*iはDMU,jは変数の種類*
sets i       "DMU's"  /city1*city10/
     j       'inputs and outputs and costs' /speed,c_pkm, p_pkm/
     inp(j)  'inputs'  /c_pkm, p_pkm/
     outp(j) 'outputs' /speed/;

*分析対象DMUの決定*
set j0(i) 'current DMU';

*データの入力*
Table data(i,j)
             speed          c_pkm          p_pkm
city1         50.51         5454.2         1135.92
city2         27.30         5109.75        957.59
city3         55.75         24656.93       357.85
city4         35.33         3261.41        1763.58
city5         37.57         4354.82        1735.63
city6         57.35         8105.73        3114.18
city7         32.17         6967.87        665.79
city8         58.19         12639.91       719.8
city9         45.26         5741.48        1612.8
city10        46.60         11208.22       925.28
;

*変数の決定*
Positive variable lamda(i);
parameter x(i,inp), y(i,outp);
Variable eff;

*使用する式の宣言*
Equations dii(i,inp), dio(i,outp);

* 目的関数及び制約条件の設定*
dii(j0,inp).. sum(i, lamda(i)*x(i,inp)) =l= eff*x(j0,inp);
dio(j0,outp).. sum(i, lamda(i)*y(i,outp)) =g= y(j0,outp);

*使用モデルと変数の宣言*
model dea /dii,dio/;

*データの変換作業*
alias(i,iter);
x(i,inp) = data(i,inp);
y(i,outp) = data(i,outp);

*出力の際の変数の設定*
parameter efficiency(i),lam(iter,i);

*効率性計算のためのループ*
loop(iter,
   j0(i) = no;
   j0(iter) = yes;
   solve dea using lp minimizing eff;
   abort$(dea.modelstat<>1) "LP was not optimal";
   lam(iter,i) = lamda.l(i);
   efficiency(iter) = eff.l
;)

*結果の表示*
display efficiency,lam;

 

この記事が気に入ったら
いいね!しよう

最新情報をお届けします

Twitter でdicekcomをフォローしよう!