【2024数模国赛赛题思路公开】国赛B题思路丨附可运行代码丨无偿自提
2024年国赛B题解题思路
问题 1: 抽样检测方案设计
【题目分析】
分析:
- 目标是设计一个高效的抽样检测方案,在尽量少的样本数量下,确保在高信度水平下做出正确的接受或拒收决策。
- 需要处理两个不同的信度要求,这对样本量的计算提出了挑战。
思路:
- 贝叶斯抽样优化:可以使用贝叶斯方法结合贝叶斯抽样优化(Bayesian Optimization)来动态调整样本量,以达到所需的信度水平。通过将次品率建模为贝叶斯后验分布,可以逐步减少样本量,同时保证决策的可靠性。
- 自适应序贯抽样:使用逐步抽样方法,根据初始样本的检测结果动态调整后续样本量,优化检测成本和时间。
- 蒙特卡洛模拟:模拟大量的抽样检测场景,估计在不同样本量下达成信度要求的概率,找到最小样本量的解决方案。
【解题思路】
目标
设计一个抽样检测方案,以确定是否接受供应商提供的零配件,要求在尽可能少的检测次数下达到两个信度标准:
- 在 95% 信度下认定零配件次品率超过标称值(拒收)。
- 在 90% 信度下认定零配件次品率不超过标称值(接收)。
建模过程
- 定义变量和假设
-
- 设次品率为p ,标称次品率为p0=0.10 (即10%)。
- 抽样样本量为n ,检测出次品的数量为 x。
- 我们需要对p 进行假设检验,并根据检验结果决定是否接受或拒收。
2. 抽样检测模型
- 根据二项分布,我们有 。
- 检验假设:
原假设
备择假设(用于拒收的情况)
- 使用正态近似来简化问题,当 n较大时, 可近似为正态分布:
- 标准化后的检测统计量为:
3. 检验条件
- 我们设定显著性水平α 对应的信度为1-α 。
- 对于拒收情况,信度为 95%,则 α=0.05。
- 计算临界值:,其中为标准正态分布的逆函数。
- 对于接收情况,信度为 90%,则 α=0.10。
4. 计算样本量n
-
- 拒收的决策规则:若 Z>Z0.05,则拒收。
- 结合样本量的计算公式,我们得到:
- 通过展开可以得到对 n 的不等式:
- 为简化计算,可以迭代求解n。
5. 智能优化算法引入
- 为了优化样本量 n,引入贝叶斯优化。贝叶斯优化是一种基于高斯过程(Gaussian Process)的黑箱优化方法,可以在不确定的环境下高效找到最优参数。
- 步骤:
- 定义目标函数:最小化检测成本 ,其中 c 为单次检测成本。
- 目标函数中包含信度约束,使用贝叶斯优化逐步逼近最优的 n。
- 通过模拟不同的样本量 n,评估在95%和90%信度下的检测成功率,并调整 n 使得目标函数最小。
6. 贝叶斯优化流程
-
- 初始化样本集,随机选择 n0 的样本量进行检测,计算检测成本。
- 使用高斯过程拟合当前的检测结果。
- 通过高斯过程预测新的 n,并计算期望改进(Expected Improvement, EI)。
- 选择使期望改进最大的 n 作为下一步的检测样本量。
- 更新高斯过程模型,重复迭代,直到找到满足信度约束且成本最低的样本量n* 。
7. 最终方案
- 通过贝叶斯优化得到的最优样本量 n*,将其应用于实际的检测流程中,以确保在满足信度要求的情况下尽可能减少检测次数。
公式总结
检测统计量:
临界值条件:Z>Z0.05拒收,Z<Z0.10接受
样本量不等式:
目标函数最小化:
【Python参考代码】
# 定义检测成本函数
def detection_cost(n, c):
return n * c
# 定义统计检验函数
def hypothesis_test(n, p0, alpha, x):
# 计算标准化的Z统计量
p_hat = x / n
Z = (p_hat - p0) / np.sqrt(p0 * (1 - p0) / n)
# 计算临界值
Z_alpha = norm.ppf(1 - alpha)
return Z, Z_alpha
# 定义目标函数,贝叶斯优化用
def objective(n):
n = int(n[0]) # 样本量必须是整数
c = 2 # 单次检测成本设为2元(可以根据具体情况调整)
p0 = 0.10 # 标称次品率
alpha_reject = 0.05 # 拒收信度为95%
alpha_accept = 0.10 # 接收信度为90%
# 模拟检测x个次品
x = binom.rvs(n, p0) # 假设次品率刚好为标称值
# 进行拒收和接收检验
Z_reject, Z_alpha_reject = hypothesis_test(n, p0, alpha_reject, x)
Z_accept, Z_alpha_accept = hypothesis_test(n, p0, alpha_accept, x)
# 判断是否满足信度条件
if Z_reject > Z_alpha_reject and Z_accept < Z_alpha_accept:
# 若同时满足拒收和接收信度要求,则计算成本
cost = detection_cost(n, c)
else:
# 若不满足信度要求,则设为较高的惩罚成本
cost = detection_cost(n, c) + 1000 # 惩罚项
return cost
from skopt.space import Real, Integer
# 定义优化参数空间
param_space = [Integer(10, 1000, name='n')]
# 使用贝叶斯优化进行最小化
result = gp_minimize(objective, param_space, n_calls=50, random_state=0)
# 输出最优样本量和最小检测成本
print(f"Optimal sample size: {result.x[0]}")
print(f"Minimum detection cost: {result.fun}")
# 绘制优化过程的收敛情况
plot_convergence(result)
plt.title('Convergence Plot of Bayesian Optimization')
plt.xlabel('Number of Calls')
plt.ylabel('Objective Function Value (Cost)')
plt.grid(True)
plt.show()
# 绘制样本量与检测成本的关系
sample_sizes = np.arange(10, 1000, 10)
costs = [objective([n]) for n in sample_sizes]
plt.figure(figsize=(10, 6))
plt.plot(sample_sizes, costs, '-o', markersize=4, color='b', label='Detection Cost')
plt.axvline(result.x[0], color='r', linestyle='--', label=f'Optimal Sample Size: {result.x[0]}')
plt.title('Detection Cost vs. Sample Size')
plt.xlabel('Sample Size')
plt.ylabel('Detection Cost')
plt.legend()
plt.grid(True)
plt.show()