Python数学建模PuLP库线性规划进阶基于字典详解

目录
  • 1、基于字典的创建规划问题
  • 2、线性规划问题案例
  • 3、建立模型
    • (1)决策变量
    • (2)目标函数
    • (3)约束条件
    • (4)变量取值范围
  • 4、PuLP 程序1:使用 LpVariable 逐一定义变量
  • 5、PuLP 程序2:使用 dict 定义决策变量和约束条件
  • 6、Python程序和运行结果

1、基于字典的创建规划问题

上篇中介绍了使用 LpVariable 对逐一定义每个决策变量,设定名称、类型和上下界,类似地对约束条件也需要逐一设置模型参数。在大规模的规划问题中,这样逐个定义变量和设置模型参数非常繁琐,效率很低。Pulp 库提供了一种快捷方式,可以结合 Python语言的循环和容器,使用字典来创建问题。

-(1)使用快捷方法建立一个规划问题,可以用字典类型(dict) 建立多个变量,例如:

name = [‘废料1', ‘废料2', ‘废料3', ‘废料4', ‘镍', ‘铬', ‘钼']
  # A dictionary of the costs of each of the Ingredients is created
  mass = pulp.LpVariable.dicts(“原料”, material, lowBound=0, cat=‘Continuous')

-(2)使用字典类型(dict) 设置目标函数和约束条件的参数,例如:

cost = {
      ‘废料1': 16,
      ‘废料2': 10,
      ‘废料3': 8,
      ‘废料4': 9,
      ‘镍': 48,
      ‘铬': 60,
      ‘钼': 53}

-(3)使用 遍历循环结构 设置目标函数和约束条件,例如:

AlloyModel += pulp.lpSum([cost[item] * mass[item] for item in material]), “总生产成本”
  AlloyModel += pulp.lpSum([mass[item] for item in material]) == 1000, “质量约束”

2、线性规划问题案例

本篇以合金钢材生产投料问题为例,分析基于列表和字典创建问题的快捷方法。

问题描述:
  某钢铁厂通过熔炼回收的金属废料并添加一定新料的方法生产满足化学成分要求的合金,计划生产1000千克的合金。
  所有金属废料的主要成分是铁,不同金属废料还含有各种微量元素。
  金属废料、新料的各组分含量占比、可用数量和单位成本如下表所示。生成合金中各组分的含量要求,也如表中所示。
  问如何安排投料比例,在满足合金组分含量要求的条件下的材料成本最小?

材料 可用量 成本
废料1 0.80 18.0 12.0 0.0 75 16
废料2 0.70 3.2 1.1 0.1 250 10
废料3 0.85 0 0 0 不限 8
废料4 0.40 0 0 0 不限 9
0 100 0 0 不限 48
0 0 100 0 不限 60
0 0 0 100 不限 53
合金下限 0.65 3.0 1.0 1.1 / /
合金上限 0.75 3.5 1.2 1.3 / /

3、建立模型

(1)决策变量

x1:废料 1 用量(千克)
x2:废料 2 用量(千克)
x3:废料 3 用量(千克)
x4:废料 4 用量(千克)
x5:原料镍 用量(千克)
x6:原料铬 用量(千克)
x7:原料钼 用量(千克)

(2)目标函数

min cost = 16*x1 + 10*x2 + 8*x3 + 9*x4 + 48*x5 + 60*x6 + 53*x7

(3)约束条件

0.8*x1 + 0.7*x2 + 0.85*x3 + 0.40*x4 >= 0.65*1000
0.8*x1 + 0.7*x2 + 0.85*x3 + 0.40*x4 <= 0.75*1000
18.0*x1 + 3.2*x2 + 100.0*x5 >= 3.0*1000
18.0*x1 + 3.2*x2 + 100.0*x5 <= 3.5*1000
12.0*x1 + 1.1*x2 + 100.0*x6 >= 1.0*1000
12.0*x1 + 1.1*x2 + 100.0*x6 >= 1.2*1000
0.1*x2 + 100.0*x7 >= 1.1*1000
0.1*x2 + 100.0*x7 >= 1.3*1000

(4)变量取值范围

xi >= 0, i=1,2,…7
x1 <= 75, x2 <= 250

4、PuLP 程序1:使用 LpVariable 逐一定义变量

本程序与上篇的方法相同,使用 LpVariable 逐一定义变量。完整的程序代码如下:

    import pulp      # 导入 pulp库
    # 1.建立优化问题 AlloyLP: 求最小值(LpMinimize)
    AlloyLP = pulp.LpProblem("合金生产材料优化", sense=pulp.LpMinimize)    # 定义问题,求最小值
    # 2.定义决策变量 x1~x7
    x1 = pulp.LpVariable('废料1#', lowBound=0, upBound=75.0, cat='Continuous')  # 定义 x1
    x2 = pulp.LpVariable('废料2#', lowBound=0, upBound=250., cat='Continuous')  # 定义 x2
    x3 = pulp.LpVariable('废料3#', lowBound=0, cat='Continuous')  # 定义 x3
    x4 = pulp.LpVariable('废料4#', lowBound=0, cat='Continuous')  # 定义 x4
    x5 = pulp.LpVariable('原料镍', lowBound=0, cat='Continuous')  # 定义 x5
    x6 = pulp.LpVariable('原料铬', lowBound=0, cat='Continuous')  # 定义 x6
    x7 = pulp.LpVariable('原料钼', lowBound=0, cat='Continuous')  # 定义 x7
    # 3.定义目标函数 cost
    AlloyLP += (16*x1 + 10*x2 + 8*x3 + 9*x4 + 48*x5 + 60*x6 + 53*x7)  # 投料成本
    # 4.设置约束条件
    AlloyLP += (x1 + x2 + x3 + x4 + x5 + x6 + x7 == 1000)  # 等式约束
    AlloyLP += (0.8*x1 + 0.7*x2 + 0.85*x3 + 0.4*x4 >= 0.65*1000)  # 不等式约束
    AlloyLP += (0.8*x1 + 0.7*x2 + 0.85*x3 + 0.4*x4 <= 0.75*1000)  # 不等式约束
    AlloyLP += (18.0*x1 + 3.2*x2 + 100.0*x5 >= 3.0*1000)  # 不等式约束
    AlloyLP += (18.0*x1 + 3.2*x2 + 100.0*x5 <= 3.5*1000)  # 不等式约束
    AlloyLP += (12.0*x1 + 1.1*x2 + 100.0*x6 >= 1.0*1000)  # 不等式约束
    AlloyLP += (12.0*x1 + 1.1*x2 + 100.0*x6 <= 1.2*1000)  # 不等式约束
    AlloyLP += (0.1*x2 + 100.0*x7 >= 1.1*1000)  # 不等式约束
    AlloyLP += (0.1*x2 + 100.0*x7 <= 1.3*1000)  # 不等式约束
    AlloyLP += (x1 + x2 + x3 + x4 + x5 + x6 + x7 == 1000)  # 等式约束
    # 5.求解线性规划问题
    AlloyLP.solve()
    # 6.输出优化结果
    print(AlloyLP)  # 输出问题设定参数和条件
    # print("求解状态:", pulp.LpStatus[AlloyLP.status])  # 输出求解状态
    for v in AlloyLP.variables():
        print(v.name, " = ", v.varValue)  # 输出每个变量的最优值
    print("最小材料成本 = ", pulp.value(AlloyLP.objective))  # 输出最优解的目标函数值
    # = 关注 Youcans,分享原创系列 https://blog.csdn.net/youcans =

5、PuLP 程序2:使用 dict 定义决策变量和约束条件

本程序使用 dict 定义变量、目标函数和约束条件参数,便于复杂问题的参数设定。

    import pulp      # 导入 pulp库
    # 1.建立优化问题 AlloyLP: 求最小值(LpMinimize)
    AlloyLP = pulp.LpProblem("合金生产材料优化", sense=pulp.LpMinimize)    # 定义问题,求最小值
    # 2.定义决策变量 x1~x7
    x1 = pulp.LpVariable('废料1#', lowBound=0, upBound=75.0, cat='Continuous')  # 定义 x1
    x2 = pulp.LpVariable('废料2#', lowBound=0, upBound=250., cat='Continuous')  # 定义 x2
    x3 = pulp.LpVariable('废料3#', lowBound=0, cat='Continuous')  # 定义 x3
    x4 = pulp.LpVariable('废料4#', lowBound=0, cat='Continuous')  # 定义 x4
    x5 = pulp.LpVariable('原料镍', lowBound=0, cat='Continuous')  # 定义 x5
    x6 = pulp.LpVariable('原料铬', lowBound=0, cat='Continuous')  # 定义 x6
    x7 = pulp.LpVariable('原料钼', lowBound=0, cat='Continuous')  # 定义 x7
    # 3.定义目标函数 cost
    AlloyLP += (16*x1 + 10*x2 + 8*x3 + 9*x4 + 48*x5 + 60*x6 + 53*x7)  # 投料成本
    # 4.设置约束条件
    AlloyLP += (x1 + x2 + x3 + x4 + x5 + x6 + x7 == 1000)  # 等式约束
    AlloyLP += (0.8*x1 + 0.7*x2 + 0.85*x3 + 0.4*x4 >= 0.65*1000)  # 不等式约束
    AlloyLP += (0.8*x1 + 0.7*x2 + 0.85*x3 + 0.4*x4 <= 0.75*1000)  # 不等式约束
    AlloyLP += (18.0*x1 + 3.2*x2 + 100.0*x5 >= 3.0*1000)  # 不等式约束
    AlloyLP += (18.0*x1 + 3.2*x2 + 100.0*x5 <= 3.5*1000)  # 不等式约束
    AlloyLP += (12.0*x1 + 1.1*x2 + 100.0*x6 >= 1.0*1000)  # 不等式约束
    AlloyLP += (12.0*x1 + 1.1*x2 + 100.0*x6 <= 1.2*1000)  # 不等式约束
    AlloyLP += (0.1*x2 + 100.0*x7 >= 1.1*1000)  # 不等式约束
    AlloyLP += (0.1*x2 + 100.0*x7 <= 1.3*1000)  # 不等式约束
    AlloyLP += (x1 + x2 + x3 + x4 + x5 + x6 + x7 == 1000)  # 等式约束
    # 5.求解线性规划问题
    AlloyLP.solve()
    # 6.输出优化结果
    print(AlloyLP)  # 输出问题设定参数和条件
    # print("求解状态:", pulp.LpStatus[AlloyLP.status])  # 输出求解状态
    for v in AlloyLP.variables():
        print(v.name, " = ", v.varValue)  # 输出每个变量的最优值
    print("最小材料成本 = ", pulp.value(AlloyLP.objective))  # 输出最优解的目标函数值
    # = 关注 Youcans,分享原创系列 https://blog.csdn.net/youcans =

6、Python程序和运行结果

程序 1 和程序 2 的运行结果完全相同,结果如下:

Welcome to the CBC MILP Solver
Version: 2.9.0
Build Date: Feb 12 2015
钢材生产问题:
MINIMIZE
16*原料_废料1 + 10*原料_废料2 + 8*原料_废料3 + 9*原料_废料4 + 53*原料_钼 + 60*原料_铬 + 48*原料_镍 + 0
SUBJECT TO
质量约束: 原料_废料1 + 原料_废料2 + 原料_废料3 + 原料_废料4 + 原料_钼 + 原料_铬 + 原料_镍 = 1000
碳最小占比: 0.8 原料_废料1 + 0.7 原料_废料2 + 0.85 原料_废料3 + 0.4 原料_废料4 >= 650
碳最大占比: 0.8 原料_废料1 + 0.7 原料_废料2 + 0.85 原料_废料3 + 0.4 原料_废料4 <= 750
镍最小占比: 18 原料_废料1 + 3.2 原料_废料2 + 100 原料_镍 >= 3000
镍最大占比: 18 原料_废料1 + 3.2 原料_废料2 + 100 原料_镍 <= 3500
铬最小占比: 12 原料_废料1 + 1.1 原料_废料2 + 100 原料_铬 >= 1000
铬最大占比: 12 原料_废料1 + 1.1 原料_废料2 + 100 原料_铬 <= 1200
钼最小占比: 0.1 原料_废料2 + 100 原料_钼 >= 1100
钼最大占比: 0.1 原料_废料2 + 100 原料_钼 <= 1300
废料1可用量: 原料_废料1 <= 75
废料2可用量: 原料_废料2 <= 250
VARIABLES
原料_废料1 Continuous
原料_废料2 Continuous
原料_废料3 Continuous
原料_废料4 Continuous
原料_钼 Continuous
原料_铬 Continuous
原料_镍 Continuous
优化状态: Optimal
原料_废料1 = 75.0
原料_废料2 = 90.909091
原料_废料3 = 672.28283
原料_废料4 = 137.30808
原料_钼 = 10.909091
原料_铬 = 0.0
原料_镍 = 13.590909
最优总成本 =  9953.671725000002

以上就是Python数学建模PuLP库线性规划进阶基于字典详解的详细内容,更多关于数学建模PuLP库线性规划的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python数学建模StatsModels统计回归模型数据的准备

    目录 1.读取数据文件 (1)读取 .csv 文件: (2)读取 .xls 文件: (3)读取 .txt 文件: 2.数据文件的拆分与合并 (1)将 Excel 文件分割为多个文件 (2)将 多个 Excel 文件合并为一个文件 3.数据的预处理 (1)缺失数据的处理 (2)重复数据的处理 (3)异常值处理 4.Python 例程(Statsmodels) 4.1 问题描述 4.2 Python 程序 4.3 程序运行结果: 版权说明: 1.读取数据文件 回归分析问题所用的数据都是保存在数据文件

  • python statsmodel的使用

    1.Pandas Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,相当于这是Python官方自己的一套库 statsmodel是基于Pandas开发的一套库,用于一些描述统计.统计模型估计.推断.预测 2.自回归模型(AutoRegression model,AR) 自回归,从物理的角度来理解就是:当前记录与其历史记录的差值.eg,自回归认为历史的发展是一条斜率一定的直线. 3.滑动平均模型(moving average model, M

  • Python数学建模PuLP库线性规划实际案例编程详解

    目录 1.问题描述 2.用PuLP 库求解线性规划 2.1 问题 1 (1)数学建模 (2)Python 编程 (3)运行结果 2.2 问题 2 (1)数学建模 (2)Python 编程 (3)运行结果 2.3 问题 3 (1)数学建模 (2)Python 编程 (3)运行结果 2.4 问题 4 (1)数学建模 (2)Python 编程 (3)运行结果 2.5 问题 5:整数规划问题 (1)数学建模 (2)Python 编程 (3)运行结果 1.问题描述 某厂生产甲乙两种饮料,每百箱甲饮料需用原

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

    目录 1.什么是线性规划 2.PuLP 库求解线性规划 -(0)导入 PuLP库函数 -(1)定义一个规划问题 -(2)定义决策变量 -(3)添加目标函数 -(4)添加约束条件 -(5)求解 3.Python程序和运行结果 1.什么是线性规划 线性规划(Linear programming),在线性等式或不等式约束条件下求解线性目标函数的极值问题,常用于解决资源分配.生产调度和混合问题.例如: max fx = 2*x1 + 3*x2 - 5*x3 s.t. x1 + 3*x2 + x3 <=

  • Python数学建模PuLP库线性规划进阶基于字典详解

    目录 1.基于字典的创建规划问题 2.线性规划问题案例 3.建立模型 (1)决策变量 (2)目标函数 (3)约束条件 (4)变量取值范围 4.PuLP 程序1:使用 LpVariable 逐一定义变量 5.PuLP 程序2:使用 dict 定义决策变量和约束条件 6.Python程序和运行结果 1.基于字典的创建规划问题 上篇中介绍了使用 LpVariable 对逐一定义每个决策变量,设定名称.类型和上下界,类似地对约束条件也需要逐一设置模型参数.在大规模的规划问题中,这样逐个定义变量和设置模型

  • Python数学建模StatsModels统计回归之线性回归示例详解

    目录 1.背景知识 1.1 插值.拟合.回归和预测 1.2 线性回归 2.Statsmodels 进行线性回归 2.1 导入工具包 2.2 导入样本数据 2.3 建模与拟合 2.4 拟合和统计结果的输出 3.一元线性回归 3.1 一元线性回归 Python 程序: 3.2 一元线性回归 程序运行结果: 4.多元线性回归 4.1 多元线性回归 Python 程序: 4.2 多元线性回归 程序运行结果: 5.附录:回归结果详细说明 1.背景知识 1.1 插值.拟合.回归和预测 插值.拟合.回归和预测

  • python中h5py开源库的使用样例详解

    目录 一.h5py模块介绍 二.h5py模块使用 1.h5py接口简单介绍 2.h5py的使用样例 一.h5py模块介绍 本文只是简单的对h5py库的基本创建文件,数据集和读取数据的方式进行介绍!如果读者需要进一步详细的学习h5py的更多知识,请参考h5py的官方文档. h5py简单介绍 一个HDF5文件是一种存放两类对象的容器:dataset和group. Dataset是类似于数组的数据集,而group是类似文件夹一样的容器,它好比python中的字典,有键(key)和值(value),存放

  • 浅谈Python数学建模之线性规划

    目录 一.求解方法.算法和编程方案 1.1.线性规划问题的求解方法 1.2.线性规划的最快算法 1.3.选择适合自己的编程方案 二.PuLP库求解线性规划问题 2.1.线性规划问题的描述 2.2.PuLP 求解线性规划问题的步骤 2.3.Python例程:线性规划问题 三.小结 一.求解方法.算法和编程方案 线性规划 (Linear Programming,LP) 是很多数模培训讲的第一个算法,算法很简单,思想很深刻. 线性规划问题是中学数学的内容,鸡兔同笼就是一个线性规划问题.数学规划的题目在

  • Python数学建模库StatsModels统计回归简介初识

    目录 1.关于 StatsModels 2.文档 3.主要功能 4.获取和安装 1.关于 StatsModels statsmodels(http://www.statsmodels.org)是一个Python库,用于拟合多种统计模型,执行统计测试以及数据探索和可视化. 2.文档 最新版本的文档位于: https://www.statsmodels.org/stable/ 3.主要功能 1.线性回归模型: 普通最小二乘法 广义最小二乘法 加权最小二乘法 具有自回归误差的最小二乘法 分位数回归 递

  • 浅谈Python数学建模之固定费用问题

    目录 一.固定费用问题案例解析 1.1.固定费用问题(Fixed cost problem) 1.2.案例问题描述 1.3.建模过程分析 1.4.PuLP 求解固定费用问题的编程 1.5.Python 例程:固定费用问题 1.6.Python 例程运行结果 二.PuLP 求解规划问题的快捷方法 2.1.PuLP 求解固定费用问题的编程 2.2.Python 例程:PuLP 快捷方法 2.3.Python 例程运行结果 一.固定费用问题案例解析 1.1.固定费用问题(Fixed cost prob

  • 浅谈Python数学建模之整数规划

    目录 一.从线性规划到整数规划 1.1.为什么会有整数规划? 1.2.四舍五入就能得到整数解吗? 二.整数规划的求解方法 2.1.分支定界法(Branch and bound) 2.2.割平面法(Cutting plane) 2.3.整数规划的编程方案 三.PuLP 求解整数规划问题 3.1.案例问题描述 3.2.建模过程分析 3.2.1.问题定义 3.2.2.模型构建 3.2.3.模型求解 3.3.Python 例程 3.4.Python 例程运行结果 一.从线性规划到整数规划 1.1.为什么

  • Python数学建模学习模拟退火算法整数规划问题示例解析

    目录 1.整数规划问题 2.模拟退火算法处理整数约束 3.数模案例 3.1 问题描述: 3.2 问题分析: 3.3 问题建模: 3.4 惩罚函数法求解约束优化问题: 4.模拟退火算法 Python 程序:求解整数规划问题 5.运行结果 参考文献: 1.整数规划问题 线性规划问题的最优解可能是分数或小数.但很多实际问题常常要求某些变量必须是整数解,例如:机器的台数.工作的人数或装货的车数.根据对决策变量的不同要求,整数规划又可以分为:纯整数规划.混合整数规划.0-1整数规划.混合0-1规划. 整数

随机推荐