如何评价2024数学建模国赛B题?
我是Tina表姐,毕业于中国人民大学,对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在,我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合,专为本次赛题设计,旨在帮助您深入理解数学建模的每一个环节。
本次国赛b题可以做如下考虑
问题 1思路如下:针对供应商声称零配件次品率不超过标称值,设计检测次数尽可能少的抽样检测方案。
建模过程
我们需要设计一个抽样检测方案,用最少的检测次数来决定是否接收一批零配件。
1. 假设检验
我们使用二项检验来进行假设检验。
- 假设:
- H_0 : 次品率 p \leq 0.10
- H_1 : 次品率 p > 0.10
2. 样本大小与临界值
使用正态近似或查找二项分布表来确定样本大小 n 和临界值 c ,以满足信度要求。
3. 两种情形
- (1) 95%信度下拒收:
- 计算所需样本大小 n_1 。
- 设置拒收临界值 c_1 使假阳性率 \alpha = 0.05 。
- (2) 90%信度下接收:
- 计算所需样本大小 n_2 。
- 设置接收临界值 c_2 使假阴性率 \beta = 0.10 。
数学公式
样本大小计算
使用正态近似的样本大小公式:
其中: - p_0 = 0.10 为标称次品率。 - p_1 为实际次品率假设。 - Z_{\alpha} 和 Z_{\beta} 为标准正态分布的临界值。
添加图片注释,不超过 140 字(可选)
临界值计算
根据二项分布计算临界值:
代码
import scipy.stats as stats
import math
# 标称次品率
p0 = 0.10
# 实际次品率假设
p1 = 0.15
# 情形 1: 95% 信度下拒收
alpha1 = 0.05
Z_alpha1 = stats.norm.ppf(1 - alpha1)
# 情形 2: 90% 信度下接收
beta2 = 0.10
Z_beta2 = stats.norm.ppf(1 - beta2)
# 样本大小计算
n1 = ((Z_alpha1 * math.sqrt(p0 * (1 - p0)) + Z_beta2 * math.sqrt(p1 * (1 - p1))) / (p1 - p0)) ** 2
n1 = math.ceil(n1)
# 使用二项分布计算临界值
def find_critical_value(n, alpha):
for c in range(n):
if stats.binom.cdf(c, n, p0) >= 1 - alpha:
return c
return n
# 计算临界值
c1 = find_critical_value(n1, alpha1)
c2 = find_critical_value(n1, beta2)
print("样本大小 n1 =", n1)
print("拒收临界值 c1 =", c1)
# 样本大小和临界值打印
print("样本大小 n2 =", n1)
print("接收临界值 c2 =", c2)
说明
- 样本大小 n :通过公式计算得到的样本大小,确保在指定信度下做出正确决定。
- 临界值 c :用于判断是否接收或拒收,基于统计检验的结果。
- scipy.stats:用于计算正态和二项分布的相关值。
添加图片注释,不超过 140 字(可选)
以上方案通过合理的统计方法,设计出有效的抽样检测策略。设零件次品率为 $p$,检测次数为 $n$,则根据二项分布的概率公式,可以得到:
(1)在 95% 信度下,检测出的零件次品数不超过 1 个的概率为:
(2)在 90% 信度下,检测出的零件次品数不超过 0 个的概率为:
根据上述公式,可以得到:
(1)在 95% 信度下,检测出的零件次品数不超过 1 个的概率大于等于 0.95,即:
(2)在 90% 信度下,检测出的零件次品数不超过 0 个的概率大于等于 0.9,即:
综上所述,可以得到抽样检测方案为:在 95% 信度下,检测出的零件次品数不超过 1 个的概率大于等于 0.95,即 $C_n^0 p^0 (1-p)^n + C_n^1 p^1 (1-p)^{n-1} \geq 0.95$;在 90% 信度下,检测出的零件次品数不超过 0 个的概率大于等于 0.9,即 $C_n^0 p^0 (1-p)^n \geq 0.9$。
import numpy as np
def sampling_test(n, p, a, B):
"""
n: 抽样次数
p: 次品率
a: 检测费用
B: 信度
"""
# 计算每次检测的成本
cost = n * a
# 计算不合格的概率
P = 0
for i in range(n+1):
P += np.math.factorial(n) / (np.math.factorial(i) * np.math.factorial(n-i)) * p**i * (1-p)**(n-i)
# 判断是否拒收
if P > (1-B):
print('拒收,需要检测次数:', n, ',检测成本:', cost)
else:
sampling_test(n+1, p, a, B)
# 测试
sampling_test(1, 0.1, 2, 0.95)
sampling_test(1, 0.1, 2, 0.9)
问题 2是关于企业生产过程中的决策问题,根据两种零配件和成品的次品率,决定是否对零配件和成品进行检测,以及对不合格成品是否进行拆解和退回等决策。
问题的输入与输出:
输入:两种零配件的次品率、单价和检测成本,成品的次品率、装配成本、检测成本、市场售价、调换损失和拆解费用。
输出:对零配件和成品的检测决策,对不合格成品的拆解和退回决策,以及最小的生产成本。
- 假设:
(1)假设企业购买的零配件和成品的次品率是可靠的,可以通过抽样检测方法得到。
(2)假设零配件和成品的次品率是相互独立的。
(3)假设企业的生产过程中,只会出现两种零配件和一个成品的次品率,不会出现其他情况。
(4)假设企业的生产过程中,只会发生一次抽样检测,不会进行多次抽样检测。
- 符号说明:
(1)设零配件 1 的次品率为 $p_1$,零配件 2 的次品率为 $p_2$,成品的次品率为 $p_c$。
(2)设零配件 1 的单价为 $c_1$,零配件 2 的单价为 $c_2$,成品的单价为 $s$。
(3)设零配件 1 的检测成本为 $d_1$,零配件 2 的检测成本为 $d_2$,成品的检测成本为 $d_c$。
(4)设零配件 1 的拆解费用为 $f_1$,零配件 2 的拆解费用为 $f_2$。
(5)设不合格成品的调换损失为 $l$。
- 决策变量:
(1)设 为对零配件 1 进行检测的决策变量,当 时,表示对零配件 1 进行检测,当 时,表示不对零配件 1 进行检测。
(2)设 为对零配件 2 进行检测的决策变量,当 时,表示对零配件 2 进行检测,当 时,表示不对零配件 2 进行检测。
(3)设 为对成品进行检测的决策变量,当 时,表示对成品进行检测,当 时,表示不对成品进行检测。
(4)设 为对不合格成品进行拆解的决策变量,当 时,表示对不合格成品进行拆解,当 时,表示不对不合格成品进行拆解。
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
问题 2的决策方案如下:
- 对零配件(零配件 1 和/或零配件 2)进行检测的决策:
设零配件 1 的次品率为$p_1$,零配件 2 的次品率为$p_2$,检测零配件 1 的成本为$c_1$,检测零配件 2 的成本为$c_2$,零配件 1 的购买单价为$a_1$,零配件 2 的购买单价为$a_2$,则对零配件进行检测的总成本为: 若检测出不合格零配件,则丢弃该零配件,总成本增加$c_1$或$c_2$;若检测出合格零配件,则总成本不变。因此,对零配件进行检测的决策可以表示为: 其中,$D_{test}=1$表示对零配件进行检测,$D_{test}=0$表示不对零配件进行检测。
- 对装配好的每一件成品进行检测的决策:
设成品的次品率为$p_3$,检测成品的成本为$c_3$,装配成品的成本为$a_3$,则对成品进行检测的总成本为: 若检测出不合格成品,则丢弃该成品,总成本增加$c_3$;若检测出合格成品,则总成本不变。因此,对成品进行检测的决策可以表示为: 其中,$D_{test}^{'}=1$表示对成品进行检测,$D_{test}^{'}=0$表示不对成品进行检测。
- 对检测出的不合格成品进行拆解的决策:
设拆解费用为$c_4$,则对不合格成品进行拆解的总成本为: 因此,对不合格成品进行拆解的决策可以表示为: 其中,$D_{disassemble}=1$表示对不合格成品进行拆解,$D_{disassemble}=0$表示不对不合格成品进行拆解。
- 对用户购买的不合格品进行调换的决策:
设调换损失为$c_5$,则对用户购买的不合格品进行调换的总成本为: 因此,对用户购买的不合格品进行调换的决策可以表示为: 其中,$D_{exchange}=1$表示对用户购买的不合格品进行调换,
问题 2的代码如下:
# 导入numpy包
import numpy as np
# 定义函数,输入零配件和成品的次品率,返回决策结果和相应指标
def decision(l1, l2, p, q, c1, c2, c3, c4, c5, c6, c7, c8):
# 判断是否对零配件1进行检测
if l1 <= p:
# 判断是否对零配件2进行检测
if l2 <= q:
# 判断成品次品率是否小于等于市场售价
if p*q <= 200:
# 不检测零配件,不检测成品,不拆解,直接进入市场
return '不检测零配件,不检测成品,不拆解,直接进入市场', p*q
else:
# 不检测零配件,检测成品,不拆解,只有检测合格的成品进入市场
return '不检测零配件,检测成品,不拆解,只有检测合格的成品进入市场', p*q+c8
else:
# 判断成品次品率是否小于等于市场售价
if p*q <= 200:
# 不检测零配件,不检测成品,不拆解,直接进入市场
return '不检测零配件,不检测成品,不拆解,直接进入市场', p*q
else:
# 不检测零配件,检测成品,不拆解,只有检测合格的成品进入市场
return '不检测零配件,检测成品,不拆解,只有检测合格的成品进入市场', p*q+c8
else:
# 判断是否对零配件2进行检测
if l2 <= q:
# 判断成品次品率是否小于等于市场售价
if p*q <= 200:
# 检测零配件,不检测成品,不拆解,只有检测合格的零配件进入装配环节
return '检测零配件,不检测成品,不拆解,只有检测合格的零配件进入装配环节', p*q+c3
else:
# 检测零配件,检测成品,不拆解,只有检测合格的成品进入市场
return '检测零配件,检测成品,不拆解,只有检测合格的成品进入市场', p*q+c3+c8
else:
# 判断成品次品率是否小于等于市场售价
if p*q <= 200:
# 检测零配件,不检测成品,不拆解,只有检测合格的零配件进入装配环节
return '检测零配件,不检测成品,不拆解,只有检测合格的零配件进入装配环节', p*q+c3
else:
# 检测零配件,检测成品,不拆解,只有检测合格的成品进入市场
return '检测零配件,检测成品,不拆解,只有检测合格的成品进入市场', p*q+c3+c8