简体   繁体   English

添加除法不等式约束

[英]Add a division inequality constraint

I need to resolve this simple optimization problem with Google OR-Tools CP-SAT solver in Python: 我需要使用Python中的Google OR-Tools CP-SAT求解器解决此简单的优化问题:

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

I don't know how to write the constraint properly since it is not linear. 我不知道如何正确地写约束,因为它不是线性的。 Could you help me? 你可以帮帮我吗?

You have to create an intermediate variable and set its value using model.AddDivisionEquality. 您必须创建一个中间变量,并使用model.AddDivisionEquality设置其值。 You also have to scale some variables up as CP-SAT works with integers. 当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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM