You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Gurobi/Python约束构建:寻求无需拆分约束的替代实现方法

无需拆分约束的Gurobi实现方法

当然有更简洁的方式啦!你可以通过预定义f值的映射关系,把原本拆分的两个约束合并成一个统一的约束生成语句,代码会更紧凑易读。

具体步骤:

  1. 先为每个i ∈ P∪D定义对应的f值,用字典来存储这个映射:
# 初始化f的映射字典
f_map = {}
# 给P中的元素赋值f=1
for i in P:
    f_map[i] = 1
# 给D中的元素赋值f=-1
for i in D:
    f_map[i] = -1

或者用更简洁的字典推导式写法:

f_map = {i: 1 for i in P}
f_map.update({i: -1 for i in D})
  1. 然后直接基于这个映射生成所有约束,不用拆分:
# 针对P∪D中的所有i,统一添加约束
m.addConstrs(
    (quicksum(x[i]) + quicksum(y[i]) == f_map[i] for i in P.union(D))
)

如果你的P和D是Python集合,还可以用更简洁的P | D代替P.union(D)

m.addConstrs(
    (quicksum(x[i]) + quicksum(y[i]) == f_map[i] for i in P | D)
)

为什么这个方法可行?

Gurobi的addConstrs()方法支持通过迭代器批量生成约束,只要在迭代过程中能为每个i正确匹配到对应的f值就行。通过字典映射把f的取值逻辑提前封装好,就可以用一条语句完成所有约束的添加,避免重复代码。

如果你的xy是多维决策变量(比如x[i,j]),只需要调整quicksum的参数(比如quicksum(x[i,j] for j in J)),核心的映射思路完全通用。

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

火山引擎 最新活动