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()
第二步,那篇文章有质量问题,换思路吧

浙公网安备 33010602011771号