int nbDMU=...;
int refDMU=...; // We want to measure efficiency of that DMU
int nbInputs= ...;
int nbOutputs=...;
// Ranges
range DMU=1..nbDMU;
range Input=1..nbInputs;
range Output=1..nbOutputs;
// Parameters
float X[DMU][Input] = ...; // valores dos inputs compartilhados do estagio k no periodo t
float Y[DMU][Output] = ...;//valores das saídas do estagio do estagio k no periodo t
assert refDMU in DMU;
// Variables
dvar float+ v[Input];
dvar float+ u[Output];
minimize v[1]*X[refDMU][1]+ v[2]*X[refDMU][2];
subject to{
//restricao linear
CtLinear:u[1]*Y[refDMU][1] + u[2]*Y[refDMU][2]+ u[3]*Y[refDMU][3] == 1;
forall(n in DMU) //restricao inputs
CtSystem:sum(j in Output) (u[j]* Y[n][j]) - sum(i in Input)(v[i] * X[n][i]) <= 0;
forall (i in Input)
CtNonnegativeinput: v[i]>=0;
forall (j in Output)
CtNonnegativeoutput: u[j]>=0;
}
main
{
thisOplModel.generate();
for(var dmu in thisOplModel.DMU)
{
writeln("DMU",dmu);
for(var j in thisOplModel.Input)cplex.setObjCoef(thisOplModel.v[j],thisOplModel.X[dmu][j]);
for(var i in thisOplModel.Output) thisOplModel.CtLinear.setCoef(thisOplModel.u[i],thisOplModel.Y[dmu][i]);
cplex.solve();
writeln("v", thisOplModel.v);
writeln("u", thisOplModel.u);
writeln("Solution value = " + cplex.getObjValue());
thisOplModel.postProcess();
}
}
------------------------------
Livia Torres
------------------------------
Original Message:
Sent: Mon February 21, 2022 04:07 AM
From: ALEX FLEISCHER
Subject: Re: Data Envelopment Analysis (DEA) in OPL
Hi,
first, I would rewrite your constraint into
CtLinear: (u[1]*Y[refDMU][1])+(u[2]*Y[refDMU][2])+(u[3]*Y[refDMU][3]) ==1;
because if you have a sum you won t be able to use setCoef
and then in the flow control
for(var j in thisOplModel.Output) thisOplModel.CtLinear.setCoef(thisOplModel.u[j],thisOplModel.Y[dmu][j]);
since ctLinear is not an array but a constraint.
So what works fine:
.mod
int nbDMU=...;int refDMU=...; // We want to measure efficiency of that DMUint nbInputs= ...;int nbOutputs=...;// Rangesrange DMU=1..nbDMU;range Input=1..nbInputs;range Output=1..nbOutputs;// Parametersfloat X[DMU][Input] = ...; // valores dos inputs compartilhados do estagio k no periodo tfloat Y[DMU][Output] = ...;//valores das saídas do estagio do estagio k no periodo tassert refDMU in DMU;// Variablesdvar float+ v[Input];dvar float+ u[Output];dexpr float eff = sum(i in Input) (v[i] * X[refDMU][i]);minimize eff ;subject to{//restricao linearCtLinear: (u[1]*Y[refDMU][1])+(u[2]*Y[refDMU][2])+(u[3]*Y[refDMU][3]) ==1;forall(n in DMU) //restricao inputs compartilhadosCtSistema:sum(j in Output) (u[j]* Y[n][j]) - sum(i in Input)(v[i] * X[n][i])<= 0;forall (i in Input)CtNaonegatividadeInput: v[i]>=0;forall (j in Output)CtNaonegatividadeOutput: u[j]>=0;}execute{writeln("efficiency ",eff);writeln("v=",v);writeln("u=",u);writeln();}main{thisOplModel.generate();for(var dmu in thisOplModel.DMU){writeln("DMU",dmu);for(var j in thisOplModel.Output) thisOplModel.CtLinear.setCoef(thisOplModel.u[j],thisOplModel.Y[dmu][j]);cplex.solve();thisOplModel.postProcess();}}
.dat
nbDMU=3; refDMU=1; nbInputs=2; nbOutputs=3; X=[[5 14][8 15][7 12]]; Y=[[9 4 16][5 7 10][4 9 13]];
PS:
Many other examples in Model Building
------------------------------
[Alex] [Fleischer]
[EMEA CPLEX Optimization Technical Sales]
[IBM]
Original Message:
Sent: Thu February 17, 2022 08:55 PM
From: Livia Torres
Subject: Re: Data Envelopment Analysis (DEA) in OPL
Dear Mister Fleischer,
i read the example and tried to develop a new loop for the DEA primal model. But it does not work.
Could you help me please??
int nbDMU=...;
int refDMU=...; // We want to measure efficiency of that DMU
int nbInputs= ...;
int nbOutputs=...;
// Ranges
range DMU=1..nbDMU;
range Input=1..nbInputs;
range Output=1..nbOutputs;
// Parameters
float X[DMU][Input] = ...; // valores dos inputs compartilhados do estagio k no periodo t
float Y[DMU][Output] = ...;//valores das saídas do estagio do estagio k no periodo t
assert refDMU in DMU;
// Variables
dvar float+ v[Input];
dvar float+ u[Output];
dexpr float eff = sum(i in Input) (v[i] * X[refDMU][i]);
minimize eff ;
subject to{
//restricao linear
CtLinear:sum(j in Output) (u[j]*Y[refDMU][j]) == 1;
forall(n in DMU) //restricao inputs compartilhados
CtSistema:sum(j in Output) (u[j]* Y[n][j]) - sum(i in Input)(v[i] * X[n][i])<= 0;
forall (i in Input)
CtNaonegatividadeInput: v[i]>=0;
forall (j in Output)
CtNaonegatividadeOutput: u[j]>=0;
}
execute
{
writeln("efficiency ",eff);
writeln("v=",v);
writeln("u=",u);
writeln();
}
main{
thisOplModel.generate();
for(var dmu in thisOplModel.DMU)
{
writeln("DMU",dmu);
for(var j in thisOplModel.Output) thisOplModel.CtLinear[j].setCoef(thisOplModel.u[j],thisOplModel.Y[dmu][j]);
cplex.solve();
thisOplModel.postProcess();
}
}
------------------------------
Livia Torres
Original Message:
Sent: Thu February 17, 2022 08:55 PM
From: ALEX FLEISCHER
Subject: Re: Data Envelopment Analysis (DEA) in OPL
Hi,
you could have a look at the loop example from https://www.ibm.com/developerworks/community/forums/html/topic?id=e8342572-6dc5-4885-ae55-e154e8d37773&ps=25
which belongs to https://www.linkedin.com/pulse/making-decision-optimization-simple-alex-fleischer/
regards
#DecisionOptimization