🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 线性规划求解 这里主要介绍谷歌的优化工具包(Google Optimization Tools)在线性规划问题上的求解。 ## 安装 Google官方有提供Python的pypi版本,所以我们可以通过pip很简单的安装。 首先,请确认你所使用的Python版本,根据文档说明,暂仅支持(2.7+, 3.5, or 3.6)。 同时,也需确认所用pip版本高于9.01,可以通过`pip --version`来查看pip的版本号,在必要的情况下,可以通过如下命令行升级pip。 ```powershell python -m pip install pip --upgrade ``` 然后就是通过pip安装OR-Tools。 ```powershell pip install ortools ``` **PS**: 因为该工具包本身是通过C++编写的,然后再通过SWIG封装各语言的分发版本,所以在用`help()`函数查看对应类或函数时,会发现其明显有些不一样。 ## 简单的示例 在Google的官方文档中,确实是有一个线性规划问题求解的示例,但对应刚开始用的人来说有些复杂了,所以我在这边会用一个更简单的问题来演示如何使用该工具包。 首先,我们需要求解的问题如下: ![待补图]() 求解代码如下: ```python # 导入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() ```