SAS中文论坛

标题: 求助 关于SAS OR模块 谢谢 [打印本页]

作者: shiyiming    时间: 2008-6-5 19:53
标题: 求助 关于SAS OR模块 谢谢
求助 关于SAS OR模块
正在写篇关于DEA的论文,想在SAS中实现引入quasi-fixed inputs 的模型, 其实用proc lp 应该就能解决,但由于本人对LP不是很熟悉,所以在编程中遇到好多问题,那位兄弟能给与解答,不盛感激。。。

希望能MSN联系,或者邮件。。。
msn: <!-- e --><a href="mailto:andyjia1984@hotmail.com">andyjia1984@hotmail.com</a><!-- e -->
e-mail: <!-- e --><a href="mailto:linjia.zhang1984@gmail.com">linjia.zhang1984@gmail.com</a><!-- e -->

谢谢大家啦 , 以下蓝字的是一个基本的程序, 问题是:那位能给我讲解下在model building 中的语句, %macro data 我基本都明白,但是在model building 中的语句尤其是 array , 彻底把我能晕拉。。。。(我想在线性规划中加入两个限制条件,第一,lambda的和为1。。和一个不等关系)

一个小问题。。 keep _row_ _col_ _type_ _coef_ ;, 我不明白变量_coef_ 是什么时候引进的阿。。。

红色语句中的J0是怎么回事啊??和绿色语句中的j0是一个变量吗??



%macro data;
data NY;
  infile &amp;_OutData delimiter='09'X missover dsd ;
  array NYarray(&amp;_nOutput) $ NY1-NY&amp;_nOutput ;
  length unitname $ 50 ;
  input unitname $ NYarray(*) $ ;
  if _n_ eq 1 then output ;
  drop unitname;
  run;

data AY DMUs;
  infile &amp;_OutData delimiter='09'X missover dsd;
  array AYarray(&amp;_nOutput) AY1-AY&amp;_nOutput;
  length unitname $ 50 ;
  input unitname $ AYarray(*) ;
  if _n_ gt 1 then output ;
run;


data NX;
  infile &amp;_InData delimiter='09'X missover dsd ;
  array NXarray(&amp;_nInput)$ NX1-NX&amp;_NInput ;
  length unitname $ 50 ;
  input unitname $ NXarray(*) $ ;
  if _n_ eq 1 then output;
  drop unitname;
  run;

data AX;
  infile &amp;_InData delimiter='09'X missover dsd ;
  array AXarray(&amp;_nInput) AX1-AX&amp;_nInput;
  length unitname $ 50 ;
  input unitname $ AXarray(*) ;
  if _n_ gt 1 then output;
  call symput('_nDmu',_n_-1);
  run;

data DMUs;
  set AY (keep=UnitName);
  Uj0=_n_;
  run;
