终端信息:
PS D:\DEA_code> gcc model3_test.c -o model3_test -IC:\msys64\mingw64\include -LC:\msys64\mingw64\lib -l:libglpk.a -lz -static -lm
PS D:\DEA_code> .\model3_test
PS D:\DEA_code> .\model3_test
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <glpk.h>
#define MAX_LINE_LEN 1024
typedef struct
{
int year;
char securities_code[20];
double financial_expense; // 阶段一投入1
double dividend; // 阶段一投入2
double operating_cost; // 阶段二投入1
double total_asset; // 阶段二投入2
double employee; // 阶段二投入3
double total_profit; // 最终产出1
double operating_income; // 最终产出2
double non_current_liabilities; // 中间变量1
double paid_in_capital; // 中间变量2
} DMU;
DMU *read_csv(const char *filename, int *count)
{
// ...(保持原有读取逻辑不变,但确保字段顺序与Python数据一致)...
}
double calculate_efficiency(DMU *dmus, int num_dmus, int target_idx)
{
DMU *target = &dmus[target_idx];
glp_prob *lp = glp_create_prob();
glp_set_obj_dir(lp, GLP_MAX);
// ================== 定义变量 ==================
// 变量总数 = v1(2) + v2(3) + w(2) + u(2) = 9
glp_add_cols(lp, 9); // 列索引1-9
// 设置变量下界
for (int i = 1; i <= 9; i++)
{
glp_set_col_bnds(lp, i, GLP_LO, 1e-4, 0.0);
}
// ================== 目标函数 ==================
// u0 (最终产出1) -> 列8, u1 (最终产出2) -> 列9
glp_set_obj_coef(lp, 8, target->operating_income);
glp_set_obj_coef(lp, 9, target->total_profit);
// ================== 约束条件 ==================
int row_count = 0;
// 约束1: 阶段一投入归一化 (v1_0*financial_expense + v1_1*dividend = 0.5)
row_count++;
glp_add_rows(lp, 1);
glp_set_row_bnds(lp, row_count, GLP_FX, 0.5, 0.5);
{
int ind[] = {0, 1, 2}; // v1对应列1-2
double val[] = {0.0,
target->financial_expense,
target->dividend};
glp_set_mat_row(lp, row_count, 2, ind, val);
}
// 约束2: 阶段二投入归一化 (v2_0*operating_cost + v2_1*total_asset + v2_2*employee = 0.5)
row_count++;
glp_add_rows(lp, 1);
glp_set_row_bnds(lp, row_count, GLP_FX, 0.5, 0.5);
{
int ind[] = {0, 3, 4, 5}; // v2对应列3-5
double val[] = {0.0,
target->operating_cost,
target->total_asset,
target->employee};
glp_set_mat_row(lp, row_count, 3, ind, val);
}
// 约束3: 所有DMU的约束
for (int j = 0; j < num_dmus; j++)
{
DMU *dmu = &dmus[j];
// 第一阶段约束: v1*x1 >= w*z
row_count++;
glp_add_rows(lp, 1);
glp_set_row_bnds(lp, row_count, GLP_LO, 0.0, 0.0);
{
int ind[] = {0, 1, 2, 6, 7}; // v1(1-2), w(6-7)
double val[] = {
0.0,
dmu->financial_expense, // v1_0*x1_0
dmu->dividend, // v1_1*x1_1
-dmu->non_current_liabilities, // -w_0*z_0
-dmu->paid_in_capital // -w_1*z_1
};
glp_set_mat_row(lp, row_count, 4, ind, val);
}
// 第二阶段约束: v2*x2 + w*z >= u*y
row_count++;
glp_add_rows(lp, 1);
glp_set_row_bnds(lp, row_count, GLP_LO, 0.0, 0.0);
{
int ind[] = {0, 3, 4, 5, 6, 7, 8, 9}; // v2(3-5), w(6-7), u(8-9)
double val[] = {
0.0,
dmu->operating_cost, // v2_0*x2_0
dmu->total_asset, // v2_1*x2_1
dmu->employee, // v2_2*x2_2
dmu->non_current_liabilities, // w_0*z_0
dmu->paid_in_capital, // w_1*z_1
-dmu->operating_income, // -u0*y0
-dmu->total_profit // -u1*y1
};
glp_set_mat_row(lp, row_count, 7, ind, val);
}
}
// ================== 求解 ==================
glp_simplex(lp, NULL);
double eff = glp_get_obj_val(lp);
glp_delete_prob(lp);
return eff;
}
int main()
{
int num_dmus;
DMU *dmus = read_csv("./Data_2023.12.20_1.csv", &num_dmus);
if (!dmus)
return 1;
FILE *fp = fopen("output_model3.csv", "w");
if (!fp)
{
printf("文件打开失败\n");
free(dmus);
return 1;
}
for (int i = 0; i < num_dmus; i++)
{
double eff = calculate_efficiency(dmus, num_dmus, i);
printf("DMU %s (%d): Efficiency = %.4f\n",
dmus[i].securities_code, dmus[i].year, eff);
fprintf(fp, "%s,%d,%.4f\n",
dmus[i].securities_code, dmus[i].year, eff);
}
fclose(fp);
free(dmus);
return 0;
}