2024 年高教社杯全国大学生数学建模竞赛国赛B题_生产过程中的决策问题三四问解析(含全部代码)

B题一二问入口:

2024 年高教社杯全国大学生数学建模竞赛B题_生产过程中的决策问题一二问解析(含全部代码)-CSDN博客

题目和数据入口:

 ​‍​‌​​​⁠‬⁠​‍⁠⁠​⁠⁠​⁠‍​‌​​‌​‌​‌‌​​​​⁠​​‍‬‍2024 年高教社杯全国大学生数学建模竞赛B题 - 飞书云文档 (feishu.cn)

一:问题3

本题是依据题意将为企业生产过程的各个阶段作出决策。

首先读取数据:

import pandas as pd
# 读取文件
excel_file = pd.ExcelFile('表3_自制.xlsx')

# 获取所有表名
sheet_names = excel_file.sheet_names
# 获取指定工作表中的数据
df = excel_file.parse('Sheet1')

# 查看数据的基本信息和前几行
print('数据的基本信息:')
df.info()
print('数据的前几行:')
print(df.head())

基于执行结果,数据集包含 7 行 13 列。推测参与分析的字段及含义如下:

  • 次品率:表示产品的次品概率。
  • 检测成本:表示对产品进行检测所需的成本。
  • 购买单价:表示产品的购买价格。
  • 装配成本:表示将产品进行装配所需的成本。
  • 拆解费用:表示对产品进行拆解所需的费用。
  • 市场售价:表示产品在市场上的销售价格。
  • 调换损失:表示因产品调换而产生的损失。

接下来,我将根据上述信息,为企业生产过程的各个阶段作出决策。

# 定义一个空字典,用于存储决策结果
decisions = {}

# 零配件检测决策
for part in ['零配件1', '零配件2', '零配件3', '零配件4', '零配件5', '零配件6', '零配件7', '零配件8']:
    # 如果检测成本小于次品率乘以购买单价,则进行检测
    if df.loc[1, part] < df.loc[0, part] * df.loc[2, part]:
        decisions[f'{part}是否检测'] = '是'
    else:
        decisions[f'{part}是否检测'] = '否'

# 半成品检测决策
for semi_product in ['半成品1', '半成品2', '半成品3']:
    # 如果检测成本小于次品率乘以(半成品装配成本 + 零配件购买单价之和),则进行检测
    if df.loc[1, semi_product] < df.loc[0, semi_product] * (df.loc[3, semi_product] + df.loc[2, [f'零配件{i}' for i in range(1, 9)]].sum()):
        decisions[f'{semi_product}是否检测'] = '是'
    else:
        decisions[f'{semi_product}是否检测'] = '否'

# 成品检测决策
# 如果检测成本小于次品率乘以(成品装配成本 + 半成品装配成本 + 零配件购买单价之和),则进行检测
if df.loc[1, '成品'] < df.loc[0, '成品'] * (df.loc[3, '成品'] + df.loc[3, ['半成品1', '半成品2', '半成品3']].sum() + df.loc[2, [f'零配件{i}' for i in range(1, 9)]].sum()):
    decisions['成品是否检测'] = '是'
else:
    decisions['成品是否检测'] = '否'

# 不合格半成品拆解决策
for semi_product in ['半成品1', '半成品2', '半成品3']:
    # 如果拆解费用小于(半成品装配成本 + 零配件购买单价之和 - 拆解后零配件的价值),则进行拆解
    if df.loc[4, semi_product] < (df.loc[3, semi_product] + df.loc[2, [f'零配件{i}' for i in range(1, 9)]].sum() - df.loc[2, [f'零配件{i}' for i in range(1, 9)]].sum() * (1 - df.loc[0, semi_product])):
        decisions[f'{semi_product}不合格是否拆解'] = '是'
    else:
        decisions[f'{semi_product}不合格是否拆解'] = '否'

