Python数模笔记-PuLP库(2)线性规划进阶



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, “质量约束”

详细用法参见下节例程。
  
欢迎关注 Youcans 原创系列,每周更新数模笔记
Python数模笔记-PuLP库
Python数模笔记-StatsModels统计回归
Python数模笔记-Sklearn
Python数模笔记-NetworkX
Python数模笔记-模拟退火算法

2、线性规划问题案例

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

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

材料可用量成本
废料10.8018.012.00.07516
废料20.703.21.10.125010
废料30.85000不限8
废料40.40000不限9
010000不限48
001000不限60
000100不限53
合金下限0.653.01.01.1//
合金上限0.753.51.21.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~x7x1 = pulp.LpVariable('废料1#', lowBound=0, upBound=75.0, cat='Continuous')  # 定义 x1x2 = pulp.LpVariable('废料2#', lowBound=0, upBound=250., cat='Continuous')  # 定义 x2x3 = pulp.LpVariable('废料3#', lowBound=0, cat='Continuous')  # 定义 x3x4 = pulp.LpVariable('废料4#', lowBound=0, cat='Continuous')  # 定义 x4x5 = pulp.LpVariable('原料镍', lowBound=0, cat='Continuous')  # 定义 x5x6 = pulp.LpVariable('原料铬', lowBound=0, cat='Continuous')  # 定义 x6x7 = pulp.LpVariable('原料钼', lowBound=0, cat='Continuous')  # 定义 x7# 3.定义目标函数 costAlloyLP += (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库= 关注 Youcans,分享原创系列 https://blog.csdn.net/youcans =# 1. 建立问题AlloyModel = pulp.LpProblem("钢材生产问题", pulp.LpMinimize)# 2. 建立变量material = ['废料1', '废料2', '废料3', '废料4', '镍', '铬', '钼']mass = pulp.LpVariable.dicts("原料", material, lowBound=0, cat='Continuous')# 3. 设置目标函数cost = {'废料1': 16,'废料2': 10,'废料3': 8,'废料4': 9,'镍': 48,'铬': 60,'钼': 53}AlloyModel += pulp.lpSum([cost[item] * mass[item] for item in material]), "总生产成本"# # 4. 施加约束carbonPercent = {'废料1': 0.8,'废料2': 0.7,'废料3': 0.85,'废料4': 0.4,'镍': 0,'铬': 0,'钼': 0}NiPercent = {'废料1': 18,'废料2': 3.2,'废料3': 0,'废料4': 0,'镍': 100,'铬': 0,'钼': 0}CrPercent = {'废料1': 12,'废料2': 1.1,'废料3': 0,'废料4': 0,'镍': 0,'铬': 100,'钼': 0}MoPercent = {'废料1': 0,'废料2': 0.1,'废料3': 0,'废料4': 0,'镍': 0,'铬': 0,'钼': 100}AlloyModel += pulp.lpSum([mass[item] for item in material]) == 1000, "质量约束"AlloyModel += pulp.lpSum([carbonPercent[item] * mass[item] for item in material]) >= 0.65*1000, "碳最小占比"AlloyModel += pulp.lpSum([carbonPercent[item] * mass[item] for item in material]) <= 0.75*1000, "碳最大占比"AlloyModel += pulp.lpSum([NiPercent[item] * mass[item] for item in material]) >= 3.0*1000, "镍最小占比"AlloyModel += pulp.lpSum([NiPercent[item] * mass[item] for item in material]) <= 3.5*1000, "镍最大占比"AlloyModel += pulp.lpSum([CrPercent[item] * mass[item] for item in material]) >= 1.0*1000, "铬最小占比"AlloyModel += pulp.lpSum([CrPercent[item] * mass[item] for item in material]) <= 1.2*1000, "铬最大占比"AlloyModel += pulp.lpSum([MoPercent[item] * mass[item] for item in material]) >= 1.1*1000, "钼最小占比"AlloyModel += pulp.lpSum([MoPercent[item] * mass[item] for item in material]) <= 1.3*1000, "钼最大占比"AlloyModel += mass['废料1'] <= 75, "废料1可用量"AlloyModel += mass['废料2'] <= 250, "废料2可用量"# 5. 求解AlloyModel.solve()# 6. 打印结果print(AlloyModel)  # 输出问题设定参数和条件print("优化状态:", pulp.LpStatus[AlloyModel.status])for v in AlloyModel.variables():print(v.name, "=", v.varValue)print("最优总成本 = ", pulp.value(AlloyModel.objective))

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