%mend data;
/*MODEL BUILDING (%MODEL)*/
%macro model;
%local i j [color=#40FF00:1sp95l1f]j0[/color:1sp95l1f];
data MODEL1;
  %let _nUnit=&amp;_nDmu;
  array NYarray(&amp;_nOutput)$ NY1-NY&amp;_nOutput ;
  array AYarray(&amp;_nOutput) AY1-AY&amp;_nOutput;
  array NXarray(&amp;_nInput) $ NX1-NX&amp;_NInput ;
  array AXarray(&amp;_nInput) AX1-AX&amp;_nInput;
  array Jarray(&amp;_nUnit) U1-U&amp;_nUnit ;
  length _row_ $ 50 _col_ $ 50 _type_ $ 8 ;
  keep _row_ _col_ _type_ _coef_ ;
  [color=#0040FF:1sp95l1f]J0=&amp;jj[/color:1sp95l1f]; /* Jo is unit under assessment*/
  if &amp;_Orienta='InputMin' then do;
                          _type_='MIN';
                          _row_ ='OBJ';
                          _col_='.';
                          _coef_=.;
                          output;
                          _type_='.';
                          _row_ ='OBJ';
                          _col_ ='FI';
                          _coef_=1;
                          output;
                          _type_='.';
                          _row_ ='OBJ';
                          _col_='_rhs_';
                          _coef_=0;
                          output;

                          end;

    link ReadNX;
    do j= 1 to &amp;_nUnit;
       link ReadAX;
    do i= 1 to &amp;_nInput;
       _col_='LA' || put(j,3.);
       _row_=NXarray(i);
       _type_='.';
       _coef_=AXarray(i);
       output;
       if j=J0 then do;
         select(&amp;_Orienta);
         when('InputMin') do;
         _row_=NXarray(i);
         _type_='.';
         _coef_=-AXarray(i);
         _col_='FI';
         output;
        _col_='_rhs_';
        _row_=NXarray(i);
        _type_='LE'; /*LE*/;
        _coef_=0;
        output;
        end;
      when('OutputMax') do;
        _row_=NXarray(i);
        _type_='LE';
        _coef_=AXarray(i);
        _col_='_rhs_';
        output;
        end;
      otherwise;
      end;
    end;
  end;
end;
ReadNX: set NX; return;
ReadAX: set AX; return;
run;

data MODEL2;
  %let _nUnit=&amp;_nDmu;
  array NYarray(&amp;_nOutput)$ NY1-NY&amp;_nOutput ;
  array AYarray(&amp;_nOutput) AY1-AY&amp;_nOutput;
  array NXarray(&amp;_nInput) $ NX1-NX&amp;_NInput ;
  array AXarray(&amp;_nInput) AX1-AX&amp;_nInput;
  array Jarray(&amp;_nUnit) U1-U&amp;_nUnit ;

  length _row_ $ 50 _col_ $ 50 _type_ $ 8 ;
  keep _row_ _col_ _type_ _coef_ ;

  J0=&amp;jj; /* Jo is unit under assessment*/;
  if &amp;_Orienta='OutputMax' then do;
                           _type_='MAX';
                           _row_ ='OBJ';
                           _col_='.';
                           _coef_=.;
                           output;
                           _type_='.';
                           _row_ ='OBJ';
                           _col_ ='FI';
                           _coef_=1;
                           output;
                           _type_='.';
                           _row_ ='OBJ';
                           _col_='_rhs_';
                           _coef_=0;
                           output;
                           end;
  link ReadNY;
  do j= 1 to &amp;_nUnit;
     link ReadAY;
     do r= 1 to &amp;_nOutput;
        _col_='LA' || put(J,3.);
        _row_=NYarray(r);
        _type_='.';
        _coef_=AYarray(r);
        output;
        if j=J0 then do;
           select(&amp;_Orienta);
           when('InputMin') do;
             _col_='_rhs_';
             _row_=NYarray(r);
             _type_='GE';
             _coef_=AYarray(r);
             output;
             end;
           when('OutputMax') do;
           _col_='FI';
           _row_=NYarray(r);
           _type_='.';
           _coef_=-AYarray(r);
           output;
           _col_='_rhs_';
           _row_=NYarray(r);
           _type_='GE';
           _coef_=0;
           output;
           end;
         otherwise;
         end;
       end;
     end;
   end;
ReadNY: set NY; return;
ReadAY: set AY; return;
run;
data MODEL; set MODEL1 MODEL2 ; run;
%mend model ;



/*SAS/DEA REPORT WRITING (%REPORT)*/
%macro report;
data eff(drop=Uj0);
  merge DMUs Eff;
  by Uj0;
run;
proc sort data=Eff; by eff; run;
proc print data=Eff; run;
proc sort data=Eff; by UnitName; run;
proc print data=Eff; run;
%mend report;



/*SAS/DEA MACRO*/

%macro sasdea;
  libname sasdea 'D:\sasdea';
  proc datasets nolist; delete Eff Report1 report2; run;
  %data;
  %let _nUnit=&amp;_nDmu;
  %do jj=1 %to &amp;_nUnit;
    %model;
    proc lp data=MODEL noprint sparsedata
primalout=lp2 dualout=lp3 ; run;
    data EffJ0(keep=Uj0 eff); set lp2 (where=(_var_='OBJ')); Uj0=&amp;jj;
    if &amp;_Orienta='OutputMax' and _value_ ne 0 then Eff=1/_value_;else Eff=_value_;
run;
    proc datasets nolist; append base=Eff data=EffJ0; run;
    data lp2; set lp2; Uj0=&amp;jj;run;
    proc datasets nolist; append base=Report1 data=lp2;run;
    data lp3; set lp3; Uj0=&amp;jj;run;
    proc datasets nolist; append base=Report2 data=lp3;run;
    %end;
    %report;
    %mend sasdea;

%let _InData='G:\dea\InVar.TXT';
%let _nInput=2;
%let _OutData='G:\dea\Outvar.TXT' ;
%let _nOutput=2;
%let _Orienta='InputMin';
%sasdea;




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2