Google OR-Tools 线性规划入门教程

Google OR-Tools 线性规划入门教程

or-tools Google's Operations Research tools: or-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
  • 约束条件:
    1. 10x1 + 4x2 + 5x3 ≤ 600(资源限制1)
    2. 2x1 + 2x2 + 6x3 ≤ 300(资源限制2)
    3. 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()}")

缩减成本和对偶值对于理解解的敏感性和资源价值非常重要,在商业决策中有重要参考价值。

实际应用建议

  1. 变量命名:给变量和约束起有意义的名称,便于后期维护
  2. 结果验证:对于重要问题,使用solver.VerifySolution()验证解的正确性
  3. 性能考虑:对于大规模问题,可以尝试不同的求解器比较性能
  4. 灵敏度分析:利用缩减成本和对偶值分析解的稳定性

总结

通过本教程,我们学习了如何使用Google OR-Tools解决线性规划问题。OR-Tools提供了直观的API接口,支持多种求解器,能够满足不同场景的需求。线性规划作为优化问题的基本工具,掌握它将为你在资源分配、生产计划等领域提供强大的分析能力。

or-tools Google's Operations Research tools: or-tools 项目地址: https://gitcode.com/gh_mirrors/or/or-tools

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平樱玫Duncan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值