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

如何在Python Pyomo中为每个i值定义对应二进制变量

Pyomo 带索引二进制变量声明方法

要定义i取值为1、2、3的索引二进制变量bi,只需要给Var传入对应的索引集合参数即可,不用逐个为每个i单独声明变量,两种常用实现方式如下:

写法1:显式定义索引集合(推荐)

这种写法可读性最好,后续写约束、目标函数的时候调用集合也方便,适合结构稍复杂的模型,代码如下:

from pyomo.environ import *

# 初始化模型实例
model = ConcreteModel()
# 定义i的取值集合,对应i=1,2,3
model.I = Set(initialize=[1, 2, 3])
# 声明带索引的二进制变量b_i
model.b = Var(model.I, domain=Binary)

声明完成后,直接通过model.b[1]、model.b[2]、model.b[3]就能访问对应i的二进制变量,完全匹配bi ∈ {0, 1}(i=1,2,3)的数学定义。

写法2:直接传入索引列表

如果模型结构很简单,不想单独维护索引集合,也可以直接把索引列表传给Var,效果和上面的写法完全一致:

from pyomo.environ import *

model = ConcreteModel()
# 直接传入索引取值范围,不需要单独定义Set
model.b = Var([1, 2, 3], domain=Binary)

补充说明

  • 不要像你最开始写的示例那样把变量声明为全局变量,Pyomo的规范是把所有集合、变量、约束、目标都挂载到模型实例(也就是上面代码里的model对象)上,不然后续求解、提取结果的时候很容易出调用错误。
  • 后续写约束的时候可以直接遍历索引集合批量生成规则,比如要限制最多买2件产品,直接写下面的代码就行:
model.buy_limit = Constraint(expr=sum(model.b[i] for i in model.I) <= 2)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:09:16