我需要使用Python中的Google OR-Tools CP-SAT 求解器解决这个简单的优化问题:
Goal = MAXIMIZE (X+Y+Z)
Constraint: Z/(X+Y+Z) <= 0.25
我不知道如何正确地写约束,因为它不是线性的。 你能帮我吗?
答案 0 :(得分:2)
您必须创建一个中间变量,并使用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)