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
相关产品推荐
相关产品推荐

