使用Python的Google ortools进行简单的线性编程

在其他文章中,我演示了如何解决例如使用Python中的SciPy和PuLP等模块进行线性优化问题。在R中,我还展示了lpSolve软件包。

在本文中,我想演示如何使用Python的ortools模块中的Google Glop求解器。

解决的问题如下:

为了使我能够使用Google的Glop求解器解决问题,我首先需要在Python中安装ortools模块。 ortools是Google的Python OR-Tool模块。

安装ortools之后,我从Python中的ortools.linear_solver导入pywraplp子模块:

from ortools.linear_solver import pywraplp

接下来,我创建一个求解器实例(使用GLOP求解器),并将其引用存储到引用处理程序中:

solver = pywraplp.Solver.CreateSolver('linear_programming_examples', 'GLOP')

我现在必须声明相关的优化变量。在此示例中,优化变量为x,y和z:

#声明变量x,下限为0,无上限
x = Solver.NumVar(0,Solver.Infinity(),“ x”)
#声明变量y,下限为0,无上限
y = Solver.NumVar(0,Solver.infinity(),“ y”)
#声明变量z,下限为0,无上限
z = Solver.NumVar(0,Solver.infinity(),“ z”)

如以上注释中所述,在声明优化变量时必须指定下限和上限。因此,在声明优化变量之后,求解器已经考虑了非负约束。

声明优化变量后,我现在可以声明目标函数:

#将目标添加到求解器
objective = solver.Objective()
#为目标添加条件,从而使目标函数产生结果
objective.SetCoefficient(x, 1)
objective.SetCoefficient(y, 2)
objective.SetCoefficient(z, 3)
#将问题声明为最大化问题
objective.SetMaximization()

在定义了目标函数之后,我现在必须向求解器添加相关约束:

#添加约束:2x + y + z <= 20
constraint = solver.Constraint(-solver.infinity(), 20)
constraint.SetCoefficient(x, 2)
constraint.SetCoefficient(y, 1)
constraint.SetCoefficient(z, 1)
#添加约束:x + y + z <= 15
constraint = solver.Constraint(-solver.infinity(),15)
constraint.SetCoefficient(x, 1)
constraint.SetCoefficient(y, 1)
constraint.SetCoefficient(z, 1)
#添加约束:x-y-z> = 0
constraint = solver.Constraint(0,solver.infinity())
constraint.SetCoefficient(x, 1)
constraint.SetCoefficient(y, -1)
constraint.SetCoefficient(z, -1)

现在模型已完成。

我们可以继续解决问题。这是在下面的代码行中完成的:

solver.Solve()
0

x的最佳解决方案输出如下:

print("x_opt: ", x.solution_value())
x_opt:  6.666666666666667

y的最优解输出如下:

print("y_opt: ", y.solution_value())
y_opt:  0.0

z的最优解输出如下:

print("z_opt: ", z.solution_value())
z_opt:  6.666666666666667

最佳目标函数值输出如下:

print("optimal value: " + str(x.solution_value()+2*y.solution_value()+3*z.solution_value()))
optimal value: 26.666666666666668

Leave a Reply

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Close

功能