Google OR-Tools 线性规划入门教程
or-tools Google's Operations Research tools: 项目地址: https://gitcode.com/gh_mirrors/or/or-tools
什么是线性规划
线性规划(Linear Programming,简称LP)是运筹学中一种经典的数学优化方法,用于在给定的线性约束条件下,找到使线性目标函数达到最优(最大或最小)的变量值。它在生产计划、资源分配、运输调度等领域有广泛应用。
Google OR-Tools 简介
Google OR-Tools 是一个开源优化工具包,提供了强大的线性规划求解器。它支持多种编程语言接口,包括Python、C++、Java等,能够解决各种优化问题。
安装 OR-Tools
在Python环境中使用OR-Tools前,需要先安装它:
pip install ortools
线性规划示例解析
问题描述
我们来看一个典型的生产优化问题:
- 有三种产品x1、x2、x3
- 目标:最大化利润 10x1 + 6x2 + 4x3
- 约束条件:
- 10x1 + 4x2 + 5x3 ≤ 600(资源限制1)
- 2x1 + 2x2 + 6x3 ≤ 300(资源限制2)
- x1 + x2 + x3 ≤ 100(总产量限制)
自然语言API实现
OR-Tools提供了两种风格的API,我们先看更易读的自然语言风格:
from ortools.linear_solver import pywraplp
def RunLinearExampleNaturalLanguageAPI():
solver = pywraplp.Solver.CreateSolver("GLOP")
# 定义变量
infinity = solver.infinity()
x1 = solver.NumVar(0.0, infinity, "x1")
x2 = solver.NumVar(0.0, infinity, "x2")
x3 = solver.NumVar(0.0, infinity, "x3")
# 设置目标函数
solver.Maximize(10 * x1 + 6 * x2 + 4 * x3)
# 添加约束条件
c0 = solver.Add(10 * x1 + 4 * x2 + 5 * x3 <= 600)
c1 = solver.Add(2 * x1 + 2 * x2 + 6 * x3 <= 300)
c2 = solver.Add(x1 + x2 + x3 <= 100)
# 求解并输出结果
result_status = solver.Solve()
if result_status == pywraplp.Solver.OPTIMAL:
print("最优解:")
print(f"x1 = {x1.solution_value()}")
print(f"x2 = {x2.solution_value()}")
print(f"x3 = {x3.solution_value()}")
print(f"最大利润: {solver.Objective().Value()}")
C++风格API实现
对于习惯C++风格的开发者,OR-Tools也提供了相应的接口:
def RunLinearExampleCppStyleAPI():
solver = pywraplp.Solver.CreateSolver("GLOP")
# 定义变量
infinity = solver.infinity()
x1 = solver.NumVar(0.0, infinity, "x1")
x2 = solver.NumVar(0.0, infinity, "x2")
x3 = solver.NumVar(0.0, infinity, "x3")
# 设置目标函数
objective = solver.Objective()
objective.SetCoefficient(x1, 10)
objective.SetCoefficient(x2, 6)
objective.SetCoefficient(x3, 4)
objective.SetMaximization()
# 添加约束条件
c0 = solver.Constraint(-infinity, 600.0, "c0")
c0.SetCoefficient(x1, 10)
c0.SetCoefficient(x2, 4)
c0.SetCoefficient(x3, 5)
c1 = solver.Constraint(-infinity, 300.0, "c1")
c1.SetCoefficient(x1, 2)
c1.SetCoefficient(x2, 2)
c1.SetCoefficient(x3, 6)
c2 = solver.Constraint(-infinity, 100.0, "c2")
c2.SetCoefficient(x1, 1)
c2.SetCoefficient(x2, 1)
c2.SetCoefficient(x3, 1)
# 求解并输出结果
result_status = solver.Solve()
if result_status == pywraplp.Solver.OPTIMAL:
print("最优解:")
print(f"x1 = {x1.solution_value()}")
print(f"x2 = {x2.solution_value()}")
print(f"x3 = {x3.solution_value()}")
print(f"最大利润: {solver.Objective().Value()}")
支持的求解器
OR-Tools支持多种线性规划求解器,可以通过参数指定:
GLOP
:Google自研的线性规划求解器GLPK_LP
:GNU线性规划工具包CLP
:COIN-OR线性规划求解器PDLP
:原始-对偶混合梯度求解器XPRESS_LP
:FICO XPRESS求解器
结果分析
求解完成后,我们可以获取丰富的求解信息:
print("求解时间(毫秒):", solver.wall_time())
print("迭代次数:", solver.iterations())
# 变量的缩减成本
print(f"x1缩减成本: {x1.reduced_cost()}")
# 约束的对偶值
print(f"约束1对偶值: {c0.dual_value()}")
缩减成本和对偶值对于理解解的敏感性和资源价值非常重要,在商业决策中有重要参考价值。
实际应用建议
- 变量命名:给变量和约束起有意义的名称,便于后期维护
- 结果验证:对于重要问题,使用
solver.VerifySolution()
验证解的正确性 - 性能考虑:对于大规模问题,可以尝试不同的求解器比较性能
- 灵敏度分析:利用缩减成本和对偶值分析解的稳定性
总结
通过本教程,我们学习了如何使用Google OR-Tools解决线性规划问题。OR-Tools提供了直观的API接口,支持多种求解器,能够满足不同场景的需求。线性规划作为优化问题的基本工具,掌握它将为你在资源分配、生产计划等领域提供强大的分析能力。
or-tools Google's Operations Research tools: 项目地址: https://gitcode.com/gh_mirrors/or/or-tools
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考