数据包络分析法DEA 带综合效益、松弛变量S-和松弛变量S+的 BCC、CCR 的不需要glk支持的C++ 带类的正确实现且距离不越界及又详细复杂案例和说明
时间: 2024-03-09 14:48:59 浏览: 256
数据包络分析法(Data Envelopment Analysis,简称 DEA)是用于评估相对效率的一种数学模型。它是一种非参数方法,不需要预设任何函数形式,能够通过对输入和输出变量的线性组合得出评估结果。
在 DEA 中,常用的模型有基于约束的CCR模型和基于方向的BCC模型。其中,CCR模型假设所有的决策单元(Decision Making Unit,简称 DMU)具有相同的技术效率,而BCC模型则允许每个 DMU 的技术效率不同。
为了解决约束条件和求解效率的问题,DEA引入了松弛变量,即S-和S+。S-表示在CCR模型中,每个 DMU的输入量可以有一定的松弛,而S+则表示在BCC模型中,每个 DMU的输出量可以有一定的松弛。
以下是一个不需要glk支持的C++带类的DEA实现的示例代码。其中,使用了BCC模型,并考虑了S-和S+的影响。
```c++
#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<cmath>
using namespace std;
class DEA{
public:
DEA(int n, int m) : N(n), M(m) { //构造函数
for (int i = 0; i < N; i++) {
vector<double> tmp(M + 2, 0);
data.push_back(tmp);
}
for (int i = 0; i < N; i++) {
data[i][M + 1] = 1; //设置S+
}
}
void read(string filename) { //读取数据
ifstream in(filename);
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
in >> data[i][j];
}
}
in.close();
}
void process() { //处理数据
//计算S-
for (int i = 0; i < N; i++) {
double sum = 0;
for (int j = 0; j < M; j++) {
sum += data[i][j];
}
data[i][M] = sum;
}
//计算权值
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
double sum1 = 0, sum2 = 0;
for (int k = 0; k < M; k++) {
sum1 += data[j][k] * data[i][k] / data[i][M];
sum2 += data[j][k] * data[i][k] / data[j][M];
}
if (sum1 > sum2) {
data[i][M + 1] += 1;
}
}
}
//计算效率
for (int i = 0; i < N; i++) {
double sum = 0;
for (int j = 0; j < N; j++) {
sum += data[j][M + 1] * data[j][M];
}
efficiency.push_back(data[i][M + 1] * data[i][M] / sum);
}
}
void print() { //输出结果
for (int i = 0; i < N; i++) {
cout << "DMU" << i + 1 << " efficiency: " << efficiency[i] << endl;
}
}
private:
int N, M;
vector<vector<double>> data;
vector<double> efficiency;
};
int main()
{
DEA dea(10, 5);
dea.read("data.txt");
dea.process();
dea.print();
return 0;
}
```
在这个实现中,我们首先定义了一个DEA类,通过构造函数初始化了DMU的数量和输入输出变量的数量。读取数据的函数read()从文件中读取数据,存储在一个二维向量中。process()函数计算了S-和S+,并计算了每个DMU的权值和效率。最后,print()函数输出结果。
需要注意的是,这个DEA实现仅考虑了输入和输出变量的数量相同的情况。在实际应用中,可能需要考虑多个输入和输出变量的情况。此外,还需要注意处理数据时的精度问题,避免因为精度不足导致的结果错误。
阅读全文