用Python实现运筹学——Day 9: 线性规划的灵敏度分析

一、学习内容

1. 灵敏度分析的定义与作用

灵敏度分析(Sensitivity Analysis) 是在优化问题中,分析模型参数变化对最优解及目标函数值的影响。它帮助我们了解在线性规划模型中,当某些参数(如资源供应量、成本系数等)发生变化时,最优解是否会发生变化,以及这种变化的幅度。

灵敏度分析的作用

  • 鲁棒性分析:通过灵敏度分析,决策者可以了解模型对参数变化的敏感程度,确保模型在实际应用中的稳定性。
  • 资源评估:帮助评估资源的稀缺性以及目标函数对资源的依赖程度。
  • 决策优化:通过分析参数变化的影响,决策者可以在实际情况发生改变时做出相应的调整,保持解决方案的最优性。

2. 灵敏度分析的内容

灵敏度分析主要关注以下几个方面:

  • 资源供应的变化:如果某个资源供应量增加或减少,如何影响最优解和总成本?
  • 成本系数的变化:如果生产某个产品的成本上升或下降,最优解如何变化?
  • 约束条件的变化:如果约束条件发生变化,是否会引起可行解集的变化?

二、实战案例:灵敏度分析在资源调度问题中的应用

2.1 问题描述

假设某公司有两种资源用于生产两种产品。该公司的目标是最大化利润。每种产品所需的资源需求和利润如下:

产品每单位利润(元)资源 1 需求(单位)资源 2 需求(单位)
产品 A4021
产品 B3012

可用的资源数量为:

  • 资源 1:100 单位
  • 资源 2:80 单位

公司希望通过生产产品 A 和产品 B 来最大化利润。我们将通过灵敏度分析来评估资源供应量和利润系数的变化对最优解的影响。

2.2 原问题的线性规划模型
  1. 决策变量

    • x_1:生产产品 A 的数量。
    • x_2:生产产品 B 的数量。
  2. 目标函数: 最大化利润:

    Z = 40x_1 + 30x_2
  3. 约束条件

    1. 资源 1 的约束:2x_1 + x_2 \leq 100
    2. 资源 2 的约束:x_1 + 2x_2 \leq 80
    3. 非负性约束:x_1 \geq 0, \quad x_2 \geq 0

三、Python 实现:使用 scipy.optimize.linprog 求解线性规划问题并进行灵敏度分析

我们将使用 scipy 库的 linprog 函数来求解线性规划问题,并分析对资源供应量和成本系数变化的灵敏度。

import numpy as np
from scipy.optimize import linprog# 目标函数系数 (最大化问题转换为最小化,乘以 -1)
c = [-40, -30]  # 利润系数# 约束条件矩阵 A 和 b (左边系数和右边常数)
A = [[2, 1],  # 资源 1 的限制[1, 2]   # 资源 2 的限制
]
b = [100, 80]  # 资源 1 和资源 2 的可用量# 变量的边界(非负性约束)
x_bounds = [(0, None), (0, None)]  # x1 和 x2 均为非负数# 使用单纯形法求解线性规划问题
result = linprog(c, A_ub=A, b_ub=b, bounds=x_bounds, method='simplex')# 输出结果
if result.success:print("优化成功!")print(f"生产产品 A 的数量:{result.x[0]:.2f}")print(f"生产产品 B 的数量:{result.x[1]:.2f}")print(f"最大总利润:{-result.fun:.2f} 元")
else:print("优化失败。")
3.1 代码解释
  1. 目标函数: 由于 linprog 求解的是最小化问题,我们将最大化问题的目标函数系数 40x_1 + 30x_2 乘以 -1,转换为最小化问题,即-40x_1 - 30x_2​。

  2. 约束条件: 我们构造了资源 1 和资源 2 的约束条件矩阵 A和对应的资源数量 b。

  3. 变量的边界x_1 和 x_2​ 均为非负数。

  4. 求解方法: 使用 method='simplex' 指定单纯形法求解。

3.2 运行结果

运行程序后,我们将得到最优的生产数量以及最大化的利润。

示例运行结果:

优化成功!
生产产品 A 的数量:40.00
生产产品 B 的数量:20.00
最大总利润:2200.00 元

分析结果

  • 生产 40 单位的产品 A 和 20 单位的产品 B 可以获得最大利润 2200 元。

3.3 灵敏度分析

我们接下来将分析资源供应量和产品利润系数的变化对最优解的影响。

1. 资源供应量的灵敏度分析

假设我们将资源 1 的供应量从 100 单位增加到 120 单位,重新运行线性规划求解,观察最优解和利润的变化。

