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

四、总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值