添加除法不等式约束

Posted

技术标签:

【中文标题】添加除法不等式约束【英文标题】:Add a division inequality constraint 【发布时间】:2019-08-26 11:35:03 【问题描述】:

我需要用 Python 中的 Google OR-Tools CP-SAT 求解器解决这个简单的优化问题:

Goal = MAXIMIZE (X+Y+Z)
Constraint: Z/(X+Y+Z) <= 0.25

我不知道如何正确编写约束,因为它不是线性的。 你能帮帮我吗?

【问题讨论】:

【参考方案1】:

您必须创建一个中间变量并使用 model.AddDivisionEquality 设置其值。由于 CP-SAT 处理整数,您还必须按比例放大一些变量。

scaling = 1000
x = model.NewIntVar(0, 10, 'x')
y = model.NewIntVar(0, 10, 'y')
z = model.NewIntVar(0, 10, 'z')

scaled_z = model.NewIntVar(0, 10 * scaling, 'z_scaled')
denom = model.NewIntVar(1, 3 * 10, 'x+y+z')
division = model.NewIntVar(0, 10 * scaling, 'z/(x+y+z)')

model.Add(scaled_z == z * scaling)
model.Add(denom == x + y + z)
model.AddDivisionEquality(division, scaled_z, denom)
model.Add(division <= int(0.25 * scaling))
model.Maximize(x + y + z)

solver.Solve(model)

print('x =', solver.Value(x))
print('y =', solver.Value(y))
print('z =', solver.Value(z))
print('z/(x+y+z) =', solver.Value(division) / scaling)

【讨论】:

非常感谢!不幸的是,我错误地写了约束。我的约束是:z/(x+y+z)

以上是关于添加除法不等式约束的主要内容,如果未能解决你的问题,请参考以下文章

不等式约束问题

具有两个不等式约束的歧义

如何使用相加乘法等式来添加约束?

Scipy.optimize 不等式约束 - 考虑不等式的哪一侧?

07-内点法(不等式约束优化算法)

差分约束