Python数学建模PuLP库线性规划入门示例详解

 更新时间:2021年10月18日 15:23:42   作者:youcans  
这篇文章主要为大家介绍了Python数学建模PuLP库线性规划入门示例详解,想学习关于Python建模的同学可以学习参考下,希望能够有所帮助

1、什么是线性规划

线性规划(Linear programming),在线性等式或不等式约束条件下求解线性目标函数的极值问题,常用于解决资源分配、生产调度和混合问题。例如:

max		fx = 2*x1 + 3*x2 - 5*x3
s.t.	x1 + 3*x2 + x3 <= 12
		2*x1 - 5*x2 + x3 >= 10
		x1 + x2 + x3 = 7
		x1, x2, x3 >=0

线性规划问题的建模和求解,通常按照以下步骤进行:

(1)问题定义,确定决策变量、目标函数和约束条件;
(2)模型构建,由问题描述建立数学方程,并转化为标准形式的数学模型;
(3)模型求解,用标准模型的优化算法对模型求解,得到优化结果;

2、PuLP 库求解线性规划

PuLP是一个开源的第三方工具包,可以求解线性规划、整数规划、混合整数规划问题。
下面以该题为例讲解 PuLP 求解线性规划问题的步骤:

-(0)导入 PuLP库函数

    import pulp

-(1)定义一个规划问题

    MyProbLP = pulp.LpProblem("LPProbDemo1", sense=pulp.LpMaximize)

pulp.LpProblem 是定义问题的构造函数。
  "LPProbDemo1"是用户定义的问题名(用于输出信息)。
  参数 sense 用来指定求最小值/最大值问题,可选参数值:LpMinimize、LpMaximize 。

-(2)定义决策变量

    x1 = pulp.LpVariable('x1', lowBound=0, upBound=7, cat='Continuous') 
    x2 = pulp.LpVariable('x2', lowBound=0, upBound=7, cat='Continuous')
    x3 = pulp.LpVariable('x3', lowBound=0, upBound=7, cat='Continuous') 

pulp.LpVariable 是定义决策变量的函数。
  ‘x1' 是用户定义的变量名。
  参数 lowBound、upBound 用来设定决策变量的下界、上界;可以不定义下界/上界,默认的下界/上界是负无穷/正无穷。本例中 x1,x2,x3 的取值区间为 [0,7]。
  参数 cat 用来设定变量类型,可选参数值:‘Continuous' 表示连续变量(默认值)、' Integer ' 表示离散变量(用于整数规划问题)、' Binary ' 表示0/1变量(用于0/1规划问题)。

-(3)添加目标函数

    MyProbLP += 2*x1 + 3*x2 - 5*x3  	# 设置目标函数

添加目标函数使用 “问题名 += 目标函数式” 格式。

-(4)添加约束条件

    MyProbLP += (2*x1 - 5*x2 + x3 >= 10)  # 不等式约束
    MyProbLP += (x1 + 3*x2 + x3 <= 12)  # 不等式约束
    MyProbLP += (x1 + x2 + x3 == 7)  # 等式约束

添加约束条件使用 “问题名 += 约束条件表达式” 格式。
  约束条件可以是等式约束或不等式约束,不等式约束可以是 小于等于 或 大于等于,分别使用关键字">="、"<=“和”=="。

-(5)求解

    MyProbLP.solve()
    print("Status:", pulp.LpStatus[MyProbLP.status]) # 输出求解状态
    for v in MyProbLP.variables():
        print(v.name, "=", v.varValue)  # 输出每个变量的最优值
    print("F(x) = ", pulp.value(MyProbLP.objective))  #输出最优解的目标函数值    

solve() 是求解函数。PuLP默认采用 CBC 求解器来求解优化问题,也可以调用其它的优化器来求解,如:GLPK,COIN CLP/CBC,CPLEX,和GUROBI,但需要另外安装。

3、Python程序和运行结果

完整的程序代码如下:

