希望能MSN联系,或者邮件。。。
msn: andyjia1984@hotmail.com
e-mail: linjia.zhang1984@gmail.com
谢 谢大家啦 , 以下蓝字的是一个基本的程序, 问题是:那位能给我讲解下在model building 中的语句, %macro data 我基本都明白,但是在model building 中的语句尤其是 array , 彻底把我能晕拉。。。。 (我想在线性规划中加入两个限制条件,第一,lambda的和为1。。和一个不等关系)
一个小问题。。 keep _row_ _col_ _type_ _coef_ ;, 我不明白变量_coef_ 是什么时候引进的阿。。。
红色语句中的J0是怎么回事啊??和绿色语句中的j0是一个变量吗??
%macro data;
data NY;
infile &_OutData delimiter='09'X missover dsd ;
array NYarray(&_nOutput) $ NY1-NY&_nOutput ;
length unitname $ 50 ;
input unitname $ NYarray(*) $ ;
if _n_ eq 1 then output ;
drop unitname;
run;
data AY DMUs;
infile &_OutData delimiter='09'X missover dsd;
array AYarray(&_nOutput) AY1-AY&_nOutput;
length unitname $ 50 ;
input unitname $ AYarray(*) ;
if _n_ gt 1 then output ;
run;
data NX;
infile &_InData delimiter='09'X missover dsd ;
array NXarray(&_nInput)$ NX1-NX&_NInput ;
length unitname $ 50 ;
input unitname $ NXarray(*) $ ;
if _n_ eq 1 then output;
drop unitname;
run;
data AX;
infile &_InData delimiter='09'X missover dsd ;
array AXarray(&_nInput) AX1-AX&_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 j0;
data MODEL1;
%let _nUnit=&_nDmu;
array NYarray(&_nOutput)$ NY1-NY&_nOutput ;
array AYarray(&_nOutput) AY1-AY&_nOutput;
array NXarray(&_nInput) $ NX1-NX&_NInput ;
array AXarray(&_nInput) AX1-AX&_nInput;
array Jarray(&_nUnit) U1-U&_nUnit ;
length _row_ $ 50 _col_ $ 50 _type_ $ 8 ;
keep _row_ _col_ _type_ _coef_ ;
J0=&jj; /* Jo is unit under assessment*/
if &_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 &_nUnit;
link ReadAX;
do i= 1 to &_nInput;
_col_='LA' || put(j,3.);
_row_=NXarray(i);
_type_='.';
_coef_=AXarray(i);
output;
if j=J0 then do;
select(&_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=&_nDmu;
array NYarray(&_nOutput)$ NY1-NY&_nOutput ;
array AYarray(&_nOutput) AY1-AY&_nOutput;
array NXarray(&_nInput) $ NX1-NX&_NInput ;
array AXarray(&_nInput) AX1-AX&_nInput;
array Jarray(&_nUnit) U1-U&_nUnit ;
length _row_ $ 50 _col_ $ 50 _type_ $ 8 ;
keep _row_ _col_ _type_ _coef_ ;
J0=&jj; /* Jo is unit under assessment*/;
if &_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 &_nUnit;
link ReadAY;
do r= 1 to &_nOutput;
_col_='LA' || put(J,3.);
_row_=NYarray(r);
_type_='.';
_coef_=AYarray(r);
output;
if j=J0 then do;
select(&_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=&_nDmu;
%do jj=1 %to &_nUnit;
%model;
proc lp data=MODEL noprint sparsedata
primalout=lp2 dualout=lp3 ; run;
data EffJ0(keep=Uj0 eff); set lp2 (where=(_var_='OBJ')); Uj0=&jj;
if &_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=&jj;run;
proc datasets nolist; append base=Report1 data=lp2;run;
data lp3; set lp3; Uj0=&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;
[此贴子已经被作者于2008-6-4 22:28:41编辑过]