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

作者:youcans 时间:2023-06-13 13:06:20 

1、什么是线性规划

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


maxfx = 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库线性规划入门的资料请关注脚本之家其它相关文章!

来源:https://blog.csdn.net/youcans/article/details/116371416

标签:数学建模,PuLP,线性规划
0
投稿

猜你喜欢

  • 利用Python找出删除自己微信的好友并将他们自动化删除

    2022-05-23 00:10:13
  • python如何利用matplotlib绘制并列双柱状图并标注数值

    2022-08-06 22:00:33
  • 对python数据切割归并算法的实例讲解

    2023-02-10 05:32:08
  • MySQL如何设置某个字段的值自增

    2024-01-27 09:49:09
  • js 数组随机字符串(广告不重复)

    2024-04-18 09:37:20
  • Python 使用os.remove删除文件夹时报错的解决方法

    2021-06-21 00:34:58
  • Python文件操作方法详解

    2023-01-08 14:40:29
  • Python的collections模块真的很好用

    2023-07-15 01:31:36
  • 解决idea git切换多个分支后maven不生效的问题

    2023-06-28 17:48:13
  • Python实战之多种音乐格式批量转换

    2023-07-12 20:24:42
  • MySQL查询不含周末的五天前的日期

    2008-11-11 12:28:00
  • 关于php开启错误提示的总结

    2023-11-04 10:46:21
  • Flask框架 CSRF 保护实现方法详解

    2021-07-05 08:27:05
  • python3.6连接mysql数据库及增删改查操作详解

    2024-01-23 22:27:27
  • Python自动化办公之Excel数据的写入

    2022-07-10 09:29:34
  • Python实现PS滤镜Fish lens图像扭曲效果示例

    2022-02-01 05:25:02
  • Vue中qs插件的使用详解

    2023-07-02 17:07:06
  • PHP微信开发之查询微信精选文章

    2023-11-14 12:45:54
  • js不能获取隐藏的div的宽度只能先显示后获取

    2024-04-17 10:25:17
  • 数据库的选择原则是什么?

    2010-07-14 21:05:00
  • asp之家 网络编程 m.aspxhome.com