寻求Pyomo模型高效实现方案:优化IJKLM与供应链模型生成性能
Pyomo模型性能优化求助
我正在开展Pyomo与JuMP的公平性能对比工作,已创建GitHub仓库分享实验代码,欢迎各方参与贡献。目前针对以下两个Pyomo模型,希望找到比现有直观实现更高效的方案:
IJKLM模型
def pyomo(I, IJK, JKL, KLM, solve): model = pyo.ConcreteModel() model.I = pyo.Set(initialize=I) x_list = [ (i, j, k, l, m) for (i, j, k) in IJK for l in JKL[j, k] for m in KLM[k, l] ] constraint_dict_i = { ii: ((i, j, k, l, m) for (i, j, k, l, m) in x_list if i == ii) for ii in I } model.x_list = pyo.Set(initialize=x_list) model.c_dict_i = pyo.Set(model.I, initialize=constraint_dict_i) model.z = pyo.Param(default=1) model.x = pyo.Var(model.x_list, domain=pyo.NonNegativeReals) model.OBJ = pyo.Objective(expr=model.z) model.ei = pyo.Constraint(model.I, rule=ei_rule) if solve: opt = pyo.SolverFactory("gurobi") opt.solve(model) def ei_rule(model, i): return sum(model.x[i, j, k, l, m] for i, j, k, l, m in model.c_dict_i[i]) >= 0
供应链模型
def intuitive_pyomo(I, L, M, IJ, JK, IK, KL, LM, D, solve): model = pyo.ConcreteModel() model.I = pyo.Set(initialize=I) model.L = pyo.Set(initialize=L) model.M = pyo.Set(initialize=M) model.IJ = pyo.Set(initialize=IJ) model.JK = pyo.Set(initialize=JK) model.IK = pyo.Set(initialize=IK) model.KL = pyo.Set(initialize=KL) model.LM = pyo.Set(initialize=LM) model.f = pyo.Param(default=1) model.d = pyo.Param(model.I, model.M, initialize=D) model.x = pyo.Var( [ (i, j, k) for (i, j) in model.IJ for (jj, k) in model.JK if jj == j for (ii, kk) in model.IK if (ii == i) and (kk == k) ], domain=pyo.NonNegativeReals, ) model.y = pyo.Var( [(i, k, l) for i in model.I for (k, l) in model.KL], domain=pyo.NonNegativeReals ) model.z = pyo.Var( [(i, l, m) for i in model.I for (l, m) in model.LM], domain=pyo.NonNegativeReals ) model.OBJ = pyo.Objective(expr=model.f) model.production = pyo.Constraint(model.IK, rule=intuitive_production_rule) model.transport = pyo.Constraint(model.I, model.L, rule=intuitive_transport_rule) model.demand = pyo.Constraint(model.I, model.M, rule=intuitive_demand_rule) # model.write("int.lp") if solve: opt = pyo.SolverFactory("gurobi") opt.solve(model) def intuitive_production_rule(model, i, k): lhs = [ model.x[i, j, k] for (ii, j) in model.IJ if ii == i for (jj, kk) in model.JK if (jj == j) and (kk == k) ] rhs = [model.y[i, k, l] for (kk, l) in model.KL if kk == k] if lhs or rhs: return sum(lhs) >= sum(rhs) else: return pyo.Constraint.Skip def intuitive_transport_rule(model, i, l): lhs = [model.y[i, k, l] for (k, ll) in model.KL if ll == l] rhs = [model.z[i, l, m] for (lll, m) in model.LM if lll == l] if lhs or rhs: return sum(lhs) >= sum(rhs) else: return pyo.Constraint.Skip def intuitive_demand_rule(model, i, m): return sum(model.z[i, l, m] for (l, mm) in model.LM if mm == m) >= model.d[i, m]
模型结构
- IJKLM模型:

- 供应链模型:

性能结果
- IJKLM模型生成性能:

- 供应链模型生成性能:

我以模型生成时间作为性能衡量指标,测试了两个模型在递增规模实例下的表现。恳请各位技术人士提供Pyomo模型性能优化的建议。
内容的提问来源于stack exchange,提问作者Justine
相关产品推荐
相关产品推荐

