PySCIPOpt逻辑约束及model.addConsOr/addConsAnd用法示例咨询
PySCIPOpt 中
addConsOr与addConsAnd的使用说明 注:两类逻辑约束的操作对象均为二进制(0-1)布尔变量,其中1代表逻辑真,0代表逻辑假。
1. addConsAnd 逻辑与约束
逻辑与的运算规则:所有输入变量为真时,结果才为真,否则为假。
调用语法为:model.addConsAnd(vars, result=None, name="")
vars:输入的布尔变量列表result:可选参数,布尔变量,用来存储逻辑与的运算结果;不指定时默认要求逻辑与的结果必须为真,等价于强制所有输入变量都为1
示例代码
如果要求只有当x1和x2都为1时,x3才能为1,实现如下:
from pyscipopt import Model # 初始化模型 model = Model("and_demo") # 定义三个布尔变量 x1 = model.addVar(vtype="B", name="x1") x2 = model.addVar(vtype="B", name="x2") x3 = model.addVar(vtype="B", name="x3") # 添加与约束:x3 = x1 AND x2 model.addConsAnd([x1, x2], x3, name="and_cons") # 设目标为最大化x3,求解后x1和x2会自动设为1满足与逻辑 model.setObjective(x3, "maximize") model.optimize() # 输出结果:x1=1.0, x2=1.0, x3=1.0 print(f"x1={model.getVal(x1)}, x2={model.getVal(x2)}, x3={model.getVal(x3)}")
如果调用时不填result参数,如model.addConsAnd([x1,x2]),等价于直接强制约束x1 == 1 且 x2 == 1。
2. addConsOr 逻辑或约束
逻辑或的运算规则:只要有一个输入变量为真,结果就为真;所有输入都为假时结果才为假。
调用语法为:model.addConsOr(vars, result=None, name="")
vars:输入的布尔变量列表result:可选参数,布尔变量,用来存储逻辑或的运算结果;不指定时默认要求逻辑或的结果必须为真,等价于强制至少一个输入变量为1
示例代码
如果要求只要y1或y2任意一个为1,y3就为1,实现如下:
from pyscipopt import Model # 初始化模型 model = Model("or_demo") # 定义三个布尔变量 y1 = model.addVar(vtype="B", name="y1") y2 = model.addVar(vtype="B", name="y2") y3 = model.addVar(vtype="B", name="y3") # 添加或约束:y3 = y1 OR y2 model.addConsOr([y1, y2], y3, name="or_cons") # 额外约束y1=0、y2=1,验证或逻辑 model.addCons(y1 == 0) model.addCons(y2 == 1) model.optimize() # 输出结果:y1=0.0, y2=1.0, y3=1.0 print(f"y1={model.getVal(y1)}, y2={model.getVal(y2)}, y3={model.getVal(y3)}")
如果调用时不填result参数,如model.addConsOr([y1,y2]),等价于直接强制约束y1 == 1 或 y2 == 1,也就是两个变量至少选一个。
复杂逻辑组合示例
两种约束可以嵌套使用实现自定义逻辑,比如要求(x1 AND x2) OR x3 == 1,实现方式如下:
# 先定义临时变量存储x1和x2的与运算结果 temp = model.addVar(vtype="B", name="temp") model.addConsAnd([x1, x2], temp) # 再添加或约束,不填result默认要求运算结果为真 model.addConsOr([temp, x3])
内容的提问来源于stack exchange,提问作者Junaid Hasan
相关产品推荐
相关产品推荐

