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

