二阶段网络DEA(two-stage network)
这篇文章是阅读文献做的总结并且代码复现。欢迎大家一起交流。
二阶段网络DEA简单介绍
二阶段网络DEA主要有两种类型。第一种就是stage-1只有中间变量输出,而stage-2只有中间变量输入。而第二种更为常见,就是stage-1只有中间变量输出,而stage-2既有中间变量输入又有额外的投入。这篇文章是基于第二种类型进行展开。
这篇文章内容不多,讲述了两种方法,分别是centralized model 以及 non-cooperation model.
centralized model
根据上述图示,我们可以写出模型。
多看文献的人都知道,这个模型很常见,并且也应该知道这个模型不能转变成线性模型,那么就很难从软件中求得全局最优值。这里我们就通过一种启发式方法。个人认为,这个方法极好!很有意思! 好聪明!
具体操作如下:
总的来说,通过两个步骤。
第一步
我们先求得stage-1的效率最大值,在原来模型的限制条件下:
要知道,原模型的目标函数是两个小于等于1的乘数相乘,并且两个成分要使得乘积达到最大,那么现在只需要第一部分达到最大,必定会必原来的值更大,也就是:
第二步
上一步是求出了stage-1效率的一个范围。接下来,为了求centralized model的效率,我们就假设stage-1的效率是一个常数,为已知值。即:
并且为了在python中实现,对其进行线性转化:
然后,就是考验编程能力了,迭代计算。我们注意stage-1效率:
这里的k是迭代次数,是步长,是自己设定的,这篇文章开始设定的是0.01。
又因为k是迭代次数,一定是整数,且效率一定大于等于0,那么k的大小就有限制。
k从0开始进行迭代至k的最大值。对于每个DMUs,每个k都会得到一个系统效率值theta_centralized,我们取最大值,以及所对应的k。确定了k,我们就可以得到一个确切的stage-1效率值theta_0_1。那么可以根据除法,得到stage-2的效率值。
non-cooperation model
这个部分比较简单,就简单过一下。
非合作模型,就是两种。第一种,就是先求得stage-1的效率值(leading),然后在固定stage-1的效率下,再去求stage-2的效率值。或者说,先求得stage-2的效率值(leading),然后在固定stage-2的效率下,再去求stage-1的效率值。
给出第一种展示:
example–centralized model
网络展示:
数据展示(小部分,主要看变量名称),数据我看看能不能上传,大家可以去资源地方找找:
然后,结果展示(只展示了stage-1先算的系统效率,旁边贴的表是我复现的结果):
这是以stage-2先算的结果,旁边贴的表是我个人的复现结果:
上述结果都是建立在步长为0.01的结果。但是步长越小结果越好,文航后面实现了步长为0.0001和0.00001的结果。但是由于本人没有gpu,跑的太慢了,就只实现了一个。
步长为0.0001情况下的stage-1先算时候的系统效率,结果如下(就这么一个系统效率,跑了一个小时。。。):
欢迎大家一起来复现。数据集我试试上传到资源地方!
本人用的是python的gurobi软件来解决的问题,用最基础的dea代码嵌套两次循环。