import pulp
MyProbLP = pulp.LpProblem("LPProbDemo1", sense=pulp.LpMaximize)
x1 = pulp.LpVariable('x1', lowBound=0, upBound=7, cat='Continuous') 
x2 = pulp.LpVariable('x2', lowBound=0, upBound=7, cat='Continuous') 
x3 = pulp.LpVariable('x3', lowBound=0, upBound=7, cat='Continuous') 
MyProbLP += 2*x1 + 3*x2 - 5*x3  	# 设置目标函数
MyProbLP += (2*x1 - 5*x2 + x3 >= 10)  # 不等式约束
MyProbLP += (x1 + 3*x2 + x3 <= 12)  # 不等式约束
MyProbLP += (x1 + x2 + x3 == 7)  # 等式约束
MyProbLP.solve()
print("Status:", pulp.LpStatus[MyProbLP.status]) # 输出求解状态
for v in MyProbLP.variables():
    print(v.name, "=", v.varValue)  # 输出每个变量的最优值
print("F(x) = ", pulp.value(MyProbLP.objective))  #输出最优解的目标函数值
#= 关注 Youcans,分享原创系列 https://blog.csdn.net/youcans =

程序运行结果如下:

Welcome to the CBC MILP Solver 
Version: 2.9.0 
Build Date: Feb 12 2015 
Status: Optimal
x1 = 6.4285714
x2 = 0.57142857
x3 = 0.0
F(x) =  14.57142851

以上就是Python数学建模PuLP库线性规划入门示例详解的详细内容,更多关于数学建模PuLP库线性规划入门的资料请关注脚本之家其它相关文章!

相关文章

  • pandas数据缺失的两种处理办法

    pandas数据缺失的两种处理办法

    本文主要介绍了在pandas中处理数据缺失和0值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-12-12
  • python中的sort方法使用详解

    python中的sort方法使用详解

    这篇文章主要介绍了python中的sort方法,需要的朋友可以参考下
    2014-07-07
  • 安装ElasticSearch搜索工具并配置Python驱动的方法

    安装ElasticSearch搜索工具并配置Python驱动的方法

    这篇文章主要介绍了安装ElasticSearch搜索工具并配置Python驱动的方法,文中还介绍了其与Kibana数据显示客户端的配合使用,需要的朋友可以参考下
    2015-12-12
  • 利用Python操作MongoDB数据库的详细指南

    利用Python操作MongoDB数据库的详细指南

    MongoDB是由C++语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似JSON对象,下面这篇文章主要给大家介绍了关于利用Python操作MongoDB数据库的相关资料,需要的朋友可以参考下
    2023-02-02
  • Python密码学Caesar Cipher凯撒密码算法教程

    Python密码学Caesar Cipher凯撒密码算法教程

    这篇文章主要为大家介绍了Python密码学Caesar Cipher凯撒密码算法教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Python定时任务实现方案

    Python定时任务实现方案

    这篇文章主要介绍了Python定时任务实现的方案,定时执行的任务,可以是一段bash命令,也可以是一个脚本文件。通常用于我们需要在特定时刻做事情,下面来看看文章详细内容,需要的朋友可以参考一下
    2021-11-11
  • Pandas中DataFrame基本函数整理(小结)

    Pandas中DataFrame基本函数整理(小结)

    这篇文章主要介绍了Pandas中DataFrame基本函数整理(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 跟老齐学Python之变量和参数

    跟老齐学Python之变量和参数

    对于变量和参数,不管是已经敲代码多年的老鸟,还是刚刚接触编程的小白,都会有时候清楚,有时候又有点模糊。因为,在实际应用中,它们之间分分离离,比如,敲代码都知道,x=3中x是变量,它不是参数,但是在函数y=3x+4中,x是变量,也是参数。
    2014-10-10
  • python实现打印类的所有属性和方法

    python实现打印类的所有属性和方法

    这篇文章主要介绍了python实现打印类的所有属性和方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • Python中的探索性数据分析(功能式)

    Python中的探索性数据分析(功能式)

    这篇文章主要介绍了功能式Python中的探索性数据分析的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-12-12

最新评论