Pyomo中对双索引稀疏集子集应用累积约束的技术问询
需求:Pyomo中高效实现特定累积约束
这是此前帖子的续篇,因需求调整后内容变化较大,单独发帖保证清晰性。以下是极简示例,使用稀疏集WEEK_PROD_flat定义决策变量X:
初始模型
weekly_products = { 1: ['Q24'], 2: ['Q24', 'J24'], 3: ['Q24', 'J24','F24'], 4: ['J24', 'F24'], 5: ['F24'] } from pyomo.environ import * model = ConcreteModel() model.WEEKS = Set(initialize = [1,2,3,4,5]) model.PRODS = Set(initialize = ['Q24','J24','F24']) model.WEEK_PROD = Set(model.WEEKS, initialize = weekly_products) model.WEEK_PROD_flat = Set(initialize=[(w, p) for w in model.WEEKS for p in model.WEEK_PROD[w]]) model.X = Var(model.WEEK_PROD_flat)
定义参数
需对WEEK_PROD_flat的部分索引应用约束,已定义最小、最大参数:
week_min = { (2,'J24'):10, (3,'J24'):20, (3,'F24'):10, (4,'J24'):30, (4,'F24'):20, (5,'F24'):30 } week_max = { (2,'J24'):30, (3,'J24'):40, (3,'F24'):30, (4,'J24'):50, (4,'F24'):40, (5,'F24'):50 } model.weekMin = Param(model.WEEK_PROD_flat, within = NonNegativeIntegers, initialize = week_min, default = 0) model.weekMax = Param(model.WEEK_PROD_flat, within = NonNegativeIntegers, initialize = week_max, default = 0)
约束规则与期望输出
需要基于上述参数创建符合以下规则的累积约束:
- 每周求和需包含此前所有周的对应项;
- 'J..'和'F..'类产品需分别单独累积求和;
- 'Q..'类产品不参与约束索引,但需与对应'J..'、'F..'类产品一同求和。
期望的约束输出如下:
(2, 'J24'): 10 : X[1,Q24] + X[2,Q24] + X[2,J24] : 30 (3, 'J24'): 20 : X[1,Q24] + X[2,Q24] + X[3,Q24] + X[2,J24] + X[3,J24] : 40 (3, 'F24'): 10 : X[1,Q24] + X[2,Q24] + X[3,Q24] + X[3,F24] : 30 (4, 'J24'): 30 : X[1,Q24] + X[2,Q24] + X[3,Q24] + X[2,J24] + X[3,J24] + X[4,J24] :50 (4, 'F24'): 20 : X[1,Q24] + X[2,Q24] + X[3,Q24] + X[3,F24] + X[4,F24] : 40 (5, 'F24'): 30 : X[1,Q24] + X[2,Q24] + X[3,Q24] + X[3,F24] + X[4,F24] + X[5,F24] : 50
当前尝试的问题
此前未使用双索引和稀疏集时,可通过定义多规则分别为'J'和'F'类产品创建约束,但实际场景中效率低下,希望通过单约束声明实现需求。
当前尝试的代码存在两点不足:
- 需为非'Q24'的每个产品单独调用规则,实际场景中效率低;
- 因约束按单周索引定义,无法使用双索引参数的边界,只能设置静态边界。
当前尝试代码
def cum_limit_rule(model,w): subset = {x for x in model.WEEKS if x <= w} return(0, sum(model.X[w,p] for w in subset for p in model.WEEK_PROD[w] if p[0] == 'J' or p[0] == 'Q'), 1000) model.cum_limit = Constraint(model.WEEKS, rule= cum_limit_rule)
当前输出
cum_limit : Size=5, Index=WEEKS, Active=True Key : Lower : Body : Upper : Active 1 : 0.0 : X[1,Q24] : 1000.0 : True 2 : 0.0 : X[1,Q24] + X[2,Q24] + X[2,J24] : 1000.0 : True 3 : 0.0 : X[1,Q24] + X[2,Q24] + X[2,J24] + X[3,Q24] + X[3,J24] : 1000.0 : True 4 : 0.0 : X[1,Q24] + X[2,Q24] + X[2,J24] + X[3,Q24] + X[3,J24] + X[4,J24] : 1000.0 : True 5 : 0.0 : X[1,Q24] + X[2,Q24] + X[2,J24] + X[3,Q24] + X[3,J24] + X[4,J24] : 1000.0 : True
寻求高效实现期望约束的方案。
内容的提问来源于stack exchange,提问作者r0bt
相关产品推荐
相关产品推荐

