"添加除法不等式约束"

2024-10-04 09:19:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要用Google或Python中的ToolsCP-SATsolver来解决这个简单的优化问题:

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

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


Tags: google线性maximizeconstraintgoalsatsolvertoolscp
1条回答
网友
1楼 · 发布于 2024-10-04 09:19:20

您必须创建一个中间变量并使用模型.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)

相关问题 更多 >