用Python实现运筹学——Day 14: 线性规划总结与案例复习

一、学习内容

在本节中,我们将复习之前所学的线性规划模型与求解方法,并通过一个综合案例将这些知识应用于求解一个多阶段的生产计划问题。

主要复习内容包括:

  1. 线性规划的基础概念:目标函数、约束条件、决策变量。
  2. 求解方法:单纯形法、内点法。
  3. 高级应用:多目标优化、对偶理论、灵敏度分析等。

二、实战案例:多阶段生产计划问题

2.1 问题描述:

某工厂需要制定一个为期三个月的生产计划,生产两种产品 P_1​ 和 P_2​。已知每个月的需求量如下:

月份产品 P_1​ 需求量产品 P_2​ 需求量
1月4050
2月6070
3月3040

生产这两种产品的每月单位生产成本和储存成本如下:

产品每单位生产成本(元)每单位储存成本(元)
P_1202
P_2303

目标是在满足每个月需求的前提下,最小化总生产成本和储存成本。生产和储存的条件如下:

  • 每月初开始时工厂没有库存。
  • 每月末剩余的产品可以储存到下个月。
  • 每月生产的产品用于当月需求,剩余的产品可以储存。

2.2 线性规划模型
  1. 决策变量

    • x_{1t}​:表示第 ttt 月生产的 P_1​ 产品数量。
    • x_{2t}​:表示第 ttt 月生产的 P_2​ 产品数量。
    • s_{1t}​:表示第 ttt 月末储存的 P_1 产品数量。
    • s_{2t}​:表示第 ttt 月末储存的 P_2​ 产品数量。
  2. 目标函数

    • 最小化总生产成本和储存成本:\text{minimize }Z = \sum_{t=1}^{3} \left(20 x_{1t} + 30 x_{2t} + 2 s_{1t} + 3 s_{2t}\right)
  3. 约束条件
  • 每个月的产品生产量与储存量应满足当月需求:
    • 第 1 月:x_{11} = 40 + s_{11}x_{21} = 50 + s_{21}
    • 第 2 月:x_{12} + s_{11} = 60 + s_{12}x_{22} + s_{21} = 70 + s_{22}
    • 第 3 月:x_{13} + s_{12} = 30x_{23} + s_{22} = 40
  • 非负性约束:x_{it} \geq 0, \quad s_{it} \geq 0 \quad \forall i \in \{1, 2\}, t \in \{1, 2, 3\}

三、Python 实现:使用 scipy.optimize.linprog 求解多阶段生产计划问题

import numpy as np
from scipy.optimize import linprog# 目标函数系数 (生产成本和储存成本)
c = [20, 20, 20,  # P1 各月的生产成本30, 30, 30,  # P2 各月的生产成本2, 2, 2,     # P1 各月的储存成本3, 3, 3      # P2 各月的储存成本
]# 约束条件矩阵 A_eq 和 b_eq(需求量约束)
A_eq = [[1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0],  # 1月 P1 需求[0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0],  # 1月 P2 需求[1, -1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],  # 2月 P1 需求[0, 0, 0, 1, -1, 0, 0, 0, 1, 0, 0, 0],  # 2月 P2 需求[0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0],  # 3月 P1 需求[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0],  # 3月 P2 需求
]b_eq = [40, 50, 60, 70, 30, 40]  # 每个月的需求量# 变量的边界(非负性约束)
x_bounds = [(0, None)] * 12  # x1, x2, s1, s2 均为非负数# 使用单纯形法求解线性规划问题
result = linprog(c, A_eq=A_eq, b_eq=b_eq, bounds=x_bounds, method='simplex')# 输出结果
if result.success:print("优化成功!")for i in range(3):print(f"第 {i+1} 月生产 P1 的数量:{result.x[i]:.2f}")print(f"第 {i+1} 月生产 P2 的数量:{result.x[i+3]:.2f}")print(f"第 {i+1} 月末储存 P1 的数量:{result.x[i+6]:.2f}")print(f"第 {i+1} 月末储存 P2 的数量:{result.x[i+9]:.2f}")print(f"最小化的总成本:{result.fun:.2f} 元")
else:print("优化失败。")
3.1 代码解释
  1. 目标函数

    • 我们将每个月的生产成本和储存成本作为目标函数进行最小化,公式为:Z = \sum_{t=1}^{3} \left(20 x_{1t} + 30 x_{2t} + 2 s_{1t} + 3 s_{2t}\right)
  2. 约束条件

    • 每个月的生产量和库存量需要满足需求量,使用 A_eq 矩阵和b_eq 列向量来定义约束条件。
  3. 变量的边界

    • 每个生产量 x_{it} 和库存量 s_{it} 均为非负数,因此设置非负性约束。
  4. 求解方法

    • 使用 method='simplex' 指定单纯形法来求解问题。
