使用 PuLP 最小化 objective 函数

Minimize the objective function using PuLP

我有这个等式

-0.19430381*clo + 0.02507341*vam + 0.13574366*sla + 0.01667444*so = 10

我需要找到 clo、vam、sla 等的最小值来求解这个方程。我使用 PuLP 来查找值。

# declare your variables
clo = LpVariable("clo", 65, 80)
vam = LpVariable("vam", 63, 90)
sla = LpVariable("sla", 70, 80)
so = LpVariable("so", 75, 85)

# defines the problem
prob = LpProblem("problem", LpMinimize)

objective函数和约束写成

# defines the objective function to minimize
prob += -0.19430381*clo + 0.02507341*vam +  0.13574366*sla + 0.01667444*so-10 

#define Constraints
prob+= clo>=65
prob+= clo<=80
prob+= vam>=63
prob+= vam<=90
prob+= sla>=71
prob+= sla<=80
prob+= so>=75
prob+= so<=85

当我使用默认求解器求解时,它为 clo 取上限值 80,同时为所有其他变量取下限值。 objective函数值为负。

print (pulp.value(prob.objective))
-13.21204077

我希望这个 objective 函数值为 0。在这种情况下,我需要找到所有参数的值。参数的值也可以是float。

描述的问题不可行

您想实现以下等式约束:

-0.19430381*clo + 0.02507341*vam + 0.13574366*sla + 0.01667444*so == 10

服从以下变量的上下界:

clo = LpVariable("clo", 65, 80)
vam = LpVariable("vam", 63, 90)
sla = LpVariable("sla", 70, 80)
so = LpVariable("so", 75, 85)

查看等式约束,如果我们想让右侧在约束范围内尽可能大,我们会选择 vam, sla, so 尽可能大,clo 作为尽可能小(因为它在左侧有负系数)。

设置:clo=65; vam=90; sla=80; so=85 我们得到等式约束左侧的结果为:1.9036794499999987。值的任何其他组合(在 upper/lower 范围内)将导致左侧较小 - 因此无法满足等式约束,它永远不会等于所需的右侧 10.