超效率SBM

通CCR与BCC、SBM已经发布资源,超效率SBM代码已经修复(网上的带bug)
通过链接启发:https://tieba.baidu.com/p/5986755578

https://download.csdn.net/download/qq_42830971/20586629
import gurobipy
import pandas as pd
from gurobipy import quicksum


class effect_economic(object):
    def __init__(self,input_var,output_var,data):
        self.DMUs = len(data['DMUs'])
        self.m1= len(input_var)
        self.m2=len(output_var)
        self.X = data[input_var]
        self.Y=data[output_var]
        self.result = []
#    def __SBM_super_C(self):
    def __call__(self):
        for k in range(self.DMUs):
            MODEL = gurobipy.Model()
            fi = MODEL.addVars(self.m1)
            lambdas = MODEL.addVars(self.DMUs)
            fo = MODEL.addVars(self.m2)
            t = MODEL.addVar()
            MODEL.update()
            MODEL.setObjective(t + t/self.m1 * quicksum(fi[j] for j in range(self.m1)), sense=gurobipy.GRB.MINIMIZE)
            MODEL.addConstrs(quicksum(lambdas[i] * self.X.iloc[i][j] for i in range(self.DMUs) if i != k) <=  (1+fi[j]) * self.X.iloc[k][j] for j in range(self.m1))
            MODEL.addConstrs(quicksum(lambdas[i] * self.Y.iloc[i][j] for i in range(self.DMUs) if i != k) >=  (1-fo[j]) * self.Y.iloc[k][j] for j in range(self.m2))
            MODEL.addConstr(t-t/self.m2 * quicksum(fo[j] for j in range(self.m2)) == 1)

            MODEL.setParam('OutputFlag', 0)
            MODEL.setParam("NonConvex", 2)
            MODEL.optimize()
            self.result.append(MODEL.objVal)
        return self.result

eff = effect_economic(input_var=['x1','x2'],output_var=['y1','y2'],data=data)
eff()
posted @ 2021-07-30 09:42  kuanleung  阅读(83)  评论(0)    收藏  举报  来源