option randseed 1; param m := 5; # number of inputs param n := 5; # number of outputs param d := 125; # number of DMU's param a {1..d, 1..n}, default Uniform01(); param b {1..d, 1..m}, default Uniform01(); var y {1..m} >= 0; var x {1..n} >= 0; param k0 within {1..d}; maximize eff: sum{j in 1..n} a[k0,j]*x[j]; subject to one_sided {k in 1..d}: sum {j in 1..n} a[k,j]*x[j] <= sum {i in 1..m} b[k,i]*y[i]; subject to eq_one: sum{i in 1..m} b[k0,i]*y[i] = 1; param eff_flag {1..d}; let {k in 1..d} eff_flag[k] := 0; param drop_flag {1..d}; let {k in 1..d} drop_flag[k] := 0; param eff_k; for {k in 1..d} { let k0 := k; if eff_flag[k] == 1 then { let eff_k := 1; } else { solve; let eff_k := eff; } printf "%5d %10e \n", k, eff_k; for {kk in 1..d} { if abs(one_sided[kk].body) < 1.0e-8 && drop_flag[kk] == 0 then { let eff_flag[kk] := 1; } } if eff_k < 0.9999 then { drop one_sided[k]; let drop_flag[k] := 1; } # printf {kk in 1..d}: "%2d ", eff_flag [kk]; printf "\n"; # printf {kk in 1..d}: "%2d ", drop_flag[kk]; printf "\n"; }