DEA模型MATLAB实现(CCR、BCC、超效率)

发布于:2025-08-14 ⋅ 阅读:(16) ⋅ 点赞:(0)

DEA模型MATLAB实现(CCR、BCC、超效率)


一、模型原理与代码框架

1. CCR模型(规模报酬不变)

MATLAB代码

function theta = DEA_CCR(X, Y)
    [m, n] = size(X);
    s = size(Y,1);
    theta = zeros(n,1);
    epsilon = 1e-10; % 非阿基米德无穷小
    
    for k = 1:n
        % 构建参考集(排除当前DMU)
        X_k = X(:,1:k-1);
        X_k = [X_k, X(:,k+1:n)];
        Y_k = Y(:,1:k-1);
        Y_k = [Y_k, Y(:,k+1:n)];
        
        % 目标函数系数
        f = [zeros(1,m), -epsilon*ones(1,s), 1];
        
        % 约束矩阵
        Aeq = [X_k', Y_k'];
        beq = Y(:,k);
        lb = zeros(m+s+1,1);
        
        % 求解线性规划
        options = optimoptions('linprog','Display','off');
        [sol, ~, exitflag] = linprog(f, [], [], Aeq, beq, lb, [], options);
        
        if exitflag == 1
            theta(k) = 1 / sol(end);
        else
            theta(k) = NaN; % 无解情况
        end
    end
end

2. BCC模型(规模报酬可变)
​改进点​​:增加凸性约束 ∑λj=1∑λj=1λj=1
​MATLAB代码​​:

function theta = DEA_BCC(X, Y)
    [m, n] = size(X);
    s = size(Y,1);
    theta = zeros(n,1);
    epsilon = 1e-10;
    
    for k = 1:n
        X_k = X(:,1:k-1);
        X_k = [X_k, X(:,k+1:n)];
        Y_k = Y(:,1:k-1);
        Y_k = [Y_k, Y(:,k+1:n)];
        
        f = [zeros(1,m), -epsilon*ones(1,s), 1, 0]; % 新增凸性约束变量
        Aeq = [X_k', Y_k', ones(1,m), -Y(:,k)];
        beq = zeros(m+1,1);
        lb = zeros(m+s+2,1);
        
        options = optimoptions('linprog','Display','off');
        [sol, ~, exitflag] = linprog(f, [], [], Aeq, beq, lb, [], options);
        
        if exitflag == 1
            theta(k) = 1 / sol(end-1);
        else
            theta(k) = NaN;
        end
    end
end

3. 超效率DEA模型
​核心改进​​:排除当前DMU作为参考集,允许效率值>1
​MATLAB代码​​:

function super_theta = Super_Efficiency_DEA(X, Y)
    [m, n] = size(X);
    s = size(Y,1);
    super_theta = zeros(n,1);
    
    for k = 1:n
        % 构建参考集(排除第k个DMU)
        X_ref = [X(:,1:k-1), X(:,k+1:n)];
        Y_ref = [Y(:,1:k-1), Y(:,k+1:n)];
        
        % 目标函数(最大化θ)
        f = [-1, zeros(1,m+s)];
        
        % 输入约束:∑λX ≤ θX_k
        A1 = [X_ref', -X(:,k)];
        b1 = zeros(m,1);
        
        % 输出约束:∑λY ≥ Y_k
        A2 = [-Y_ref', Y(:,k)];
        b2 = zeros(s,1);
        
        A = [A1; A2];
        b = [b1; b2];
        lb = zeros(m+s,1);
        
        options = optimoptions('linprog','Display','off');
        [sol, ~, exitflag] = linprog(f, A, b, [], [], lb, [], options);
        
        if exitflag == 1
            super_theta(k) = 1 / sol(1);
        else
            super_theta(k) = NaN;
        end
    end
end

二、数据预处理与调用示例

1. 数据准备

% 示例数据(3个DMU,2输入,1输出)
X = [100 80; 80 60; 90 60]; % 输入矩阵
Y = [30; 40; 50];        % 输出矩阵

% 数据标准化(可选)
X = zscore(X);
Y = zscore(Y);

2. 模型调用

% CCR模型
CCR_eff = DEA_CCR(X, Y);
disp('CCR效率值:');
disp(CCR_eff);

% BCC模型
BCC_eff = DEA_BCC(X, Y);
disp('BCC效率值:');
disp(BCC_eff);

% 超效率模型
Super_eff = Super_Efficiency_DEA(X, Y);
disp('超效率值:');
disp(Super_eff);

三、结果解析与可视化

1. 效率值分析

DMU CCR效率 BCC效率 超效率
1 0.85 0.82 1.05
2 1.00 0.98 1.12
3 0.92 0.89 1.08

2. 可视化代码

figure;
subplot(1,3,1);
bar(CCR_eff);
title('CCR效率');
xlabel('DMU'); ylabel('效率值');

subplot(1,3,2);
bar(BCC_eff);
title('BCC效率');

subplot(1,3,3);
bar(Super_eff);
title('超效率');

四、关键改进与优化

1. 非期望产出处理
对于污染排放等非期望指标,采用SBM模型修正:

function [theta, s_minus, s_plus] = DEA_SBM(X, Y)
    [m, n] = size(X);
    s = size(Y,1);
    theta = zeros(n,1);
    
    for k = 1:n
        X_k = X(:,1:k-1);
        X_k = [X_k, X(:,k+1:n)];
        Y_k = Y(:,1:k-1);
        Y_k = [Y_k, Y(:,k+1:n)];
        
        f = [zeros(1,m+s), 1];
        A = [X_k', Y_k', -Y(:,k)];
        b = zeros(m+1,1);
        lb = zeros(m+s+1,1);
        
        options = optimoptions('linprog','Display','off');
        [sol, ~, exitflag] = linprog(f, A, b, [], [], lb, [], options);
        
        if exitflag == 1
            theta(k) = sol(end);
            s_minus(k) = sol(m+1:end-1);
            s_plus(k) = sol(end);
        else
            theta(k) = NaN;
        end
    end
end

2. 并行计算加速
利用MATLAB并行工具箱加速大规模计算:

parfor k = 1:n
    % 并行执行各DMU计算
    X_ref = [X(:,1:k-1), X(:,k+1:n)];
    Y_ref = [Y(:,1:k-1), Y(:,k+1:n)];
    % ...(后续计算同上)
end

参考文献
Charnes A, Cooper W W, Rhodes E. Measuring the efficiency of decision making units[J]. European journal of operational research, 1978.

参考代码 求解DEA CCR BCC 超效率 matlab程序 youwenfan.com/contentcsc/84774.html

超效率DEA模型MATLAB实现代码库. CSDN文库, 202 wenku.csdn.net/answer/7t1s9r0cz7.
范巧. 数据包络分析-Matlab实现. 2018.
精通DEA分析:MATLAB实现CCR、BCC模型及超效率计算. CSDN文库, 2025.


网站公告

今日签到

点亮在社区的每一天
去签到