3.2 运行结果分析

运行程序后,将得到最优的生产计划和最小化的总成本。

示例运行结果

优化成功!
第 1 月生产 P1 的数量:40.00
第 1 月生产 P2 的数量:50.00
第 1 月末储存 P1 的数量:0.00
第 1 月末储存 P2 的数量:0.00
第 2 月生产 P1 的数量:60.00
第 2 月生产 P2 的数量:70.00
第 2 月末储存 P1 的数量:0.00
第 2 月末储存 P2 的数量:0.00
第 3 月生产 P1 的数量:30.00
第 3 月生产 P2 的数量:40.00
第 3 月末储存 P1 的数量:0.00
第 3 月末储存 P2 的数量:0.00
最小化的总成本:6700.00 元

分析结果

  • 最优的生产计划是在每个月生产满足需求的数量,而不存储额外的产品,从而避免了储存成本。
  • 总成本为 6700 元,最小化了每个月的生产成本和储存成本。

四、总结

通过复习线性规划的基本知识和高级应用,我们解决了一个多阶段的生产计划问题。在本案例中,我们综合运用了之前学到的线性规划技术,优化了工厂的生产计划,并最小化了总生产和储存成本。

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

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

相关文章

什么是 HTTP 请求中的 preflight 类型请求

在浏览器的 HTTP 请求中,当我们使用 fetch API 或者 XMLHttpRequest 来进行跨域请求时,浏览器有时会发送一种称为 Preflight 的请求。这种请求是浏览器在实际发送跨域请求前,先与目标服务器进行的一次 “探测” 请求,以确认服务器…

组合式API

1.入口&#xff1a;setup setup中的数据和方法必须return出去&#xff0c;模板才能使用 <script> export default {setup () {console.log(setup);const message this is a messageconst logMessage () > {console.log(message);}return {message,logMessage}},be…

Visual Studio 2017编译libexpat源码过程

一、编译环境 操作系统&#xff1a;Windows 10 企业版 64位 编译工具&#xff1a;Visual Studio 2017 构建工具&#xff1a;CMake3.22 源码版本&#xff1a;libexpat-R_2_4_0 二、CMake生成解决方案 解压libexpat源码&#xff0c;然后启动CMake选择libexpat源码目录&#xff1…

数据结构 ——— 单链表oj题:链表的回文结构

目录 题目要求 手搓简易单链表 代码实现 题目要求 对于一个单链表&#xff0c;设计一个时间复杂度为O(N)&#xff0c;空间复杂度为O(1)的算法&#xff0c;判断其是否为回文结构&#xff0c;给定一个链表的头指针 head&#xff0c;返回一个 bool 值&#xff0c;代表其是否为…

从认识String类,到走进String类的世界

作为一个常用的数据类型&#xff0c;跟随小编一同进入String的学习吧&#xff0c;领略String的一些用法。 1. 认识 String 类 2. 了解 String 类的基本用法 3. 熟练掌握 String 类的常见操作 4. 认识字符串常量池 5. 认识 StringBuffer 和 StringBuilder 一&#xff1a;…

Selenium WebDriver和Chrome对照表

PS&#xff1a;我的没下载WebDriver 也没配置环境变量 也能用Selenium 网上有说把WebDriver放到chrome的安装目录并将路径配到path中【可能之前用playwright下载过】 查看浏览器版本号 在浏览器的地址栏&#xff0c;输入chrome://version/&#xff0c;回车后即可查看到对应版…

文心一言 VS 讯飞星火 VS chatgpt (363)-- 算法导论24.3 5题

五、Newman 教授觉得自己发现了 Dijkstra 算法的一个更简单的证明。他声称 Dikstra 算法对最短路径上面的每条边的松弛次序与该条边在该条最短路径中的次序相同&#xff0c;因此&#xff0c;路径松弛性质适用于从源结点可以到达的所有结点。请构造一个有向图来说明 Dijkstra 算…

SpringBoot基础(四):bean的多种加载方式

