1、目标规划序贯式算法
使用Lingo计算的通用程序:
model:
sets:
level/1..3/:p,z,goal;!p是优先因子,目标级别,z是中间变量,表示每一级目标的偏差和;
!goal需要每一轮输入,表示目标约束的最优偏差;
variable/1..2/:x;
h_con_num/1..1/:b;!硬约束不等式右边的向量;
s_con_num/1..4/:g,dplus,dminus;!g是软约束等式右边的向量,dplus和dminus是偏差变量;
h_con(h_con_num,variable):a;!硬约束的系数矩阵;
s_con(S_Con_Num,variable):c;!软约束的系数矩阵;
obj(level,s_con_num)/1 1,2 2,3 3,3 4/:wplus,wminus;!偏差变量的权重,双斜杠中间的数字是坐标位置,例如1 1表示下标为[1][1]位置的权重,没有1 2则是因为dplus(2)和dminus(2)不在第一级目标中,不需要对应的权重;
endsets
data:
ctr=?;!表示进行第几级目标计算;
goal=? ? 0;!输入值很大表示对应的约束不起作用,每计算一轮,对应的更新最优偏差;
b=12;
g=1500 0 16 15;
c=200 300 2 -1 4 0 0 5;
wplus=0 1 3 1;
wminus=1 1 3 0;
enddata
min = @sum(level:p*z);
p(ctr)=1;!ctr为输入的目标级别,为1则表示做第一级目标计算;
@for(level(i)|i#ne#ctr:p(i)=0);!表示其他级别的优先级P记为0,不做运算;
@for(level(i):z(i)=@sum(obj(i,j):wplus(i,j)*dplus(j)+wminus(i,j)*dminus(j)));!z(i)为第i级目标约束偏差;
@for(h_con_num(i):@sum(variable(j):a(i,j)*x(j))<b(i));!硬约束;
@for(s_con_num(i):@sum(variable(j):c(i,j)*x(j))+dminus(i)-dplus(i)=g(i));!软约束;
@for(level(i)|i #lt# @size(level):@bnd(0,z(i),goal(i)));!bnd函数表示替换约束条件,0<=z(i)<=goal(i),对应最优偏差是否起作用;
end
2、数据包络算法(DEA)
CCR模型判断方法:
CCR模型的Lingo实现
model:
sets:
dmu/1..6/:s,t,p; !决策单元;
inw/1..2/:w; !输入权重,即\omega;
outw/1..2/:u; !输出权重,即\miu;
inv(inw,dmu):x; !输入变量,投入指标;
outv(outw,dmu):y; !输入变量,产出指标;
endsets
data:
ctr=?;
x=89.39 86.25 108.13 106.38 62.40 47.19
64.3 99 99.6 96 96.2 79.9;
y=25.2 28.2 29.4 26.4 27.2 25.2
223 287 317 291 295 222;
enddata
max=@sum(dmu:p*t); !即某决策单元的效率;
p(ctr)=1;
@for(dmu(i)|i#ne#ctr:p(i)=0);
@for(dmu(j):
s(j)=@sum(inw(i):w(i)*x(i,j));
t(j)=@sum(outw(i):u(i)*y(i,j));
s(j)>t(j));
@sum(dmu:p*s)=1;
end
DEA相关参考资料:
1、Matlab:数据包络分析 (DEA)> 入门教程——详细解释DEA理论、CCR和BCC两种模型,含Matlab代码
2、数据包络分析(DEA)详解——DEA原理、两种模型介绍、Matlab&Python实现