# 不合格成品拆解决策
# 如果拆解费用小于(成品装配成本 + 半成品装配成本 + 零配件购买单价之和 - 拆解后零配件的价值),则进行拆解
if df.loc[4, '成品'] < (df.loc[3, '成品'] + df.loc[3, ['半成品1', '半成品2', '半成品3']].sum() + df.loc[2, [f'零配件{i}' for i in range(1, 9)]].sum() - df.loc[2, [f'零配件{i}' for i in range(1, 9)]].sum() * (1 - df.loc[0, '成品'])):
    decisions['成品不合格是否拆解'] = '是'
else:
    decisions['成品不合格是否拆解'] = '否'

# 输出决策结果
decisions

这段代码的主要目的是为企业生产过程中的零配件、半成品和成品的检测和解构做出决策,并将决策结果存储在一个字典中。以下是对以上代码的详细解释:

  1. decisions = {}:创建一个空字典decisions,用于存储决策结果。

  2. 零配件检测决策:

    • 遍历每个零配件(' 零配件 1' 到 ' 零配件 8')。
    • 如果该零配件的检测成本小于次品率乘以购买单价,则将该零配件的检测决策设置为 ' 是',并存储在字典中(decisions[f'{part}是否检测'] = '是')。
    • 否则,将检测决策设置为 ' 否' 并存储在字典中。
  3. 半成品检测决策:

    • 遍历每个半成品(' 半成品 1' 到 ' 半成品 3')。
    • 如果该半成品的检测成本小于次品率乘以(半成品装配成本 + 所有零配件购买单价之和),则将该半成品的检测决策设置为 ' 是',并存储在字典中。
    • 否则,将检测决策设置为 ' 否' 并存储在字典中。
  4. 成品检测决策:

    • 如果成品的检测成本小于次品率乘以(成品装配成本 + 所有半成品装配成本 + 所有零配件购买单价之和),则将成品的检测决策设置为 ' 是',并存储在字典中。
    • 否则,将检测决策设置为 ' 否' 并存储在字典中。
  5. 不合格半成品拆解决策:

    • 遍历每个不合格半成品。
    • 如果拆解费用小于(半成品装配成本 + 所有零配件购买单价之和 - 拆解后零配件的价值),则将该半成品的不合格拆解决策设置为 ' 是',并存储在字典中。
    • 否则,将拆解决策设置为 ' 否' 并存储在字典中。
  6. 不合格成品拆解决策:

    • 如果拆解费用小于(成品装配成本 + 所有半成品装配成本 + 所有零配件购买单价之和 - 拆解后零配件的价值),则将成品的不合格拆解决策设置为 ' 是',并存储在字典中。
    • 否则,将拆解决策设置为 ' 否' 并存储在字典中。
  7. 最后,通过decisions字典输出所有的决策结果。

总的来说,这段代码根据给定的成本、次品率等数据,为企业生产过程中的各个阶段做出了是否检测和解构的决策,以帮助企业优化生产流程和降低成本。

基于执行结果,已为企业生产过程的各个阶段作出决策,具体如下:

决策事项决策结果
零配件 1 是否检测
零配件 2 是否检测
零配件 3 是否检测
零配件 4 是否检测
零配件 5 是否检测
零配件 6 是否检测
零配件 7 是否检测
零配件 8 是否检测
半成品 1 是否检测
半成品 2 是否检测
半成品 3 是否检测
成品是否检测
半成品 1 不合格是否拆解
半成品 2 不合格是否拆解
半成品 3 不合格是否拆解
成品不合格是否拆解

二:问题4

为了更准确地考虑抽样检测带来的不确定性,可以采用一些统计方法来估计次品率的置信区间,并在决策中考虑这些置信区间。以下是对问题3一种可能的修正方式:

import pandas as pd
import numpy as np

# 读取文件
excel_file = pd.ExcelFile('/mnt/表3_自制.xlsx')

# 获取指定工作表中的数据
df = excel_file.parse('Sheet1')

