提问人:quan long 提问时间:5/25/2023 最后编辑:quan long 更新时间:5/26/2023 访问量:58
需要帮助来加速创建 Pyomo 模型实例
need help to accelerate creating pyomo model instance
问:
我的 pyomo 几乎 100% 的时间都花在创建模型实例上。我的代码如下所示:
import pyomo.environ as pyo
import materialAllocation_data_parsing
import cProfile as profile
import pstats
model = pyo.AbstractModel()
model.TH = pyo.Param(initialize=6)
model.NF = pyo.Param(within=pyo.NonNegativeIntegers)
model.NR = pyo.Param(within=pyo.NonNegativeIntegers)
model.I = pyo.RangeSet(1, model.NR)
model.J = pyo.RangeSet(1, model.NF)
model.T = pyo.RangeSet(1, model.TH)
model.R = pyo.Param(model.I, model.J, default = 0)
model.PO = pyo.Param(model.I, model.T, default = 0)
model.dFG = pyo.Param(model.J, model.T, default = 0)
model.RM0 = pyo.Param(model.I, within=pyo.NonNegativeReals)
model.FG0 = pyo.Param(model.J, within=pyo.NonNegativeReals)
model.C = pyo.Param(model.J, within=pyo.NonNegativeReals)
model.S = pyo.Param(model.J, within=pyo.NonNegativeReals)
model.X = pyo.Var(model.T, model.J, domain=pyo.NonNegativeIntegers)
def obj_expression(m):
return sum(m.S[j]*m.X[t,j] for t in m.T for j in m.J)
model.OBJ = pyo.Objective(rule=obj_expression, sense=pyo.maximize)
def rm_constraint_rule(m, i, t):
rg= pyo.RangeSet(1,t)
return m.RM0[i]+sum( -(m.X[t1, j] * m.R[i, j]) for j in m.J for t1 in rg) + sum(m.PO[i, t1] for t1 in rg) >= 0
def fg_constraint_rule(m, j, t):
rg = pyo.RangeSet(1,t)
return m.FG0[j] + sum( - m.X[t1,j] + m.dFG[j,t1] for t1 in rg) >= 0
def cp_constraint_rule(m, j, t):
return m.X[t,j] <= m.C[j]
model.rmConstraint = pyo.Constraint(model.I, model.T,
rule=rm_constraint_rule)
model.fgConstraint = pyo.Constraint(model.J, model.T,
rule=fg_constraint_rule)
model.cpConstraint = pyo.Constraint(model.J, model.T,
rule=cp_constraint_rule)
data = data_parsing()
instance = model.create_instance(data, report_timing=True)
opt = pyo.SolverFactory('glpk')
有没有办法加速模型实例化?我认为大部分时间都花在创建这些约束上。如果这是加速模型实例化的方法,谁能帮我以矩阵形式编写这些约束?谢谢!!
我试过pypy。它可以将一个小问题从 10 分钟加速到 2 分钟。尽管如此,仅仅处理一个现实问题是不够的。同时,Pypy 显著减慢了数据采集部分的速度,即使用 pandas。
答:
0赞
AirSquid
5/26/2023
#1
代码没有什么奇怪的,从细节上仍然不清楚什么是消耗时间。它可能是数据处理,模型可能是巨大的,也可能是???
无论如何,您可以采取第一个逻辑步骤,并在约束中使用常规的 python 生成器,而不是创建新的range()
pyo.RangeSet
我会更改它(以及类似的其他约束):
def rm_constraint_rule(m, i, t):
rg= pyo.RangeSet(1,t)
return m.RM0[i]+sum( -(m.X[t1, j] * m.R[i, j]) for j in m.J for t1 in rg) + sum(m.PO[i, t1] for t1 in rg) >= 0
对此:
定义rm_constraint_rule(m, i, t): 返回 m.RM0[i]+sum( -(m.X[t1, j] * m.R[i, j]) for j in m.J for t1 in range(1, t+1) + sum(m.PO[i, t1] for t1 in range(1, t+1) >= 0
评论
0赞
quan long
5/26/2023
在一个小例子中,求解成本为 0.15 秒。模型实例化成本为 1.69 秒。rm_costraint_rule耗时 1.56 秒。有没有办法加速嵌套总和?同时,R 实际上非常稀疏。pyomo 可以利用稀疏性吗?
评论
pandas
pyo.RangeSet