You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'类产品创建约束,但实际场景中效率低下,希望通过单约束声明实现需求。

当前尝试的代码存在两点不足:

  1. 需为非'Q24'的每个产品单独调用规则,实际场景中效率低;
  2. 因约束按单周索引定义,无法使用双索引参数的边界,只能设置静态边界。

当前尝试代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 23:15:56