# 修改资源 1 的供应量
b_new = [120, 80]# 重新求解
result_new = linprog(c, A_ub=A, b_ub=b_new, bounds=x_bounds, method='simplex')# 输出结果
if result_new.success:print("优化成功!(资源 1 增加到 120 单位)")print(f"生产产品 A 的数量:{result_new.x[0]:.2f}")print(f"生产产品 B 的数量:{result_new.x[1]:.2f}")print(f"最大总利润:{-result_new.fun:.2f} 元")
else:print("优化失败。")

新运行结果:

优化成功!(资源 1 增加到 120 单位)
生产产品 A 的数量:50.00
生产产品 B 的数量:10.00
最大总利润:2300.00 元

分析:

  • 当资源 1 的供应量增加到 120 单位时,生产产品 A 的数量增加到了 50 单位,而产品 B 的数量减少到了 10 单位。
  • 最大利润提高到了 2300 元,这表明资源 1 的稀缺性对利润的影响较大。
2. 利润系数的灵敏度分析

假设产品 A 的利润从 40 元增加到 60 元,重新求解线性规划问题。

# 修改目标函数系数(产品 A 的利润从 40 增加到 60)
c_new = [-60, -30]# 重新求解
result_new_profit = linprog(c_new, A_ub=A, b_ub=b, bounds=x_bounds, method='simplex')# 输出结果
if result_new_profit.success:print("优化成功!(产品 A 利润增加到 60 元)")print(f"生产产品 A 的数量:{result_new_profit.x[0]:.2f}")print(f"生产产品 B 的数量:{result_new_profit.x[1]:.2f}")print(f"最大总利润:{-result_new_profit.fun:.2f} 元")
else:print("优化失败。")

新运行结果:

优化成功!(产品 A 利润增加到 60 元)
生产产品 A 的数量:50.00
生产产品 B 的数量:10.00
最大总利润:3000.00 元

分析:

  • 当产品 A 的利润提高到 60 元时,公司会更多地生产产品 A,生产产品 B 的数量减少。
  • 总利润增加到了 3000 元,说明产品 A 的利润对生产决策有显著影响。

四、总结

灵敏度分析是线性规划中一个重要的分析工具,通过分析参数变化的影响,帮助决策者了解模型对不同资源和成本变化的反应。在实际应用中,灵敏度分析可以用于资源调度、生产优化等场景,为优化决策提供有效的信息。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】数组(下)

6、二维数组的创建 6.1二维数组的概念 通过数组(上)介绍,我们学习了一维数组,数组的元素都是内置类型的,如果我们把一维数组作为数组的元素,这时就是二维数组,以此类推,如果把二维…

Mysql 索引底层数据结构和算法

索引数据结构 索引(index)是帮助MySQL高效获取数据的一种有序数据结构。索引是存储到表空间中,当我们的 sql 中的where条件用到索引的时候,会在存储层就过滤出数据来,如果不走索引,则需要在server层过滤。 …

5分钟学会SPI

SPI 定义:SPI 是一种机制,允许用户在不修改现有代码的情况下扩展和替换特定服务的实现。它定义了一组接口(Service Interfaces)和一组实现(Service Providers),使得应用程序可以动态加载和使用…

Linux:进程控制(一)

目录 一、写时拷贝 1.创建子进程 2.写时拷贝 二、进程终止 1.函数返回值 2.错误码 3.异常退出 4.exit 5._exit 一、写时拷贝 父子进程,代码共享,不作写入操作时,数据也是共享的,当任意一方试图写入,便通过写时拷…

【数学建模国赛】2024年数学建模国赛B题思路分析

学习编程就得循环渐进,扎实基础,勿在浮沙筑高台 循环渐进Forward-CSDN博客 目录 循环渐进Forward-CSDN博客 题目 第一问分析 第二问分析 问题三分析 第四问分析 总结: 第一次参加国赛,侥幸被推送国一参与评奖。在省赛区结…

计网问答大题(期末复习)

计网总结笔记 概述 互联网的 2 个重要基本特点:连通性,资源共享 从互联网的工作方式上看,可以划分为两大块: •边缘部分: 由所有连接在互联网上的主机组成,由用户直接使用,用来进行通信&…

Java 方法前面加 <T> 是做什么?泛型方法 原理、样例

在 Java 中&#xff0c;方法前面加上 <T> 表示该方法是一个泛型方法。泛型方法允许你在方法签名中指定一个或多个类型参数&#xff0c;从而使得该方法可以处理多种类型的对象。这增加了代码的灵活性和复用性。 一、基本语法 <T1, T2, ..., Tn> 返回类型 方法名(形…

pytorch搭建神经网络(手搓方法)

