在Python中使用Google ortools进行线性整数编程

在Google使用Python的ortools模块上的其他几篇文章中,我已经解决了下面所述的线性优化问题。由于所有优化变量都来自连续解空间,因此该问题是一个连续问题。

我可以想到类似的问题,但要使用整数优化变量。那将使该问题成为整数优化问题(具有离散解决方案空间)。我已经重述了这个问题,并添加了一条数学语句,指出所有优化变量都是整数:

使用Python中的ortools解决此问题的工作流程与先前文章中介绍的工作流程非常相似。

我首先从ortools.linear_solver导入pywraplp:

from ortools.linear_solver import pywraplp

接下来,我创建一个求解器实例并将其引用存储到引用处理程序中。这次我不使用GLOP,而是使用CBC求解器:

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

我现在必须声明相关的优化变量。在此示例中,优化变量为x,y和z,在声明它们时,我根据数学问题说明定义了上下限。另外,我通过使用IntVar()构造函数而不是NumVar()构造函数将优化变量声明为整数:

#声明变量x,下限为0,无上限-它是整数(IntVar)
x = solver.IntVar(0, solver.infinity(), "x")
#声明变量y,下限为0,无上限-它是整数(IntVar)
y = solver.IntVar(0, solver.infinity(), "y")
#声明变量z,下限为0,无上限-它是整数(IntVar)
z = solver.IntVar(0, solver.infinity(), "z")

现在,工作流程与包含连续问题的最新帖子中的工作流程相同。我通过将目标函数和约束添加到求解器来对问题建模:

#声明为最大化问题并定义目标函数
solver.Maximize(x+2*y+3*z)
#添加约束
solver.Add(2*x+y+z <= 20)
solver.Add(x+y+z <= 15)
solver.Add(x-y-z >= 0)
<ortools.linear_solver.pywraplp.Constraint; proxy of <Swig Object of type 'operations_research::MPConstraint *' at 0x000001D4F116CFC0> >

完成模型后,我现在可以解决问题:

solver.Solve()
0

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

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

y的最优解输出如下:

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

z的最优解输出如下:

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

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

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

如您所见,最佳值为整数。您还可以看到最佳目标函数值已减小,因为来自离散解空间的变量的附加约束限制了最大化目标的可能性范围。在连续的情况下,最佳结果是26.66。现在,最佳结果是25.0。

Leave a Reply

发表评论

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

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

Close

功能