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

Pyomo中如何将特定产品总量合并到其他产品约束中

Pyomo约束调整:将Q24总量合并到J24和F24的约束中

问题背景

现有简化Pyomo模型如下:

model.WEEKS = Set(initialize = [1,2,3], ordered = True)
model.PRODS = Set(initialize = ['Q24','J24','F24'], ordered = True)

model.volume = Var(model.WEEKS,model.PRODS, within = NonNegativeIntegers)

原本的约束逻辑是限制每个产品的全周总volume不超过300:

def volMax_rule(model,j):
     return sum(model.volume[i,j] for i in model.WEEKS) <= 300
model.volMax_calc = Constraint(model.PRODS, rule = volMax_rule)

现在需求变更:

  • 取消Q24的单独约束
  • 将Q24的全周总volume分别计入J24和F24的约束总和中,即J24总量+Q24总量≤300,F24总量+Q24总量≤300

解决方案

有两种简洁的实现方式:

方式一:指定目标约束集合

直接定义需要应用约束的产品集合(仅J24和F24),在规则中合并Q24的总量:

# 定义需要约束的目标产品集合
model.TARGET_PRODS = Set(initialize=['J24', 'F24'])

def volMax_rule(model, j):
    # 计算当前目标产品的全周总量
    prod_total = sum(model.volume[i, j] for i in model.WEEKS)
    # 计算Q24的全周总量
    q24_total = sum(model.volume[i, 'Q24'] for i in model.WEEKS)
    # 返回合并后的约束
    return prod_total + q24_total <= 300

# 基于目标集合创建约束
model.volMax_calc = Constraint(model.TARGET_PRODS, rule=volMax_rule)

方式二:利用Constraint.Skip跳过Q24

如果不想额外定义集合,可以在规则中判断产品类型,对Q24返回Constraint.Skip来跳过约束生成:

def volMax_rule(model, j):
    # 跳过Q24的约束
    if j == 'Q24':
        return Constraint.Skip
    # 计算当前产品和Q24的全周总量之和
    total = sum(model.volume[i, j] for i in model.WEEKS) + sum(model.volume[i, 'Q24'] for i in model.WEEKS)
    return total <= 300

# 基于原PRODS集合创建约束(自动跳过Q24)
model.volMax_calc = Constraint(model.PRODS, rule=volMax_rule)

两种方式最终都会生成两个约束,分别对J24+Q24、F24+Q24的总量进行限制,Q24本身不受单独约束限制。

内容的提问来源于stack exchange,提问作者r0bt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 00:20:22