假如我们有一个数据集形状为(348,14)。即有348个记录&#xff0c;每个记录有14个特征值。 我们想要搭建一个如下的神经网络&#xff1a; import torch import numpy as np# 创建数据集: 每个样本有14个特征 x_train np.array([[0.5, -1.2, 0.3, 0.8, 1.0, -0.5, 2.3, 1.2, -0…

基于单片机汽车尾灯控制系统

**单片机设计介绍&#xff0c;基于单片机汽车尾灯控制系统设计 文章目录 前言概要设计思路 软件设计效果图 程序文章目录 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、…

【Kubernetes】常见面试题汇总(五十一)

目录 114. K8S 集群服务访问失败&#xff08;情况一&#xff09;&#xff1f; 115. K8S 集群服务访问失败&#xff08;情况二&#xff09;&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff…

探索未来:hbmqtt,Python中的AI驱动MQTT

文章目录 **探索未来&#xff1a;hbmqtt&#xff0c;Python中的AI驱动MQTT**1. 背景介绍2. hbmqtt是什么&#xff1f;3. 安装hbmqtt4. 简单的库函数使用方法4.1 连接到MQTT服务器4.2 发布消息4.3 订阅主题4.4 接收消息4.5 断开连接 5. 应用场景示例5.1 智能家居控制5.2 环境监测…

3 个简单的微分段项目

与许多大型网络安全项目一样&#xff0c;微分段似乎很复杂、耗时且成本高昂。 它涉及管理有关设备间服务连接的复杂细节。 一台 Web 服务器应连接到特定数据库&#xff0c;但不连接到其他数据库&#xff0c;或者负载平衡器应连接到某些 Web 服务器&#xff0c;同时限制与其他…

鸿蒙网络管理模块01——HTTP与WebSocket请求数据

如果你也对鸿蒙开发感兴趣&#xff0c;加入“Harmony自习室”吧&#xff01;扫描下方名片&#xff0c;关注公众号&#xff0c;公众号更新更快&#xff0c;同时也有更多学习资料和技术讨论群。 1、概述 鸿蒙的网络管理模块主要提供以下功能&#xff1a; HTTP数据请求&#xff1…

信息学奥赛复赛复习09-CSP-J2020-03表达式求值前置知识点-中缀表达式求值、模运算、模运算性质、栈

PDF文档回复:20241002 **1 P1981 [NOIP2013普及组] 表达式求值 ** [题目描述] 给定一个只包含加法和乘法的算术表达式&#xff0c;请你编程计算表达式的值 [输入格式] 一行&#xff0c;为需要你计算的表达式&#xff0c;表达式中只包含数字、加法运算符 “” 和乘法运算符 …

Stream流的中间方法

一.Stream流的中间方法 注意1&#xff1a;中间方法&#xff0c;返回新的Stream流&#xff0c;原来的Stream流只能使用一次&#xff0c;建议使用链式编程 注意2&#xff1a;修改Stream流中的数据&#xff0c;不会影响原来集合或者数组中的数据 二.filter filter的主要用法是…

SpringCloud-基于Docker和Docker-Compose的项目部署

一、初始化环境 1. 卸载旧版本 首先&#xff0c;卸载可能已存在的旧版本 Docker。如果您不确定是否安装过&#xff0c;可以直接执行以下命令&#xff1a; sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logro…

十一不停歇-学习ROS2第一天 (10.2 10:45)

话题通信 1.1 发布第一个节点&#xff1a; import rclpy #导入此类模块 rcl类型 from rclpy.node import Node #从这个子模块中导入这类函数 def main(): #定义这个函数 rclpy.init() #使用初始化函数 node Node(hello_python) 将类函数里面的内容调给…

基于SpringBoot原创歌曲分享平台设计与实现

1.1课题背景 随着科学技术发展&#xff0c;电脑已成为人们生活中必不可少的生活办公工具&#xff0c;在这样的背景下&#xff0c;网络技术被应用到各个方面&#xff0c;为了提高办公生活效率&#xff0c;网络信息技术飞速发展。在这样的背景下人类社会进入了全新的信息化的时代…

【CT511N-A(T0)大夏龙雀4G模块】GPS定位实操和各个参数解释(详细简单,一看就懂)

总览 1.前言 2.硬件软件需求 3.具体操作 3.1 重置&&冷启动&#xff08;重要&#xff09; 4.注意事项&#xff08;重要&#xff01;重要&#xff01;&#xff09; &#xff01;&#xff01;&#xff01;警告&#xff01;&#xff01;&#xff01; &#xff01;&#x…

信息安全实验2

文件链接&#xff1a; 通过网盘分享的文件&#xff1a;信息安全实验2 链接: https://pan.baidu.com/s/1Fs35ZE5xx52eFBusyx7GYg?pwdfcss 提取码: fcss