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


GAMSプログラム紹介シリーズラストです。Inverted DEAのプログラムです。DEAが効率性を計測するモデルなのに対し、Inverted DEAは「非効率性」を計測するモデルということになります。両者は効率値の評価式の取り方が異なるため、DEAの効率値とIDEAの非効率値の間に本質的には関係がないということが重要なのですが、その辺は以下の論文等で詳しく書かれてます。興味ある方はご覧ください。
円谷友英・前田豊・田中英夫:区間効率値によるDEAモデル, 数理解析研究所講究録, Vol.1079, pp.224-232, 1999.

Inverted DEAのGAMSプログラム例(2018/1/16)

主問題のみ.λ使った双対問題はまた今度紹介する.(→と言いつつ、2015年現在、紹介できていないわけですが・・・まぁ、また追々ということで・・・)
*************************************************
*Inverted DEA Model
*
*Dice-K 2008/01/16
*************************************************

*パラメータの設定*
sets i       "DMU's"  /DMU1*DMU5/
     j       'inputs and outputs' /out,in1,in2/
     inp(j)  'inputs'  /in1,in2/
     outp(j) 'output' /out/
;

*対象DMUの設定*
set j0(i) 'current DMU';

*データ入力*
Table data(i,j)
              out       in1         in2
DMU1         50         5454        1135
DMU2         27         5109        957
DMU3         55         2465        357
DMU4         35         3261        1763
DMU5         37         4354        1735  
;

*変数をデータから拾う*
parameter
   x(inp,i)  'inputs of DMU i'
   y(outp,i) 'outputs of DMU i'
;

*係数の設定*
positive variables
   v(inp)  'input weights'
   u(outp) 'output weights'
;

*無次元パラメータの設定*
variable
   eff 'efficiency'
   sigm
;

*数式の定義*
equations
   objective(i)   'objective function: maximize efficiency'
   normalize(i)   'normalize input weights'
   limit(i)       "limit other DMU's efficiency"
;

*目的関数*
objective(j0)..  eff =e= sum(inp, v(inp)*x(inp,j0));

*制約条件*
normalize(j0)..  sum(outp, u(outp)*y(outp,j0))+sigm =e= 1;

limit(i)..   sum(outp, u(outp)*y(outp,i))+sigm =g= sum(inp, v(inp)*x(inp,i));

*モデルの定義*
model dea /objective, normalize, limit/;

*データの変換*
alias(i,iter);

x(inp,i) = data(i,inp);
y(outp,i) = data(i,outp);


parameter efficiency(i), out(i,outp),in(i,inp) 'efficiency of each DMU';

*効率性計算のループ*
loop(iter,
   j0(i) = no;
   j0(iter) = yes;

   solve dea using lp maximizing eff;
   abort$(dea.modelstat<>1) "LP was not optimal";

   efficiency(iter) = eff.l;
   out(iter,outp) = u.l(outp);
   in(iter,inp) = v.l(inp);
;)

*結果の出力*
display efficiency,out,in;

 

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

最新情報をお届けします

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