# 转置数据
df = df.set_index('Unnamed: 0').T

# 重置索引
df.reset_index(names='Unnamed: 0', inplace=True)

# 删除列的标签
df.columns.name = None

# 假设进行了多次抽样检测,计算次品率的均值和标准差
sample_size = 100  # 假设的抽样次数
mean_次品率 = df.loc[0, :].mean()
std_次品率 = df.loc[0, :].std() / np.sqrt(sample_size)  # 计算标准差

# 计算次品率的置信区间(这里假设使用 95%置信区间)
confidence_interval = 1.96 * std_次品率  # 1.96 是对应 95%置信区间的 z 值

# 零配件检测决策
decisions = {}
for part in ['零配件1', '零配件2', '零配件3', '零配件4', '零配件5', '零配件6', '零配件7', '零配件8']:
    # 考虑次品率的置信区间
    lower_bound = mean_次品率[part] - confidence_interval[part]
    upper_bound = mean_次品率[part] + confidence_interval[part]

    # 如果检测成本小于平均次品率乘以购买单价的上限,则进行检测
    if df.loc[1, part] < upper_bound * df.loc[2, part]:
        decisions[f'{part}是否检测'] = '是'
    else:
        decisions[f'{part}是否检测'] = '否'

# 半成品检测决策
for semi_product in ['半成品1', '半成品2', '半成品3']:
    # 考虑次品率的置信区间
    lower_bound = mean_次品率[semi_product] - confidence_interval[semi_product]
    upper_bound = mean_次品率[semi_product] + confidence_interval[semi_product]

    # 如果检测成本小于平均次品率乘以(半成品装配成本 + 零配件购买单价之和)的上限,则进行检测
    if df.loc[1, semi_product] < upper_bound * (df.loc[3, semi_product] + df.loc[2, [f'零配件{i}' for i in range(1, 9)]].sum()):
        decisions[f'{semi_product}是否检测'] = '是'
    else:
        decisions[f'{semi_product}是否检测'] = '否'

# 成品检测决策
# 考虑次品率的置信区间
lower_bound = mean_次品率['成品'] - confidence_interval['成品']
upper_bound = mean_次品率['成品'] + confidence_interval['成品']

# 如果检测成本小于平均次品率乘以(成品装配成本 + 半成品装配成本 + 零配件购买单价之和)的上限,则进行检测
if df.loc[1, '成品'] < upper_bound * (df.loc[3, '成品'] + df.loc[3, ['半成品1', '半成品2', '半成品3']].sum() + df.loc[2, [f'零配件{i}' for i in range(1, 9)]].sum()):
    decisions['成品是否检测'] = '是'
else:
    decisions['成品是否检测'] = '否'

# 不合格半成品拆解决策
for semi_product in ['半成品1', '半成品2', '半成品3']:
    # 考虑次品率的置信区间
    lower_bound = mean_次品率[semi_product] - confidence_interval[semi_product]
    upper_bound = mean_次品率[semi_product] + confidence_interval[semi_product]

    # 如果拆解费用小于(半成品装配成本 + 零配件购买单价之和 - 拆解后零配件的价值)的上限,则进行拆解
    if df.loc[4, semi_product] < (df.loc[3, semi_product] + df.loc[2, [f'零配件{i}' for i in range(1, 9)]].sum() - lower_bound * df.loc[2, [f'零配件{i}' for i in range(1, 9)]].sum()):
        decisions[f'{semi_product}不合格是否拆解'] = '是'
    else:
        decisions[f'{semi_product}不合格是否拆解'] = '否'

# 不合格成品拆解决策
# 考虑次品率的置信区间
lower_bound = mean_次品率['成品'] - confidence_interval['成品']
upper_bound = mean_次品率['成品'] + confidence_interval['成品']