版权说明:
原创作品= 关注 Youcans,分享原创系列 https://blog.csdn.net/youcans =
Copyright 2021 YouCans, XUPT
Crated:2021-04-28


关注 Youcans,分享原创系列 https://blog.csdn.net/youcans

Python数模笔记-PuLP库(1)线性规划入门
Python数模笔记-PuLP库(2)线性规划进阶
Python数模笔记-PuLP库(3)线性规划实例
Python数模笔记-StatsModels 统计回归(1)简介
Python数模笔记-StatsModels 统计回归(2)线性回归
Python数模笔记-StatsModels 统计回归(3)模型数据的准备
Python数模笔记-StatsModels 统计回归(4)可视化
Python数模笔记-Sklearn (1)介绍
Python数模笔记-Sklearn (2)聚类分析
Python数模笔记-Sklearn (3)主成分分析
Python数模笔记-Sklearn (4)线性回归
Python数模笔记-Sklearn (5)支持向量机
Python数模笔记-模拟退火算法(1)多变量函数优化
Python数模笔记-模拟退火算法(2)约束条件的处理
Python数模笔记-模拟退火算法(3)整数规划问题
Python数模笔记-模拟退火算法(4)旅行商问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt坐标系统与布局的简单入门

&#xfeff;&#xfeff;qt坐标系统 qt坐标系统比较简单 button.setGeometry(20,20,100,100); 上面的代码把按钮显示为父窗口的20,20处宽度为100&#xff0c;高度为100 接下去是布局 qt里面布局需要加入<QLayout.h>这个头文件。 qt里面垂直布局 qt里面的垂直布局…

Python数模笔记-PuLP库(1)线性规划入门

1、什么是线性规划 线性规划&#xff08;Linear programming&#xff09;&#xff0c;在线性等式或不等式约束条件下求解线性目标函数的极值问题&#xff0c;常用于解决资源分配、生产调度和混合问题。例如&#xff1a; max fx 2*x1 3*x2 - 5*x3 s.t. x1 3*x2 x3 < 1…

qt控件基本应用

Qt里面有很多控件&#xff0c;让我们来看一些常用控件。 首先是对pro文件的配置 HEADERS \ MyWidget.h SOURCES \ MyWidget.cpp QTwidgets gui CONFIG c11 因为要用到lambda所以要加一个CONFIGc11 下面是MyWidget.h #ifndef MYWIDGET_H #define MYWIDGET_H#include &…

Python数模笔记-PuLP库(3)线性规划实例

本节以一个实际数学建模案例&#xff0c;讲解 PuLP 求解线性规划问题的建模与编程。 1、问题描述 某厂生产甲乙两种饮料&#xff0c;每百箱甲饮料需用原料6千克、工人10名&#xff0c;获利10万元&#xff1b;每百箱乙饮料需用原料5千克、工人20名&#xff0c;获利9万元。 今工…

深度学习资料整理

本文是转载了别人的博客&#xff0c;然后还加上了自己到淘宝上买的百度云盘资料(还包括一些数据挖掘&#xff0c;大数据之类的教程)。 编者按&#xff1a;本文收集了百来篇关于机器学习和深度学习的资料&#xff0c;含各种文档&#xff0c;视频&#xff0c;源码等。而且原文也会…

Python数模笔记-模拟退火算法(1)多变量函数优化

1、模拟退火算法 模拟退火算法借鉴了统计物理学的思想&#xff0c;是一种简单、通用的启发式优化算法&#xff0c;并在理论上具有概率性全局优化性能&#xff0c;因而在科研和工程中得到了广泛的应用。 退火是金属从熔融状态缓慢冷却、最终达到能量最低的平衡态的过程。模拟退…

Python数模笔记-模拟退火算法(2)约束条件的处理

1、最优化与线性规划 最优化问题的三要素是决策变量、目标函数和约束条件。 线性规划&#xff08;Linear programming&#xff09;&#xff0c;是研究线性约束条件下线性目标函数的极值问题的优化方法&#xff0c;常用于解决利用现有的资源得到最优决策的问题。 简单的线性规…

Python数模笔记-模拟退火算法(3)整数规划问题

1、整数规划问题 整数规划问题在工业、经济、国防、医疗等各行各业应用十分广泛&#xff0c;是指规划中的变量&#xff08;全部或部分&#xff09;限制为整数&#xff0c;属于离散优化问题&#xff08;Discrete Optimization&#xff09;。 线性规划问题的最优解可能是分数或小…

