FCAM分配(gurobi)

gurobi安装学术版 经过分析,参考文献是错误的,所以仅参考代码写法就好
第一步

import gurobipy
import pandas as pd
from gurobipy import quicksum
class FACM(object):
    def __init__(self,input_var,output_var,epsilon,Fa,DMUs,data):
        self.q = len(data[DMUs])
        self.m= len(input_var)
        self.s=len(output_var)
        self.result = []
        self.Y = pd.DataFrame(data[output_var])
        self.X = pd.DataFrame(data[input_var])
        self.epsilon = epsilon
        self.Fa=Fa
    def run(self):
        MODEL = gurobipy.Model()
        alpha = MODEL.addVars(self.s,name = 'alpha')
        beta = MODEL.addVars(self.m,name = 'beta')
        e_q = MODEL.addVars(self.q,name = 'efficiency')
        f = MODEL.addVars(self.q,name = 'carbon_distr')
        MODEL.update()
        MODEL.setObjective(1/self.q * (quicksum(e_q[i] for i in range(self.q))),sense=gurobipy.GRB.MAXIMIZE )
        MODEL.addConstrs(quicksum(alpha[i] * self.Y.iloc[j,i] for i in range(self.s)) == (f[j]  + quicksum(beta[i] * self.X.iloc[j,i] for i in range(self.m))) *  e_q[j] for j in range(self.q))
        MODEL.addConstrs(0<=e_q[i] for i in range(self.q))
        MODEL.addConstrs(e_q[i]<=1 for i in range(self.q))
        MODEL.addConstrs(alpha[i] >= self.epsilon for i in range(self.s))
        MODEL.addConstrs(beta[i] >= self.epsilon for i in range(self.m))
        MODEL.addConstrs(quicksum(f[i] for i in range(self.q)) == self.Fa for i in range(self.q))
        MODEL.setParam('OutputFlag', 1) #1代表动态汇报结果
        MODEL.setParam("NonConvex", 2)  #2代表非线性
        MODEL.optimize()
  #      print(gurobipy.GRB.attr.BatchErrorCode)#    var.getAttr()
        print(MODEL.objVal)
        for i in MODEL.getVars():
            print(i.varName, i.x)
        return self.result
FACM = FACM(input_var = [],output_var = [],epsilon = 0.000001,Fa = 1000,DMUs = [],data = data)
result = FACM.run()

第二步,那篇文章有质量问题,换思路吧

posted @ 2021-12-30 16:29  kuanleung  阅读(27)  评论(0)    收藏  举报  来源