python - 如何在 CPLEX Python 中实现逻辑或约束
问题描述
如何在 CPLEX Python MP 中实现类似 x[0,0] == 0 OR x[0,0] >= 2 的约束?
似乎是半整数的工作,但 semiinteger_var_matrix() 在我在 Watson Studio DO 环境中使用的 CPLEX Python 版本中不可用。我可以使用可用的 semiinteger_var_list() 但想通过逻辑 OR 约束来自学。我试过 x[0,0] != 1 但 MP 不处理 NE。所以我想我可以按照上面显示的逻辑 OR 约束来做到这一点。查看了文档和 docplex.mp.model 的来源,但无法弄清楚如何做到这一点。我正处于学习 CPLEX Python 的早期阶段。
解决方案
让我给你一个关于巴士故事的小例子:
from docplex.mp.model import Model
mdl = Model(name='buses')
nbbus40 = mdl.integer_var(name='nbBus40')
nbbus30 = mdl.integer_var(name='nbBus30')
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
mdl.minimize(nbbus40*500 + nbbus30*400)
mdl.solve()
for v in mdl.iter_integer_vars():
print(v," = ",v.solution_value)
print()
print("with nb buses 40 less than 3 or more than 7")
mdl.add((nbbus40<=3) + (nbbus40>=7) >=1)
mdl.minimize(nbbus40*500 + nbbus30*400)
mdl.solve()
for v in mdl.iter_integer_vars():
print(v," = ",v.solution_value)
这使
nbBus40 = 6.0
nbBus30 = 2.0
with nb buses 40 less than 3 or more than 7
nbBus40 = 7.0
nbBus30 = 1.0
注意:你也可以写
from docplex.mp.model import Model
mdl = Model(name='buses')
nbbus40 = mdl.integer_var(name='nbBus40')
nbbus30 = mdl.integer_var(name='nbBus30')
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
mdl.minimize(nbbus40*500 + nbbus30*400)
mdl.solve()
for v in mdl.iter_integer_vars():
print(v," = ",v.solution_value)
print()
print("with nb buses 40 less than 3 or more than 7")
option1=mdl.binary_var(name='option1')
option2=mdl.binary_var(name='option2')
mdl.add(option1==(nbbus40<=3))
mdl.add(option2==(nbbus40>=7))
mdl.add(1==mdl.logical_or(option1,option2))
mdl.minimize(nbbus40*500 + nbbus30*400)
mdl.solve()
for v in mdl.iter_integer_vars():
print(v," = ",v.solution_value)
https://www.linkedin.com/pulse/making-optimization-simple-python-alex-fleischer/上的许多其他小型 docplex Python 示例
推荐阅读
- java - 如何将输入的计算存储到内存,输入重复,输入的第一个计算添加到输入的第二个计算等等?
- java - 我无法打印转换字符串的值
- vue.js - Vue.js 错误:无法读取未定义的属性“过滤器”
- python - Scipy TypeError:在优化中使用 dogleg 时,只能将 size-1 数组转换为 Python 标量,为什么?
- javascript - 单个 onChange 仅用于一种形式
- jenkins - 节点无法识别 Jenkins 标签
- javascript - 无法将用户文件转移给新所有者
- tfs - .Net-Core Proj - MSBuild 无法复制到输出文件夹
- java - 在springboot上使用maven安装JCOSap
- tensorflow - 奇怪的张量