在其他文章中,我演示了如何解决例如使用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
专业领域为优化和仿真的工业工程师(R,Python,SQL,VBA)
Leave a Reply