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
这段代码的主要目的是为企业生产过程中的零配件、半成品和成品的检测和解构做出决策,并将决策结果存储在一个字典中。以下是对以上代码的详细解释:
decisions = {}
:创建一个空字典decisions
,用于存储决策结果。零配件检测决策:
- 遍历每个零配件(' 零配件 1' 到 ' 零配件 8')。
- 如果该零配件的检测成本小于次品率乘以购买单价,则将该零配件的检测决策设置为 ' 是',并存储在字典中(
decisions[f'{part}是否检测'] = '是'
)。- 否则,将检测决策设置为 ' 否' 并存储在字典中。
半成品检测决策:
- 遍历每个半成品(' 半成品 1' 到 ' 半成品 3')。
- 如果该半成品的检测成本小于次品率乘以(半成品装配成本 + 所有零配件购买单价之和),则将该半成品的检测决策设置为 ' 是',并存储在字典中。
- 否则,将检测决策设置为 ' 否' 并存储在字典中。
成品检测决策:
- 如果成品的检测成本小于次品率乘以(成品装配成本 + 所有半成品装配成本 + 所有零配件购买单价之和),则将成品的检测决策设置为 ' 是',并存储在字典中。
- 否则,将检测决策设置为 ' 否' 并存储在字典中。
不合格半成品拆解决策:
- 遍历每个不合格半成品。
- 如果拆解费用小于(半成品装配成本 + 所有零配件购买单价之和 - 拆解后零配件的价值),则将该半成品的不合格拆解决策设置为 ' 是',并存储在字典中。
- 否则,将拆解决策设置为 ' 否' 并存储在字典中。
不合格成品拆解决策:
- 如果拆解费用小于(成品装配成本 + 所有半成品装配成本 + 所有零配件购买单价之和 - 拆解后零配件的价值),则将成品的不合格拆解决策设置为 ' 是',并存储在字典中。
- 否则,将拆解决策设置为 ' 否' 并存储在字典中。
最后,通过
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
这段代码与之前代码的主要不同之处在于考虑了抽样检测带来的次品率的不确定性,并通过计算置信区间来进行决策。
具体来说,之前的代码直接使用给定的次品率进行决策,而这段代码进行了以下额外的步骤:
- 计算了次品率的均值和标准差,并根据样本大小计算了标准差的修正值。
- 使用均值和标准差计算了次品率的置信区间(这里假设使用 95% 置信区间)。
- 在零配件、半成品和成品的检测决策中,都考虑了次品率的置信区间。例如,在判断是否检测零配件时,比较检测成本与平均次品率乘以购买单价的上限(即
upper_bound * df.loc[2, part]
)。- 在不合格半成品和成品的拆解决策中,也考虑了次品率的置信区间,通过比较拆解费用与相应的上限来做出决策。
总的来说,这段代码更准确地考虑了抽样检测带来的不确定性,使决策更加稳健。
根据代码的执行结果,决策如下:
决策事项 | 决策结果 |
---|---|
零配件 1 是否检测 | 否 |
零配件 2 是否检测 | 否 |
零配件 3 是否检测 | 否 |
零配件 4 是否检测 | 否 |
零配件 5 是否检测 | 否 |
零配件 6 是否检测 | 否 |
零配件 7 是否检测 | 否 |
零配件 8 是否检测 | 否 |
半成品 1 是否检测 | 是 |
半成品 2 是否检测 | 是 |
半成品 3 是否检测 | 是 |
成品是否检测 | 是 |
半成品 1 不合格是否拆解 | 是 |
半成品 2 不合格是否拆解 | 是 |
半成品 3 不合格是否拆解 | 是 |
成品不合格是否拆解 | 是 |
想要探索更多元化的数据分析视角,可以关注之前发布的相关内容。