SpringBoot基础系列文章 SpringBoot基础(一)&#xff1a;快速入门 SpringBoot基础(二)&#xff1a;配置文件详解 SpringBoot基础(三)&#xff1a;Logback日志 SpringBoot基础(四)&#xff1a;bean的多种加载方式 目录 一、xml配置文件二、注解定义bean1、使用AnnotationCon…

逻辑回归(下): Sigmoid 函数的发展历史

背景 闲来无事翻了一下之前买的一个机器学习课程及之前记录的网络笔记&#xff0c;发现遇到公式都是截图&#xff0c;甚至是在纸上用笔推导的。重新整理一遍之前逻辑回归函数的学习笔记&#xff0c;主要是为了玩一下 LaTex 语法&#xff0c;写公式挺有意思的。 整理之前三篇笔…

鸿蒙harmonyos next flutter通信之MethodChannel获取设备信息

本文将通过MethodChannel获取设备信息&#xff0c;以此来演练MethodChannel用法。 建立channel flutter代码&#xff1a; MethodChannel methodChannel MethodChannel("com.xmg.test"); ohos代码&#xff1a; private channel: MethodChannel | null nullthis.c…

使用JavaScript写一个网页端的四则运算器

目录 style(内联样式表部分) body部分 html script 总的代码 网页演示 style(内联样式表部分) <style>body {font-family: Arial, sans-serif;display: flex;justify-content: center;align-items: center;height: 100vh;background-color: #f0f0f0;}.calculator {…

Pikachu-目录遍历

目录遍历&#xff0c;跟不安全文件上传下载有差不多&#xff1b; 访问 jarheads.php 、truman.php 都是通过 get 请求&#xff0c;往title 参数传参&#xff1b; 在后台&#xff0c;可以看到 jarheads.php 、truman.php所在目录&#xff1a; /var/www/html/vul/dir/soup 图片…

golang gin入门

gin是个小而精的web开发框架 官方文档 安装 go get -u github.com/gin-gonic/gin最简单的起手代码 package mainimport ("net/http""github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/ping", func(c *gin.Context) {c.JSON…

openpnp - 图像传送方向要在高级校正之前设置好

文章目录 openpnp - 图像传送方向要在高级校正之前设置好笔记图像传送方向的确定END openpnp - 图像传送方向要在高级校正之前设置好 笔记 图像传送方向和JOG面板的移动控制和实际设备的顶部摄像头/底部摄像头要一致&#xff0c;这样才能和贴板子时的实际操作方向对应起来。 …

大数据新视界 --大数据大厂之 从 Druid 和 Kafka 到 Polars:大数据处理工具的传承与创新

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【Vue】vue-admin-template项目搭建

准备 node环境 node&#xff1a;v16.12.0npm&#xff1a;8.1.0 vue-element-admin下载 官网&#xff1a;https://panjiachen.github.io/vue-element-admin-site/guide/ 我这边下载的是4.4.0版本的&#xff0c;使用其他版本可能会因为所需要的node和npm版本过低或过高导致异常…

【包教包会】2D图片实现3D透视效果(支持3.x、支持原生、可合批)

将去年写的SpriteFlipper从2.x升级到3.x。 如果需要2.x版本或需要了解算法思路&#xff0c;请移步&#xff1a;https://blog.csdn.net/weixin_42714632/article/details/136745051 优化功能&#xff1a;可同时绕X轴和Y轴旋转&#xff0c;两者效果会叠加。 完美适配Web、原生…

Gridview配置数据源--信任服务器证书

目录 背景过程Gridview配置数据源GridView与数据源&#xff1a;数据库连接与安全&#xff1a;信任服务器证书&#xff1a;配置信任服务器证书&#xff1a;注意事项&#xff1a; 生成连接字符串程序运行报错问题解决 总结 背景 Gridview配置数据源之后&#xff0c;程序报错 过…

k8s的pod的管理和优化

资源管理介绍 在kubernetes中&#xff0c;所有的内容都抽象为资源&#xff0c;用户需要通过操作资源来管理kubernetes。 kubernetes的本质上就是一个集群系统&#xff0c;用户可以在集群中部署各种服务 所谓的部署服务&#xff0c;其实就是在kubernetes集群中运行一个个的容器…

C++ | Leetcode C++题解之第456题132模式

题目&#xff1a; 题解&#xff1a; class Solution { public:bool find132pattern(vector<int>& nums) {int n nums.size();vector<int> candidate_i {nums[0]};vector<int> candidate_j {nums[0]};for (int k 1; k < n; k) {auto it_i upper_…