线性规划求解

线性规划求解

这里主要介绍谷歌的优化工具包(Google Optimization Tools)在线性规划问题上的求解。

安装

Google 官方有提供 Python 的 pypi 版本,所以我们可以通过 pip 很简单的安装。

首先,请确认你所使用的 Python 版本,根据文档说明,暂仅支持(2.7+, 3.5, or 3.6)。

同时,也需确认所用 pip 版本高于 9.01,可以通过pip --version来查看 pip 的版本号,在必要的情况下,可以通过如下命令行升级 pip。

python -m pip install pip --upgrade

然后就是通过 pip 安装 OR-Tools。

pip install ortools

因为该工具包本身是通过 C++编写的,然后再通过 SWIG 封装各语言的分发版本,所以在用help()函数查看对应类或函数时,会发现其明显有些不一样。

简单的示例

在 Google 的官方文档中,确实是有一个线性规划问题求解的示例,但对应刚开始用的人来说有些复杂了,所以我在这边会用一个更简单的问题来演示如何使用该工具包。

首先,我们需要求解的问题如下:

线性规划模型

求解代码如下:

# 导入OR-Tools
from ortools.linear_solver import pywraplp
# 创建一个线性规划问题,并命名为'ls'
solver = pywraplp.Solver('ls', pywraplp.Solver.GLOP_LINEAR_PROGRAMMING)
# 创建待优化的目标函数
objective = solver.Objective()
# 建立变量x1, x2, x3
# 参数分别代表,下线,上限,变量名称
x1 = solver.NumVar(0, solver.infinity(), 'x1')
x2 = solver.NumVar(0, solver.infinity(), 'x2')
x3 = solver.NumVar(0, solver.infinity(), 'x3')
# 设置变量在目标函数中的参数
objective.SetCoefficient(x1, 2)
objective.SetCoefficient(x2, -1)
objective.SetCoefficient(x3, 1)
# 设置目标函数的优化目标,默认为最小值
# 这里将目标函数的优化目标改为最大值
objective.SetMaximization()
# 创建约束条件
# 参数分别代表, 下限,上限, 约束名称
c1 = solver.Constraint(-solver.infinity(), 60, 'c1')
# 设置变量在约束中的参数
c1.SetCoefficient(x1, 3)
c1.SetCoefficient(x2, 1)
c1.SetCoefficient(x3, 1)
c2 = solver.Constraint(-solver.infinity(), 10, 'c2')
c2.SetCoefficient(x1, 1)
c2.SetCoefficient(x2, -1)
c2.SetCoefficient(x3, 2)
c3 = solver.Constraint(-solver.infinity(), 20, 'c3')
c3.SetCoefficient(x1, 1)
c3.SetCoefficient(x2, 1)
c3.SetCoefficient(x3, -1)

# 输出模型
# 对于该模型的输出结果如下
# \ Generated by MPModelProtoExporter
# \   Name             : ls
# \   Format           : Free
# \   Constraints      : 3
# \   Variables        : 3
# \     Binary         : 0
# \     Integer        : 0
# \     Continuous     : 3
# Maximize
#  Obj: +2.000000 V0 -1.000000 V1 +1.000000 V2
# Subject to
#  C0: +3.000000 V0 +1.000000 V1 +1.000000 V2  <= 60.000000
#  C1: +1.000000 V0 -1.000000 V1 +2.000000 V2  <= 10.000000
#  C2: +1.000000 V0 +1.000000 V1 -1.000000 V2  <= 20.000000
# Bounds
#  0.000000 <= V0
#  0.000000 <= V1
#  0.000000 <= V2
# End
print(solver.ExportModelAsLpFormat(True))

# 计算该线性规范问题
status = solver.Solve()
# 判断解的状态
if status == solver.OPTIMAL:
    print('得到最优解')
elif status == solver.FEASIBLE:
    print('得到可行解')
else:
    print('无可行解')

# 目标函数的值
objective.Value()
# 各变量的解
x1.solution_value()
x2.solution_value()
x3.solution_value()

线性规划求解

线性规划求解

支付宝收款码
Copyright © yiluomyt 2020