Pyomo实现such that约束及大规模MILP开源求解器选型咨询
带t>ti过滤条件的约束实现
你的思路是正确的,在Pyomo中可以通过定义过滤集合来实现AMPL里:t>ti的such that条件,不需要处理else分支,更简洁的官方推荐写法是使用Set的filter参数,自动过滤不符合条件的元组:
from pyomo.environ import * model = ConcreteModel() # 首先定义基础参数和集合 model.Tele = Param(initialize=48) model.T = RangeSet(model.Tele) model.A = Set(ordered=True) # 定义变量和参数 model.active = Var(model.A, model.T, domain=Binary) model.d = Param(model.A, domain=NonNegativeReals) # 定义过滤集合:仅保留t>ti的(t,ti)元组 model.Tcomp = Set(within=model.T * model.T, filter=lambda m, t, ti: t > ti) # 定义约束 def max_duration_rule(m, a, t, ti): return m.active[a,t] * t - m.active[a,ti] * ti <= m.d[a] * (1 - m.Tele * (m.active[a,t] + m.active[a,ti] - 2)) model.max_duration = Constraint(model.A, model.Tcomp, rule=max_duration_rule)
你原来的initialize写法也可以正常运行,不符合t>ti条件的元组会被自动跳过,不会加入到Tcomp集合中。
大规模MILP开源求解器选择
针对和Pyomo适配的开源MILP求解器,性能排序为HiGHS > CBC > GLPK,三者的适配性都没有问题:
- GLPK仅适合小规模问题的逻辑验证,面对大规模MILP问题求解速度极慢,不推荐生产环境使用
- CBC是COIN-OR推出的成熟开源MILP求解器,生态完善、资料充足,可处理绝大多数常规规模的MILP问题,是过去很长时间内开源MILP的首选
- HiGHS是近年发展最快的高性能开源求解器,当前版本对MILP的支持已经非常成熟,求解速度比CBC有30%~100%的提升,Pyomo从6.4版本开始原生支持HiGHS,是目前大规模MILP问题的优先推荐选择
内容的提问来源于stack exchange,提问作者user15313089
相关产品推荐
相关产品推荐