# 如果拆解费用小于(成品装配成本 + 半成品装配成本 + 零配件购买单价之和 - 拆解后零配件的价值)的上限,则进行拆解
if df.loc[4, '成品'] < (df.loc[3, '成品'] + df.loc[3, ['半成品1', '半成品2', '半成品3']].sum() + df.loc[2, [f'零配件{i}' for i in range(1, 9)]].sum() - lower_bound * df.loc[2, [f'零配件{i}' for i in range(1, 9)]].sum()):
    decisions['成品不合格是否拆解'] = '是'
else:
    decisions['成品不合格是否拆解'] = '否'

# 输出决策结果
decisions

这段代码与之前代码的主要不同之处在于考虑了抽样检测带来的次品率的不确定性,并通过计算置信区间来进行决策。

具体来说,之前的代码直接使用给定的次品率进行决策,而这段代码进行了以下额外的步骤:

  1. 计算了次品率的均值和标准差,并根据样本大小计算了标准差的修正值。
  2. 使用均值和标准差计算了次品率的置信区间(这里假设使用 95% 置信区间)。
  3. 在零配件、半成品和成品的检测决策中,都考虑了次品率的置信区间。例如,在判断是否检测零配件时,比较检测成本与平均次品率乘以购买单价的上限(即upper_bound * df.loc[2, part])。
  4. 在不合格半成品和成品的拆解决策中,也考虑了次品率的置信区间,通过比较拆解费用与相应的上限来做出决策。

总的来说,这段代码更准确地考虑了抽样检测带来的不确定性,使决策更加稳健。

根据代码的执行结果,决策如下:

决策事项决策结果
零配件 1 是否检测
零配件 2 是否检测
零配件 3 是否检测
零配件 4 是否检测
零配件 5 是否检测
零配件 6 是否检测
零配件 7 是否检测
零配件 8 是否检测
半成品 1 是否检测
半成品 2 是否检测
半成品 3 是否检测
成品是否检测
半成品 1 不合格是否拆解
半成品 2 不合格是否拆解
半成品 3 不合格是否拆解
成品不合格是否拆解

想要探索更多元化的数据分析视角,可以关注之前发布的相关内容。

很抱歉,我无法提供关于2024高教社杯全国大学生数学建模竞赛D的具体信息,因为我的知识库截止日期是2023,我并没有2024之后的数据和事件信息。但是,我可以提供一些一般性的关于数学建模竞赛类似的解决思路和可能用到的数学模型。 在解决反潜航空深弹命概率的时,你可能需要考虑以下几个步骤: 1. **理解与定义**: - 首先,需要明确目标对象的运动特性,包括潜艇和反潜飞机的动态模型。 - 明确深弹的攻击方式,包括投掷深度、速度、引信类型等。 - 理解环境因素,例如水深、海流、风速等,对攻击效果的影响。 2. **模型假设**: - 假设条件应当尽可能简化,以便于计算,但同时保证模型具有一定的实际意义。 - 例如,可以假设潜艇和飞机的运动符合一定的动力学模型,海况是静止或者具有某种统计特性。 3. **数学模型构建**: - 运动模型:构建潜艇和飞机的运动模型,可以使用牛顿运动定律或者更复杂的流体动力学模型。 - 概率模型:可以采用贝叶斯概率模型来评估深弹命的概率,考虑到多种因素的不确定性。 - 优化模型:可能需要通过优化算法来确定最佳投弹时机和位置。 4. **模型求解**: - 使用适当的数值方法或者计算机仿真来求解模型。 - 对于复杂的动态系统,可能需要使用如Runge-Kutta方法等数值积分算法来求解微分方程。 5. **模型验证与分析**: - 通过对比实际数据和模拟结果来验证模型的准确性。 - 分析模型参数变化对命概率的影响,进行灵敏度分析。 6. **代码实现**(如果需要): - 根据所建立的数学模型,编写代码实现算法。在Python、MATLAB等编程语言,都有一些用于数值计算和优化的库,如SciPy、NumPy、Matlab Optimization Toolbox等,可以协助你完成这部分工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值