使用PuLP最小化目标函数

时间:2019-02-11 05:32:05

标签: python optimization 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)

目标函数和约束写为

# 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的上限,而其他所有变量取下限。目标函数值为负。

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

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

1 个答案:

答案 0 :(得分:1)

所描述的问题是不可行的。

您希望实现以下平等约束:

  

-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。值的任何其他组合(在上下边界内)将导致左侧较小-因此,不能满足等式约束,它将永远不等于所需的右侧10。