首页 > 编程语言 >用Python实现运筹学——Day 9: 线性规划的灵敏度分析

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

时间:2024-10-03 19:49:55浏览次数:6  
标签:Python 线性规划 result 产品 print new Day 资源 利润

一、学习内容

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 的利润对生产决策有显著影响。

四、总结

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

标签:Python,线性规划,result,产品,print,new,Day,资源,利润
From: https://blog.csdn.net/qq_41698317/article/details/142684247

相关文章

  • 用Python实现运筹学——Day 10: 线性规划的计算机求解
    一、学习内容1.使用Python的scipy.optimize.linprog进行线性规划求解scipy.optimize.linprog是Python中用于求解线性规划问题的函数。它实现了单纯形法、内点法等算法,能够处理求解最大化或最小化问题,同时满足线性约束条件。线性规划问题的形式:线性规划问题可以描......
  • python多进程debug
    代码调试问题阐述最近遇到一个pythondebug多进程的问题有一个进程A,这个进程会fork出8个进程B,forkjoin结束后,又会fork出8个进程A。假设按时间有序,我就只想断fork出的第一个B和第一个进程A,怎么做?(breakpointjustbreakonlyonce)类似于java多线程调试的意思,只断一个线程,all-......
  • DAY3-补题
    一题之计在于补呐补题很快乐的一点就是看不懂且听不明白但是写注释中理解到了。果然学会一道题最简单的方式是给一个纯萌新讲。说在前面今天%你赛手感非常好,可能是换了一个位置的原因(玄首先T1没有读错题是一个比较大的进步,因为DAY1和2都是因为差不多这个原因寄掉了,读对题目果......
  • 代码随想录算法训练营Day2|209.长度最小的子数组 59.螺旋矩阵
    学习资料:https://programmercarl.com/数组总结篇.html#数组的经典题目移动窗格,首尾指针根据条件变化模拟行为,循环不变量(左闭右闭或左闭右开)整个过程保持一致学习记录:209.长度最小的子数组(用while使得尾指针遍历全部;用while实现,当[首:尾]之和>目标值,才移动首指针;为了求最小长度......
  • 基于selenium的爬取dblp论文的python爬虫
    出于阅读文献的需要,导师让我写一个能够爬取dblp上文献资料的爬虫,话不多说,开学。学习路径总结前端基本知识request库与bs库目标特征,规划爬取步骤动态加载的应对方法-selenium前端基本知识前端开发是指创建Web页面或应用程序用户可以与之交互的部分。前端开发主要涉及三种......
  • Python并发编程(1)——Python并发编程的几种实现方式
    左手编程,右手年华。大家好,我是一点,关注我,带你走入编程的世界。公众号:一点sir,关注领取python编程资料Python并发编程是指在Python中编写能够同时执行多个任务的程序。并发编程在任何一门语言当中都是比较难的,因为会涉及各种各样的问题,在Python当中也不例外。Python提供了多......
  • 【艾思科蓝】Python数据分析与可视化实战:从入门到进阶
    【IEEE出版|会后3-4个月EI检索】第三届云计算、大数据应用与软件工程国际学术会议(CBASE2024)_艾思科蓝_学术一站式服务平台更多学术会议请看:学术会议-学术交流征稿-学术会议在线-艾思科蓝 目录引言一、Python数据分析入门1.Python数据分析环境搭建2.数据读取与预......
  • python3 队列的使用
    在leetcode如下题目中使用队列637.二叉树的层平均值:#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolutio......
  • 在Visual Studio Code中配置使用venv隔离python环境
    venv的用途Python的venv是一个用于创建虚拟环境的模块,主要作用是为每个项目提供一个隔离的Python运行环境。这样不同项目的依赖可以相互独立,不会产生冲突。例如,一个项目可以使用Python3.8,另一个项目使用Python3.10,彼此之间不受影响。相比其他环境管理工具,如conda,venv是Python......
  • P11119 [ROI 2024 Day 2] 保持连接
    P11119[ROI2024Day2]保持连接设\(L_i,R_i\)分别表示覆盖了\(i\)的的线段中最靠左的左端点和最靠右的右端点,特殊的,如果没有覆盖,则\(L_i=R_i=i\)。显然所有\(R_i\)就刻画了一种局面。如果没有\(X\)的操作,设\(g_i\)表示从\(i\)出发到\([i,n]\)的重新连接的次数......