欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

准备数学建模 23 - 数据包络分析

最编程 2024-04-19 21:07:23
...

一、数据包络分析

1-基本理论与相关定义

1978年A.Charnes,W.W.Cooper和ERhodes给出了评价多个决策单元(DMU)相对有效性的数据包络分析方法(DEA)。

目前,数据包络分析是评价具有多指标输入和多指标输出系统较为有效的方法。

我们看下面的例子14.4的相对有效评价问题,根据输入指标和输出指标,评价哪些学校是相对有效的。

 如果简单分析的话,明显学校的两项输出都是最高,但是学校C的两项输入也最高,所以怎么评价哪些学校是相对有效的呢?

下面是该模型的基本理论知识,具体如下:

 通过定义输入输出向量和投入产出权值向量,得到如下模型:其中效率指数即输出除以输入;约束条件是效率小于等于1,权值大于等于0

 通过等价变换,可以将模型变成线性规划问题,具体如下:新的决策变量变成了w和u。

 对于上述模型,有如下定义:

 从上面的定义可以看出,所谓的DEA有效,就是指那些评价对象,它们的投入产出比达到最大。因此,可以用DEA模型对评价对象进行评价。

2-MATLAB编程实现1

 对于这个例子14.4,共6个评价对象,每个评价对象有两个输入指标变量,两个输出指标变量,下面我们

MATLAB求解代码如下所示,这个需要R2021b及以上版本的MATLAB才行:

clear; clc
m = 2 ;
n = 6 ;
d = [89.39, 86.25, 108.13, 106.38, 62.4, 47.19;
     64.3, 99, 99.6, 96, 96.2, 79.9;
     25.2, 28.2, 29.4, 26.4, 27.2, 25.2;
     223, 287, 317, 291, 295, 222] ;
a = d([1,2],:)' ;
b = d([3,4],:)' ;

prob = optimproblem("ObjectiveSense",'max') ;
u = optimvar('u',m,'LowerBound',0) ;
v = optimvar('v',m,'LowerBound',0) ;
prob.Constraints.con1 = a*u >= b*v ;

for j = 1 : n 
    fprintf('第%d个学校的计算结果如下:\n', j) ;
    prob.Objective = b(j,:) * v ;
    prob.Constraints.con2 = a(j,:) * u == 1 ;
    [sol, fval] = solve(prob) ;
    su = sol.u ;
    sv = sol.v ;
    disp(fval) ;
end

3-数据包络分析案例及MATLAB编程实现

数据包络分析用于评价决策单元的相对有效性,是根据多投入和多指标产出对相同类型的部分进行相对有效性进行评价的系统分析方法。DEA具有很强的客观性。

 我们看一下下面的例子14.5,使用DEA方法对天津市的可持续发展进行评价。

我们定义前三个指标为输入,后两个指标为输出,如下:

采用数据包络分析计算的最优目标值如下:

对于上述评价问题,给出的MATLAB程序如下所示:
 

clear; clc
m = 3 ;
n = 10 ;
s = 2 ;
d = [14.4, 0.65, 31.3, 3621, 0.00;
    16.9, 0.72, 32.2, 39.43, 0.09;
    15.53, 0.72, 31.87, 4086.67, 0.07;
    15.4, 0.67, 32.23, 4904.67, 0.13;
    14.17, 0.76, 32.4, 6311.67, 0.37;
    13.33, 0.69, 30.77, 8173.33, 0.59;
    12.83, 0.61, 29.23, 10236, 0.51;
    13, 0.63, 28.2, 12094.33, 0.44;
    13.4, 0.75, 28.8, 13603.33, 0.58;
    14, 0.84, 29.1, 14841, 1] ;
 
a = d(:,1:3) ;
b = d(:,[4,5]) ;


prob=optimproblem('ObjectiveSense','max');
u = optimvar('u',m,'LowerBound',0) ;
v = optimvar('v',s,'LowerBound',0) ;
prob.Constraints.con1 = a*u >= b*v ;
for j = 1 : n 
    fprintf('第%d年的计算结果如下:\n',j+1989) ;
    prob.Objective = b(j,:) * v ;
    prob.Constraints.con2 = a(j,:) * u == 1 ;
    [sol, fval] = solve(prob) ;
    su = sol.u ;
    sv = sol.v ;
    disp(fval) ;
end

最后做个总结吧:数据包络分析适用于处理多目标决策类问题,通过比较决策单元的相对效率对决策单元进行评价,适用于具有多输入和多输出的复杂系统,无需假设任何权重,不必确定输入和输出的显示关系。