数据包网络分析(C2R模型)
一、数据
14.40 0.65 31.30 3621.00 0.00
16.90 0.72 32.20 3943.00 0.09
15.53 0.72 31.87 4086.67 0.07
15.40 0.76 32.23 4904.67 0.13
14.17 0.76 32.40 6311.67 0.37
13.33 0.69 30.77 8173.33 0.59
12.83 0.61 29.23 10236.00 0.51
13.00 0.63 28.20 12094.33 0.44
13.40 0.75 28.80 13603.33 0.58
14.00 0.84 29.10 14841.00 1.00
其中设置前3列作为输入变量,后3列作为输出变量。
二、代码实现
#程序文件ex14_5.py
import numpy as np
import cvxpy as cp
d = np.loadtxt('data14_5.txt')
# a:代表所有行,0到3,b则代表所有行,从3开始到结尾
a = d[:,:3]; b = d[:,3:]
# cp.Variable是cvxpy中用于定义优化变量的函数。
# 3代表有3个元素,pos=True是一个关键字参数,指定这个变量是非负的。
# 也就是说,变量u中的每个元素都必须大于或等于0。
# v同理
u = cp.Variable(3, pos=True); v = cp.Variable(2, pos=True)
#计算相关参数
# j从0到9循环
for j in range(10):
# u是输入的线性权重
# 列表 con 因此会包含两个布尔值,
# 分别表示 a @ u 是否大于等于 b @ v,以及 a[j] @ u 是否等于1。
con = [ a @ u >= b @ v, a[j] @ u ==1]
# 目标函数是b[j] @ v,即第j个对象的价值,v是优化变量(输出变量)
obj = cp.Maximize(b[j]@v)
# prob:这是一个优化问题对象。
# .solve():这是prob对象的一个方法,用于求解优化问题。调用这个方法会启动求解过程,
# 并尝试找到满足所有约束条件且使目标函数达到最优(最大或最小)的变量值。
prob = cp.Problem(obj, con)
# solver='SCIPY':这是.solve()方法的一个参数,它指定了用于求解优化问题的求解器。在这个例子中,
# 它告诉.solve()方法使用SciPy库中的求解器。SciPy是一个广泛使用的Python库,
# 提供了大量的数学、科学和工程计算功能,包括优化问题的求解。
prob.solve(solver='SCIPY')
# 通过访问v.value来获取优化后的变量值。
# round(prob.value, 4) 表示将 prob.value 的值四舍五入到小数点后4位。
# prob中存放的是最优值
print('第',str(j+1),'个对象最优值:',round(prob.value,4))
# u、v中存放的是最优解
print('最优解:\n', np.round(u.value,4),'\n', np.round(v.value,4))
三、结果分析
结果如下:
第 1 个对象最优值: 0.2902
最优解:
[0. 1.5385 0. ]
[0.0001 0. ]
第 2 个对象最优值: 0.2854
最优解:
[0. 0.8997 0.0109]
[0.0001 0. ]
第 3 个对象最优值: 0.2968
最优解:
[0. 0.9029 0.011 ]
[0.0001 0. ]
第 4 个对象最优值: 0.3425
最优解:
[0. 0.8682 0.0106]
[0.0001 0. ]
第 5 个对象最优值: 0.4595
最优解:
[0. 1.3158 0. ]
[1.000e-04 1.914e-01]
第 6 个对象最优值: 0.7183
最优解:
[0. 1.4493 0. ]
[0. 1.2174]
第 7 个对象最优值: 0.9069
最优解:
[0. 1.6393 0. ]
[1.000e-04 2.385e-01]
第 8 个对象最优值: 1.0
最优解:
[0. 1.0279 0.0125]
[0.0001 0. ]
第 9 个对象最优值: 1.0
最优解:
[2.630e-02 8.327e-01 8.000e-04]
[0.0001 0. ]
第 10 个对象最优值: 1.0
最优解:
[0. 0. 0.0344]
[0. 1.]
且中最优解>0且最优目标值=1,则说明评价对象DEA是有效的。