$ONINLINE /* ********************************************************************** */ /* The following file contains the GAMS code from the paper: */ /* O. B. Olesen and N. C. Peteren: 1994. A Presentation of GAMS for DEA" */ /* Forthcoming in Computers and Operations Research. */ /* ********************************************************************** */ /* FILE 1: HEADER FOR GENERAL GAMS PROGRAM FOR DEA-ANALYSIS. */ $OFFUPPER $OFFSYMXREF $OFFSYMLIST /* **************************************************** */ /* First, global scalars for allocation, model choice etc */ /* **************************************************** */ SCALAR M /1E+4/ /* a non-Archimedian inverse, large, but not too large */ PRIMAL / 0/ DUAL / 1/ CRS / 1/ NIRS / 0/ VRS / 0/ /* Activates various included blocks of statements */ /* Statements related to other blocks than simple DEA estimation omitted */ SOLVEDEA / 1/ /* DEA Estimation */ FDMU / 1/ /* First DMU is the DMU with ordinal value equal to FDMU */ LDMU / 2/ /* LastDMU is the DMU with ordinal value equal to FDMU */ DATAPRT / 0/ /* 0 -- No Dataprinting, >0 -- Dataprinting */ AUTOSCAL / 0/ /* 0 -- No Autoscaling, >0 -- Autoscaling */ ; /* **************************************************** */ /* Next, reporting files, formats setup etc. */ /* **************************************************** */ FILE f1 /res/; f1.PW=180; f1.PC=3; IF (SOLVEDEA, PUTTL f1 'DEA Results', @20,'Date: ', SYSTEM.DATE,@40,'Page: ',SYSTEM.PAGE, @60, 'PRIMAL:',@70,PRIMAL:<4:0/; ); FILE f2 /datares/; f2.PW=180; f2.PC=3; PUTTL f2 'Data Listing', @40,'Date: ',SYSTEM.DATE,@60,'Page: ',SYSTEM.PAGE/; FILE f3 /scores/ OPTION LIMROW=0; OPTION LIMROW=0; OPTION SYSOUT=OFF; $TITLE General GAMS program for DEA analysis OPTION ITERLIM = 100000; OPTION RESLIM = 100000; SET IO1 / 0*3 / OUTPUT1(IO1) / 2*3/ INPUT1(IO1) / 0*1/ UNITS / 1*100/ SUBUNITS(UNITS) / 1*3 / /* Only SUBUNITS active in constraints */ ACTUNIT(UNITS) ; ALIAS(IO1,IO2,IO3,IO4); ALIAS (UNITS,UNITS1,LUNITS1,LUNITS2,LUNITS3); ALIAS (SUBUNITS,SUBUNITS1,SUBUNITS2,SUBUNITS3); /* **************************************************** */ /* Next, input data on the inputs and the outputs. */ /* **************************************************** */ $OFFLISTING /*$INCLUDE ..\datafile.inc */ /* TABLE IOACT(UNITS,IO1) */ TABLE IOACT(UNITS,IO1) iodata from 20 DMUs 0 1 2 3 1 1 1.5 3 4 2 2.5 2 7 3.5 3 0.5 1 4.5 0.5 ; $ONLISTING /* $INCLUDE home/gendea.blk */ /* $INCLUDE home/solvedea.blk /* /* FILE 2: GENERAL GAMS PROGRAM FOR DEA-ANALYSIS. */ /* **************************************************** */ /* GENDEA - module (gendea.blk): */ /* **************************************************** */ /* CHECKING FOR CONSISTENT MODEL SELECTION. */ /* **************************************************** */ SCALAR CHECKRTS; CHECKRTS=CRS+NIRS+VRS; ABORT $(CHECKRTS > 1 OR CHECKRTS = 0) "ABORT, None or More Than One Ref.Tech Specified"; /* **************************************************** */ /* AUTO SCALING. */ /* **************************************************** */ IF (AUTOSCAL > 0, /* Here omitted */ ); /* **************************************************** */ /* Data Listning. */ /* **************************************************** */ PUT f2; IF ( (DATAPRT GT 0), PUT " ---- Listning of Data on Inputs and on the Outputs from xxxx ---"///; LOOP(IO1 $(ORD(IO1) <=100), PUT @(9*(ORD(IO1)-1)+10), IO1.TL:>8:0; ); PUT //; LOOP(SUBUNITS1, PUT @1, SUBUNITS1.TL:>4:0; LOOP(IO1 $(ORD(IO1) <=100), PUT @(9*(ORD(IO1)-1)+10), IOACT(SUBUNITS1,IO1):8:2; ); PUT /; ); ); VARIABLES PREFFIC Efficiency Score (Primal DEA) REFTECH Reference Technology (Primal DEA) DUEFFIC Efficiency Score (Dual DEA) ; POSITIVE VARIABLES WEIGHT(UNITS) Weghts in Envelopm. form. (Primal DEA) THETA Radial Constaction Factor (Primal DEA) S(UNITS) Slacks (Dual DEA) PRICE(IO1) Virtual Multipliers (Dual DEA) ; /* **************************************************** */ /* PRIMAL DEA: */ /* **************************************************** */ EQUATIONS OBJPRIMAL Objective Function (Primal DEA) PRCONSTR1(IO1,UNITS) Constr. for each input (Primal DEA) PRCONSTR2(IO2,UNITS) Constr. for each output (Primal DEA) PRREFTCRS Reference Technology (CRS Primal DEA) PRREFTNIRS Reference Technology (NIRS Primal DEA) PRREFTVRS Reference Technology (VRS Primal DEA) /* **************************************************** */ /* DUAL DEA: */ /* **************************************************** */ OBJDUAL (UNITS) Objective Function (Dual DEA) DUCONSTR(UNITS) Constraint for Each Unit (Dual DEA) DUNORM (UNITS) Normalized input prices (Dual DEA) DUREFTCRS Reference Technology (CRS Dual DEA) DUREFTNIRS Reference Technology (NIRS Dual DEA) DUREFTVRS Reference Technology (VRS Dual DEA) UBOUND(IO1) Upper Bounds on Virtual Multipliers (Assurance Region DEA) LBOUND(IO1) lower Bounds on Virtual Multipliers (Assurance Region DEA) ; /* **************************************************** */ /* OBJECTIVE FUNCTIONS: */ /* **************************************************** */ OBJPRIMAL.. PREFFIC =E= THETA; OBJDUAL(ACTUNIT).. SUM( OUTPUT1, IOACT(ACTUNIT,OUTPUT1)*PRICE(OUTPUT1) ) =E= DUEFFIC; /* **************************************************** */ /* MAIN CONSTRAINTS: */ /* **************************************************** */ PRCONSTR1(INPUT1,ACTUNIT).. SUM( SUBUNITS, IOACT(SUBUNITS,INPUT1)* WEIGHT(SUBUNITS) ) - THETA * IOACT(ACTUNIT,INPUT1) =L= 0; PRCONSTR2(OUTPUT1,ACTUNIT).. SUM( SUBUNITS, IOACT(SUBUNITS,OUTPUT1)* WEIGHT(SUBUNITS) ) - IOACT(ACTUNIT,OUTPUT1) =G= 0; DUCONSTR(SUBUNITS).. SUM( OUTPUT1, IOACT(SUBUNITS,OUTPUT1)*PRICE(OUTPUT1)) - SUM( INPUT1, IOACT(SUBUNITS,INPUT1)*PRICE(INPUT1) )+REFTECH+S(SUBUNITS) =E= 0; DUNORM(ACTUNIT).. SUM( INPUT1, IOACT(ACTUNIT,INPUT1)*PRICE(INPUT1) )=E= 1; /* **************************************************** */ /* REFERENCE TECHNOLOGY: */ /* **************************************************** */ PRREFTCRS $(CRS=1).. SUM( SUBUNITS, WEIGHT(SUBUNITS) ) =G= 0; /* CRS */ PRREFTNIRS $(NIRS=1).. SUM( SUBUNITS, WEIGHT(SUBUNITS) ) =L= 1; /* NIRS*/ PRREFTVRS $(VRS=1).. SUM( SUBUNITS, WEIGHT(SUBUNITS) ) =E= 1; /* VRS */ DUREFTCRS $(CRS=1).. REFTECH =E= 0; /* CRS */ DUREFTNIRS $(NIRS=1).. REFTECH =G= 0; /* NIRS*/ DUREFTVRS $(VRS=1).. REFTECH =G= -1000000; /* VRS */ /* **************************************************** */ /* ASSURANCE REGIONS: BOUNDS ON VIRTUAL MULTIPLIERS: */ /* **************************************************** */ PARAMETERS RELPRICE(OUTPUT1) /2 2,3 1/; SCALAR UKONF /0.1/ LKONF /0.1/ FINISH / 0/ TAL ; UBOUND(OUTPUT1)$(ORD(OUTPUT1) LT CARD(OUTPUT1)).. PRICE(OUTPUT1)*RELPRICE(OUTPUT1+1) =L= PRICE(OUTPUT1+1)*(1+UKONF)*RELPRICE(OUTPUT1); LBOUND(OUTPUT1)$(ORD(OUTPUT1) LT CARD(OUTPUT1)).. PRICE(OUTPUT1)*RELPRICE(OUTPUT1+1) =G= PRICE(OUTPUT1+1)*(1-LKONF)*RELPRICE(OUTPUT1); /* **************************************************** */ /* REPORT PARAMETERS: */ /* **************************************************** */ SET ADHOC / 1*100/ ; PARAMETER EFFSCORE (UNITS ) Report of Efficiency Scores REFTECHR (UNITS ) Report of Reference Technology OPTSLAC (UNITS,UNITS ) Report of Slacks OPTPRICE (UNITS,IO1 ) Report of Virtual Multipliers OPTWEIGT (UNITS,UNITS) Report of Optimal Weights MSTAT (ADHOC,UNITS) Report of Model Status ; /* **************************************************** */ /* MODELS: */ /* **************************************************** */ MODEL PRIMALDEA / OBJPRIMAL, PRCONSTR1, PRCONSTR2, PRREFTCRS, PRREFTNIRS, PRREFTVRS /; MODEL DUALDEA / OBJDUAL, DUCONSTR, DUNORM, DUREFTCRS, DUREFTNIRS, DUREFTVRS /; MODEL ASSURDEA / OBJDUAL, DUCONSTR, DUNORM, DUREFTCRS, DUREFTNIRS, DUREFTVRS, UBOUND, LBOUND /; DUALDEA.OPTFILE=1; PRIMALDEA.OPTFILE=1; /* FILE 3: SOLVEDEA PROGRAM. */ /* **************************************************** */ /* SOLVEDEA - module (solvedea.blk): */ /* **************************************************** */ IF (SOLVEDEA, PUT f1; PUTPAGE f1; PUT //; IF(CRS, PUT " --- TABLE OF EFFICIENCYSCORES: Reference Technology:CRS ----" /; ); IF(NIRS,PUT " -- TABLE OF EFFICIENCYSCORES: Reference Technology:NIRS ----" /; ); IF(VRS, PUT " -- TABLE OF EFFICIENCYSCORES: Reference Technology:VRS ----" /; ); PUT " Data from xxx, 19xx "//; TAL=1; DISPLAY SUBUNITS; LOOP(LUNITS1 $(ORD(LUNITS1) >= FDMU AND ORD(LUNITS1) <= LDMU), ACTUNIT(UNITS)=NO; ACTUNIT(LUNITS1) = YES; /* **************************************************** */ /* PRIMAL BLOCK: */ /* **************************************************** */ IF (PRIMAL, SOLVE PRIMALDEA MINIMIZING PREFFIC USING LP; EFFSCORE(LUNITS1) = PREFFIC.L; REFTECHR(LUNITS1)=(PRREFTCRS.M) $(CRS=1)+(PRREFTNIRS.M)$(NIRS=1)+(PRREFTVRS.M)$(VRS=1); OPTWEIGT (LUNITS1,UNITS) = WEIGHT.L(UNITS); OPTPRICE(LUNITS1,INPUT1) = SUM(ACTUNIT,PRCONSTR1.M(INPUT1,ACTUNIT)); OPTPRICE(LUNITS1,OUTPUT1) = SUM(ACTUNIT,PRCONSTR2.M(OUTPUT1,ACTUNIT)); MSTAT('1',LUNITS1)=PRIMALDEA.MODELSTAT; MSTAT('2',LUNITS1)=PRIMALDEA.SOLVESTAT; MSTAT('3',LUNITS1)=PRIMALDEA.NUMINFES; MSTAT('4',LUNITS1)=PRIMALDEA.NUMNOPT; ); /* **************************************************** */ /* DUAL BLOCK: */ /* **************************************************** */ IF (DUAL, SOLVE DUALDEA MAXIMIZING DUEFFIC USING NLP; EFFSCORE(LUNITS1) = DUEFFIC.L; REFTECHR(LUNITS1) = REFTECH.L; OPTWEIGT(LUNITS1,UNITS) = DUCONSTR.M(UNITS); OPTPRICE(LUNITS1,IO1) = PRICE.L(IO1); MSTAT('1',LUNITS1) = DUALDEA.MODELSTAT; MSTAT('2',LUNITS1) = DUALDEA.SOLVESTAT; MSTAT('3',LUNITS1) = DUALDEA.NUMINFES; MSTAT('4',LUNITS1) = DUALDEA.NUMNOPT; ); PUT f1; PUT / @2, "Mdl Stat:" PUT / @8,MSTAT('1',LUNITS1); PUT / @8,MSTAT('2',LUNITS1); PUT / @8,MSTAT('3',LUNITS1); PUT / @8,MSTAT('4',LUNITS1); PUT / @2,"Unit: "; PUT @8,LUNITS1.TL:<4:0; PUT @20,"Score: "; PUT @27,EFFSCORE(LUNITS1):<10:5; PUT @50,"Ref.Tech:"; PUT @60,REFTECHR(LUNITS1):<10:5 /; PUT @2,"Weights:"/; TAL=1; LOOP(LUNITS2, PUT $(OPTWEIGT(LUNITS1,LUNITS2) GT 0.001) @(15*MOD(TAL-1,5)+2), LUNITS2.TL:>4:0; PUT $(OPTWEIGT(LUNITS1,LUNITS2) GT 0.001) @(15*MOD(TAL-1,5)+6),":"; PUT $(OPTWEIGT(LUNITS1,LUNITS2) GT 0.001) @(15*MOD(TAL-1,5)+7), OPTWEIGT(LUNITS1,LUNITS2):<7:2; PUT $(MOD(TAL,5) EQ 0 AND OPTWEIGT(LUNITS1,LUNITS2) GT 0.001) /; TAL $(OPTWEIGT(LUNITS1,LUNITS2) GT 0.001) = TAL+1; ); PUT / @2,"Prices:"/; TAL=1; LOOP(INPUT1, PUT @(20*MOD(TAL-1,4)+2),INPUT1.TL:>4:0; PUT @(20*MOD(TAL-1,4)+6), ":"; PUT @(20*MOD(TAL-1,4)+7),OPTPRICE(LUNITS1,INPUT1):<12:8; PUT $(MOD(TAL,4) EQ 0) /; TAL = TAL+1; ); LOOP(OUTPUT1, PUT @(20*MOD(TAL-1,4)+2),OUTPUT1.TL:>4:0; PUT @(20*MOD(TAL-1,4)+6),":"; PUT @(20*MOD(TAL-1,4)+7),OPTPRICE(LUNITS1,OUTPUT1):<12:8; PUT $(MOD(TAL,4) EQ 0) /; TAL = TAL+1; ); ); /* ENDLOOP LOOP(LUNITS1 $(ORD(LUNITS1) >= FDMU AND .... */ ); /* ENDIF SOLVEDEA */ /*FILE 4: DATA (here a very simple example of a data file).*/ /* TABLE IOACT(UNITS,IO1) iodata from 20 DMUs 0 1 2 3 1 1 1.5 3 4 2 2.5 2 7 3.5 3 0.5 1 4.5 0.5 ; */