数据结构之算法特性及分类

数据结构之算法特性及分类 算法的特性 1.通用性。2.有效性。3.确定性4.有穷性。基本算法分类 1.穷举法顺序查找K值2.回溯,搜索八皇后&#xff0c;树和图遍历3.递归分治二分查找K值&#xff0c;快速排序&#xff0c;归并排序。4.贪心法Huffman编码树&#xff0c;最短路Dijkstra…

Python数模笔记-模拟退火算法(4)旅行商问题

1、旅行商问题(Travelling salesman problem, TSP) 旅行商问题是经典的组合优化问题&#xff0c;要求找到遍历所有城市且每个城市只访问一次的最短旅行路线&#xff0c;即对给定的正权完全图求其总权重最小的Hamilton回路&#xff1a;设有 n个城市和距离矩阵 D[dij]&#xff0…

神经网络概述

神经网络概述 以监督学习为例&#xff0c;假设我们有训练样本集 &#xff0c;那么神经网络算法能够提供一种复杂且非线性的假设模型 &#xff0c;它具有参数 &#xff0c;可以以此参数来拟合我们的数据。 为了描述神经网络&#xff0c;我们先从最简单的神经网络讲起&#x…

Python数模笔记-StatsModels 统计回归(1)简介

1、关于 StatsModels statsmodels&#xff08;http://www.statsmodels.org&#xff09;是一个Python库&#xff0c;用于拟合多种统计模型&#xff0c;执行统计测试以及数据探索和可视化。 欢迎关注 Youcans 原创系列&#xff0c;每周更新数模笔记 Python数模笔记-PuLP库 Pyth…

Python数模笔记-StatsModels 统计回归(2)线性回归

1、背景知识 1.1 插值、拟合、回归和预测 插值、拟合、回归和预测&#xff0c;都是数学建模中经常提到的概念&#xff0c;而且经常会被混为一谈。 插值&#xff0c;是在离散数据的基础上补插连续函数&#xff0c;使得这条连续曲线通过全部给定的离散数据点。 插值是离散函数…

Python数模笔记-StatsModels 统计回归(3)模型数据的准备

1、读取数据文件 回归分析问题所用的数据都是保存在数据文件中的&#xff0c;首先就要从数据文件读取数据。 数据文件的格式很多&#xff0c;最常用的是 .csv&#xff0c;.xls 和 .txt 文件&#xff0c;以及 sql 数据库文件的读取 。 欢迎关注 Youcans 原创系列&#xff0c;每…

神经网络反向传导算法

假设我们有一个固定样本集 &#xff0c;它包含 个样例。我们可以用批量梯度下降法来求解神经网络。具体来讲&#xff0c;对于单个样例 &#xff0c;其代价函数为&#xff1a; 这是一个&#xff08;二分之一的&#xff09;方差代价函数。给定一个包含 个样例的数据集&#xff…

Python数模笔记-StatsModels 统计回归(4)可视化

1、如何认识可视化&#xff1f; 图形总是比数据更加醒目、直观。解决统计回归问题&#xff0c;无论在分析问题的过程中&#xff0c;还是在结果的呈现和发表时&#xff0c;都需要可视化工具的帮助和支持。  欢迎关注 Youcans 原创系列&#xff0c;每周更新数模笔记 Python数…

梯度检验与高级优化

众所周知&#xff0c;反向传播算法很难调试得到正确结果&#xff0c;尤其是当实现程序存在很多难于发现的bug时。举例来说&#xff0c;索引的缺位错误&#xff08;off-by-one error&#xff09;会导致只有部分层的权重得到训练&#xff0c;再比如忘记计算偏置项。这些错误会使你…

Python数模笔记-Sklearn (1)介绍

1、SKlearn 是什么 Sklearn&#xff08;全称 SciKit-Learn&#xff09;&#xff0c;是基于 Python 语言的机器学习工具包。 Sklearn 主要用Python编写&#xff0c;建立在 Numpy、Scipy、Pandas 和 Matplotlib 的基础上&#xff0c;也用 Cython编写了一些核心算法来提高性能。…

自编码算法与稀疏性

目前为止&#xff0c;我们已经讨论了神经网络在有监督学习中的应用。在有监督学习中&#xff0c;训练样本是有类别标签的。现在假设我们只有一个没有带类别标签的训练样本集合 &#xff0c;其中 。自编码神经网络是一种无监督学习算法&#xff0c;它使用了反向传播算法&#…