24国赛全解全析:
(文中前面的几张图片是我往期作品中的部分内容和可视化图片哦,可视化内容非常精美!)
以下是正式更新内容
2024全国大学生数学建模竞赛(国赛)B题决策优化+鲁棒模型完整建模精品可视化
问题分析
1. 可能的考点分析
- 质量控制模型:如何定义零配件和成品的合格率?如何估计和优化生产过程中不合格品的数量?
- 成本优化模型:如何最小化生产过程中的成本?这里需要考虑零配件采购成本、拆解费用和报废损失。
- 概率统计分析:成品的合格与否是基于零配件的合格率和其他潜在因素的,这可能涉及到概率模型(如条件概率)。
- 决策模型:在面对不合格品时,是选择报废还是拆解,这需要建立一个决策模型来确定在什么情况下选择哪种处理方式,以最小化成本。
- 动态规划或优化算法:如果考虑生产过程中多个阶段的决策(如分批生产、实时质量检测与调整等),可以使用动态规划或其他优化算法来求解。
2. 解决方案的初步思路
- 定义变量:
x1,x2 :零配件1和零配件2的采购数量
p1,p2 :零配件1和零配件2的合格率
C1,C2 :零配件1和零配件2的采购成本
Cdis :拆解费用
Cscrap :报废费用
q :两个零配件均合格时,成品合格的概率
- 构建目标函数:
- 目标函数应当考虑采购成本、拆解费用和报废费用。可以表示为: 总成本拆解费用报废费用总成本=C1⋅x1+C2⋅x2+拆解费用+报废费用
- 约束条件:
- 根据成品合格与否的条件,建立相关约束条件。例如,不合格成品的数量与零配件的合格率和成品合格概率有关。
- 优化模型:
- 可以使用线性规划(如果问题是线性的)或非线性规划(如果问题是非线性的)来求解成本最小化问题。
在进一步确定和构建模型之前,需要明确以下信息:
- 零配件1和零配件2的采购成本和合格率。
- 成品合格与否的具体条件(特别是两个零配件均合格时,成品不合格的概率)。
3. 问题描述的核心要素
- 两种零配件(零配件 1 和零配件 2):需要考虑两种零配件的采购数量、合格率和成本。
- 成品的合格条件:
- 如果任何一个零配件不合格,则成品不合格。
- 即使两个零配件均合格,成品也可能不合格。这意味着成品合格与否不仅取决于零配件,还可能取决于其他因素(如装配工艺)。
- 不合格品的处理:
- 不合格成品可以选择报废或拆解。
- 拆解不会对零配件造成损坏,但需要额外的拆解费用。
变量定义和符号说明
以下是本文中涉及的主要变量和符号的定义和说明:
Ni :第 i 个零配件的数量。 单位:件 范围: i=1,2,…,8
q^i :第 i 个零配件的次品率,通过抽样检测估计得到。
单位:百分比(%) 范围: i=1,2,…,8
p^j :第 j 个半成品的次品率,通过抽样检测估计得到。
单位:百分比(%) 适用范围: j=1,2,3
q^f :成品的次品率,通过抽样检测估计得到。 单位:百分比(%)
Ci :第 i 个零配件的采购单价。 单位:元/件 适用范围: i=1,2,…,8
Di :第 i 个零配件的检测成本。 单位:元/件 适用范围: i=1,2,…,8
pj :第 j 个半成品的次品率。 单位:百分比(%) 适用范围: j=1,2,3
Dhj :第 j 个半成品的检测成本。 单位:元/件 适用范围: j=1,2,3
qf :成品的次品率。 单位:百分比(%)
Cassem :成品的装配成本。 单位:元/件
Df :成品的检测成本。 单位:元/件
Cscrap :报废费用。 单位:元/件
Cdis :拆解费用。 单位:元/件
Cswap :调换损失。 单位:元/件
Cmarket :成品的市场售价。 单位:元/件
yi :第 i 个零配件的检测决策变量。 取值范围: {0,1} 说明: 1 表示检测, 0 表示不检测
zj :第 j 个半成品的检测决策变量。 取值范围: {0,1} 说明: 1 表示检测, 0 表示不检测
zf :成品的检测决策变量。 取值范围: {0,1} 说明: 1 表示检测, 0 表示不检测
w :不合格品拆解的决策变量。 取值范围: {0,1} 说明: 1 表示进行拆解, 0 表示直接报废
Ctotal :总成本,包括采购成本、检测成本、装配成本、报废成本、拆解成本和调换损失等。 单位:元
置信区间:估计次品率的统计区间,用于表示次品率估计的上下限,反映不确定性。
鲁棒优化(Robust Optimization):一种优化方法,考虑参数不确定性(如次品率的置信区间),在最坏情况下优化目标函数。
以上符号和变量在本文中用于建立和优化生产过程中的各类决策模型,目标是通过优化生产过程的各阶段决策来最小化总成本。
问题 1:抽样检测方案设计
- 问题描述:
- 企业需要决定是否接收供应商的零配件,要求在抽样检测方案中,检测次数尽可能少。
- 根据两种不同的信度(95% 和 90%),分别决定是否接收零配件。
- 建模思路:
- 统计检验模型:可以使用二项分布模型或超几何分布模型来模拟抽样检测的过程。假设零配件的次品率为 p ,我们需要设计一个检测方案,使得在给定的信度下,能够判断次品率是否超过或不超过标称值(10%)。
- 创新性思路:利用贝叶斯方法结合抽样检测数据,逐步更新对次品率的估计,减少样本量。同时,采用自适应抽样方法,根据前期检测结果动态调整样本量,进一步优化检测成本。
问题 2:生产过程各阶段的决策问题
- 问题描述:
- 企业在生产的不同阶段(零配件、装配、成品)需要作出检测与处理决策,决定是否检测、拆解、报废以及如何处理不合格品。
- 要求根据不同的情况(零配件次品率、购买单价、检测成本等)制定决策方案。
- 建模思路:
- 多阶段决策模型:使用动态规划模型(Dynamic Programming)来处理多阶段的决策过程。每个阶段(零配件检测、装配检测、成品检测)都有不同的决策选择(检测、拆解、报废),目标是最小化总成本。
- 成本-收益分析模型:对每个决策进行成本和预期收益分析,结合概率模型计算不同决策的期望成本和收益。
- 创新性思路:引入强化学习模型(如Q-learning),模拟在生产过程中的长期学习和决策,优化每个阶段的策略选择。
问题 3:多工序多零配件的生产过程决策
- 问题描述:
- 企业有多个工序和多个零配件,已知各个零配件、半成品和成品的次品率,需要对生产过程进行全局优化。
- 建模思路:
- 网络流模型:将整个生产过程建模为一个有向图(Directed Graph),节点代表零配件、半成品和成品,边代表不同的工序和装配过程。通过网络流算法(如最小费用最大流)优化整个生产过程的成本和次品率。
- 多目标优化模型:考虑到生产成本、次品率、市场需求等多个目标,使用多目标优化算法(如遗传算法、粒子群优化算法)来优化生产策略。
- 创新性思路:在模型中引入不确定性因素(如市场波动、供应商质量变化等),通过鲁棒优化(Robust Optimization)来设计具有高抗干扰能力的生产方案。
问题 4:基于抽样检测方法的重新决策
- 问题描述:
- 假设问题2和问题3中的零配件、半成品和成品次品率均是通过抽样检测方法得到的,需要重新完成问题2和问题3。
- 建模思路:
- 贝叶斯更新模型:在进行抽样检测后,根据检测结果不断更新对次品率的估计。结合问题1的抽样检测模型,调整问题2和问题3的决策模型。
- 序贯决策模型:利用序贯检验方法(Sequential Testing),在检测过程中实时更新决策方案,减少不必要的检测次数和成本。
- 创新性思路:将贝叶斯推断与马尔可夫决策过程(MDP)相结合,动态调整生产策略,优化生产过程中的每一个决策。
问题1:抽样检测方案设计
1.1 问题分析
目标是设计一个抽样检测方案,使得在最小的检测次数下,以一定的置信度判断零配件的次品率是否超过标称值10%。我们需要考虑两种情形:
1. 在95%的信度下认定次品率超过10%,则拒收该批零配件。
2. 在90%的信度下认定次品率不超过10%,则接收该批零配件。
1.2 数学模型
1.2.1 假设条件
- 次品率:标称值为10%,即 p_0 = 0.10 。
- 样本大小:设样本大小为 n 。
- 次品数:设在样本中检测出的次品数为 x 。
1.2.2 检验方法
利用二项分布进行假设检验。
假设次品率为 p ,则次品数 x 服从二项分布: x∼Binomial(n,p) 我们需要进行两类假设检验:
- 对于情况 (1)(拒收):检验次品率是否大于 10 ,即 对H0:p≤0.10对H1:p>0.10 。
- 对于情况 (2)(接收):检验次品率是否小于等于 10 ,即 对H0:p≥0.10对H1:p<0.10 。
1.2.3 检验统计量
使用二项分布的累积分布函数(CDF)计算对应的检验统计量:
P(X≤k|p0)=∑i=0k(ni)p0i(1−p0)n−i 其中 k 是可以接受的最大次品数。
根据不同的置信度,确定临界值 k ,使得: 或P(X≤k|p0)=0.95或0.90
1.2.4 样本量的确定
需要通过计算来确定最小的样本量 n ,使得在给定的置信水平下,能够有效地拒收或接收零配件。
1.3 Python代码实现及可视化
以下是使用Python进行计算和可视化的实现代码:
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import binom
# 假设次品率
p0 = 0.10
# 设定信度
confidence_level_1 = 0.95 # 拒收
confidence_level_2 = 0.90 # 接收
# 样本量范围
n_range = np.arange(10, 101)
# 计算对应的k值和拒收/接收的概率
k_values_1 = []
k_values_2 = []
for n in n_range:
# 拒收情形的k值
k1 = binom.ppf(1-confidence_level_1, n, p0)
k_values_1.append(k1)
# 接收情形的k值
k2 = binom.ppf(confidence_level_2, n, p0)
k_values_2.append(k2)
# 绘制k值随样本量变化的图
plt.figure(figsize=(12, 6))
plt.plot(n_range, k_values_1, label='95% confidence level (Refuse)', marker='o')
plt.plot(n_range, k_values_2, label='90% confidence level (Accept)', marker='x')
plt.xlabel('Sample Size (n)')
plt.ylabel('Critical Value (k)')
plt.title('Critical Value vs. Sample Size for Different Confidence Levels')
plt.legend()
plt.grid(True)
plt.show()
1.4 可视化结果分析
- 图中显示了在不同样本量下,对于95%和90%信度的情况,拒收和接收零配件的临界值 k 如何变化。
- 通过观察这些曲线,可以选择一个合适的样本量,使得在保证足够信度的前提下,检测次数最少。
问题2:生产过程的各阶段决策问题详细解题过程
2.1 问题分析
根据表1中提供的情况,企业需要在生产过程中各个阶段做出决策以最小化总成本。决策包括:
- 零配件检测决策:
- 是否对零配件1和/或零配件2进行检测。
- 如果检测,检测出的不合格零配件将被丢弃。
- 成品检测决策:
- 是否对装配好的每一件成品进行检测。
- 如果检测,只有检测合格的成品才能进入市场。
- 不合格成品处理决策:
- 对检测出的不合格成品是否进行拆解。
- 如果拆解,拆解后的零配件会重复零配件检测步骤。
- 如果不拆解,直接将不合格成品丢弃。
- 用户调换决策:
- 对用户退回的不合格品进行无条件调换,产生调换损失。
2.2 数学模型
我们需要最小化总成本,综合考虑采购成本、检测成本、装配成本、拆解费用、调换损失等。
2.2.1 定义变量
N1,N2 :零配件1和零配件2的采购数量
q1,q2 :零配件1和零配件2的次品率
C1,C2 :零配件1和零配件2的采购单价
D1,D2 :零配件1和零配件2的检测成本咕咕咕~
Df :成品的检测成本
Cscrap :报废费用
咕咕咕~
2.2.2 成本计算公式
- 采购成本: Cpurchase=C1⋅N1+C2⋅N2
- 零配件检测成本: Cdet parts=y1⋅D1⋅N1⋅(1−q1)+y2⋅D2⋅N2⋅(1−q2)
- 成品装配成本: Cassem=Cassem⋅min(N1,N2)
- 成品检测成本: 咕咕咕~
- 报废成本: Cscrap=(1−w)⋅Cscrap⋅qf⋅min(N1,N2)
- 咕咕咕~
2.2.3 优化目标
min Ctotal=Cpurchase+Cdet parts+Cassem+Cdet finish+Cscrap+Cdis+Cswap
2.2.4 约束条件
y1,y2,zf,w∈{0,1} :决策变量,表示是否检测或处理(0表示不做,1表示做)。
零配件和成品数量关系约束。
2.3 Python代码实现及可视化
以下是使用Python进行决策优化和可视化的实现代码:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.optimize import minimize
# 输入数据
data = {
'零配件1次品率': [0.1, 0.2, 0.1, 0.2, 0.1, 0.05],
# 咕咕咕
'零配件2检测成本': [3, 3, 3, 1, 1, 3],
# 咕咕咕
'拆解费用': [5, 5, 5, 5, 5, 40]
}
df = pd.DataFrame(data)
# 成本函数
def total_cost(decision_vars, row):
y1, y2, z_f, w = decision_vars
y1, y2, z_f, w = round(y1), round(y2), round(z_f), round(w)
# 读取输入数据
p1 = df.loc[row, '零配件1次品率']
p2 = df.loc[row, '零配件2次品率']
C1 = df.loc[row, '零配件1采购单价']
C2 = df.loc[row, '零配件2采购单价']
D1 = df.loc[row, '零配件1检测成本']
D2 = df.loc[row, '零配件2检测成本']
p_f = df.loc[row, '成品次品率']
C_assem = df.loc[row, '成品装配成本']
D_f = df.loc[row, '成品检测成本']
C_scrap = df.loc[row, '调换损失']
C_dis = df.loc[row, '拆解费用']
C_swap = df.loc[row, '调换损失']
C_market = df.loc[row, '市场售价']
# 计算成品数量
product_count = 1000 * (1 - p1) * (1 - p2)
# 采购成本
# 咕咕咕
# 报废成本
scrap_cost = (1 - w) * C_scrap * p_f * product_count
# 拆解成本
# 咕咕咕
# 调换损失
# 咕咕咕
# 总成本
# 咕咕咕
# 优化过程
optimal_decisions = []
for i in range(len(df)):
result = minimize(total_cost, [0, 0, 0, 0], args=(i,), bounds=[(0, 1), (0, 1), (0, 1), (0, 1)], method='SLSQP')
# 咕咕咕
(w_opt)))
print(f"Case {i+1}: Optimal Decisions -> y1 = {round(y1_opt)}, y2 = {round(y2_opt)}, z_f = {round(z_f_opt)}, w = {round(w_opt)}")
print(f"Minimum Total Cost for Case {i+1}: {result.fun:.2f}\n")
# 可视化
decision_matrix = np.array(optimal_decisions)
# 咕咕咕
plt.xticks(range(1, 7))
plt.ylim(-0.1, 1.1)
plt.xlabel('Case Number')
plt.ylabel('Decision (0 = No, 1 = Yes)')
plt.title('Optimal Decisions Across Different Cases')
plt.legend()
plt.grid(True)
plt.show()
2.4 可视化结果分析
- 图示解释:折线图展示了在不同情况下,每个决策变量(是否检测零配件1、检测零配件2、检测成品、拆解不合格品)的最优决策(0表示不做该决策,1表示做该决策)。
- 结果解读:通过优化模型和计算,可以明确在生产过程中应采取的最优决策,以最小化整体生产成本。不同情形下的最优决策可能不同,具体取决于每种情况下的成本参数和次品率。
问题3:多工序多零配件的生产过程决策
3.1 问题分析
在问题3中,企业生产流程包含多个工序和零配件,具体来说是8个零配件通过两道工序组装成3个半成品,然后组装成最终成品。已知每个零配件、半成品和成品的次品率和成本,企业需要制定一个优化的生产过程决策方案,以最小化生产总成本。
决策需要考虑以下方面:咕咕咕~
3.2 数学模型
3.2.1 定义变量
:第个零配件的数量,Ni:第i个零配件的数量,i=1,2,…,8
:第个零配件的次品率,qi:第i个零配件的次品率,i=1,2,…,8
:第个零配件的采购单价Ci:第i个零配件的采购单价
咕咕咕~
:成品的装配成本Cassem:成品的装配成本
咕咕咕~
:拆解费用Cdis:拆解费用
:调换损失Cswap:调换损失
:成品的市场售价Cmarket:成品的市场售价
3.2.2 成本计算公式
- 零配件采购成本: Cpurchase=∑i=18Ci⋅Ni
- 零配件检测成本: 咕咕咕~
- 半成品装配和检测成本: 咕咕咕~
- 成品装配和检测成本: 咕咕咕~
- 报废成本: Cscrap=(1−w)⋅Cscrap⋅qf⋅Nfinish
- 拆解成本: Cdis=w⋅Cdis⋅qf⋅Nfinish
- 调换损失: 咕咕咕~
3.2.3 优化目标
min Ctotal=Cpurchase+Cdet parts+Cdet half+Cassem det finish+Cscrap+Cdis+Cswap
3.2.4 约束条件
yi,zj,zf,w∈{0,1} :决策变量,表示是否检测或处理(0表示不做,1表示做)。
零配件、半成品和成品数量关系的约束。
3.3 Python代码实现及可视化
以下是使用Python进行决策优化和可视化的实现代码:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.optimize import minimize
# 输入数据
data = {
'零配件次品率': [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1],
'采购单价': [2, 8, 12, 2, 8, 12, 8, 12],
# 咕咕咕
'成品检测成本': [6],
'市场售价': [200],
'调换损失': [40],
'拆解费用': [10]
}
df_parts = pd.DataFrame(data)
# 成本函数
def total_cost(decision_vars, df_parts):
# 咕咕咕
# 计算采购成本
purchase_cost = np.sum(df_parts['采购单价'] * 1000)
# 计算零配件检测成本
det_parts_cost = np.sum(y_vars * df_parts['检测成本'] * 1000 * (1 - df_parts['零配件次品率']))
# 计算半成品检测成本
half_product_count = 1000 * np.prod(1 - df_parts['零配件次品率'][:3])
det_half_cost = np.sum(z_vars * df_parts['半成品检测成本'][:3] * half_product_count * (1 - df_parts['半成品次品率']))
# 计算成品检测成本
# 咕咕咕
# 报废成本
scrap_cost = (1 - w) * df_parts['调换损失'][0] * df_parts['成品次品率'][0] * finish_product_count
# 拆解成本
dis_cost = w * df_parts['拆解费用'][0] * df_parts['成品次品率'][0] * finish_product_count
# 调换损失
swap_cost = df_parts['调换损失'][0] * df_parts['成品次品率'][0] * finish_product_count
# 总成本
total = purchase_cost + det_parts_cost + det_half_cost + det_finish_cost + scrap_cost + dis_cost + swap_cost
return total
# 优化目标
initial_guess = [0] * 13 # 初始猜测值
bounds = [(0, 1)] * 13 # 决策变量的取值范围
result = minimize(total_cost, initial_guess, args=(df_parts,), bounds=bounds, method='SLSQP')
# 获取最优解
optimal_decisions = result.x
print("Optimal Decisions:")
print(f"零配件检测: {optimal_decisions[:8]}")
print(f"半成品检测: {optimal_decisions[8:11]}")
print(f"成品检测: {optimal_decisions[11]}")
print(f"拆解决策: {optimal_decisions[12]}")
print(f"Minimum Total Cost: {result.fun:.2f}")
# 可视化
plt.figure(figsize=(10, 6))
decision_labels = ['零配件1检测', '零配件2检测', '零配件3检测', '零配件4检测',
'零配件5检测', '零配件6检测', '零配件7检测', '零配件8检测
',
'半成品1检测', '半成品2检测', '半成品3检测', '成品检测', '拆解不合格品']
plt.bar(decision_labels, optimal_decisions, color='skyblue')
plt.xticks(rotation=45)
plt.ylim(0, 1.1)
plt.ylabel('Decision (0 = No, 1 = Yes)')
plt.title('Optimal Decisions for Production Process')
plt.grid(axis='y')
plt.show()
3.4 可视化结果分析
- 图示解释:条形图展示了在不同阶段(零配件检测、半成品检测、成品检测、拆解不合格品)的最优决策(0表示不做该决策,1表示做该决策)。
- 结果解读:通过优化模型和计算,明确了在生产过程中应采取的最优决策,以最小化整体生产成本。不同零配件、半成品和成品的检测和处理决策是根据各自的次品率和成本优化的。
问题4:基于抽样检测的生产过程优化决策
4.1 问题分析
在问题4中,假设问题2和问题3中所有的零配件、半成品和成品的次品率均是通过抽样检测方法(如问题1中的方法)得出的。这意味着,我们在决策过程中,需要考虑抽样检测的不确定性,重新优化生产过程中的检测和处理决策。
问题4要求我们在重新评估这些次品率的基础上,重新设计生产过程的各阶段决策方案,以最小化生产总成本。由于抽样检测的次品率是基于样本数据估计的,这些次品率本身存在不确定性,我们需要考虑这种不确定性对决策的影响。
4.2 数学模型
4.2.1 假设条件
- 抽样检测估计次品率:设零配件、半成品和成品的次品率分别为 咕咕咕~
- 置信区间:咕咕咕~
4.2.2 引入置信区间的优化目标
我们需要在决策模型中引入置信区间,考虑次品率的不确定性对总成本的影响。我们可以使用鲁棒优化方法,确保在最坏情况下的成本最低。
- 次品率的置信区间:
对于零配件 i ,次品率的置信区间为 [q^iL,q^iU] 。
对于半成品 j ,次品率的置信区间为 咕咕咕~
对于成品,次品率的置信区间为 咕咕咕~
- 鲁棒成本函数: 我们定义一个鲁棒优化目标函数,在所有可能的次品率范围内(即次品率在其置信区间内变化时),最小化最大成本。
咕咕咕~
- 鲁棒优化问题: 目标是找到检测和处理的最优决策,以确保在最坏情况下(即次品率达到其置信区间的上限)总成本最低。
4.2.3 优化目标
min Ctotal=Cpurchase+Cdet parts+Cdet half+Cassem det finish+Cscrap+Cdis+Cswap
其中,各个成本计算公式与问题2和问题3相同,但次品率使用的是其置信区间内的最大值。
4.3 Python代码实现及可视化
以下是使用Python进行鲁棒优化的实现代码:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.optimize import minimize
# 输入数据 - 抽样检测的置信区间
data = {
'零配件次品率': [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1],
'采购单价': [2, 8, 12, 2, 8, 12, 8, 12],
'检测成本': [1, 1, 2, 1, 1, 2, 1, 2],
'半成品次品率': [0.1, 0.1, 0.1],
'半成品检测成本': [4, 4, 4],
'成品次品率': [0.1],
'装配成本': [8],
'成品检测成本': [6],
'市场售价': [200],
'调换损失': [40],
'拆解费用': [10]
}
# 假设置信区间宽度为0.02
confidence_interval_width = 0.02
# 构建DataFrame
df_parts = pd.DataFrame({
'零配件次品率': [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1],
'采购单价': [2, 8, 12, 2, 8, 12, 8, 12],
'检测成本': [1, 1, 2, 1, 1, 2, 1, 2]
})
df_half = pd.DataFrame({
'半成品次品率': [0.1, 0.1, 0.1],
'半成品检测成本': [4, 4, 4]
})
df_finish = pd.DataFrame({
'成品次品率': [0.1],
'装配成本': [8],
'成品检测成本': [6],
'市场售价': [200],
'调换损失': [40],
'拆解费用': [10]
})
# 成本函数
def total_cost(decision_vars, worst_case=True):
y_vars = decision_vars[:8] # 零配件的检测决策
z_vars = decision_vars[8:11] # 半成品的检测决策
z_f = decision_vars[11] # 成品的检测决策
w = decision_vars[12] # 拆解决策
# 根据worst_case选择次品率的上限或下限
# 咕咕咕
# 咕咕咕
# 计算半成品检测成本
half_product_count = 1000 * np.prod(1 - part_defects[:3])
det_half_cost = np.sum(z_vars * df_half['半成品检测成本'] * half_product_count * (1 - half_defects))
# 咕咕咕
# 报废成本
scrap_cost = (1 - w) * df_finish['调换损失'][0] * finish_defect * finish_product_count
# 拆解成本
dis_cost = w * df_finish['拆解费用'][0] * finish_defect * finish_product_count
# 咕咕咕
# 鲁棒优化
initial_guess = [0] * 13
bounds = [(0, 1)] * 13
# 求解最坏情况下的总成本最小化
# 咕咕咕
# 求解最优情况下的总成本最小化(用于比较)
result_best = minimize(total_cost, initial_guess, args=(False,), bounds=bounds, method='SLSQP')
optimal_decisions_best = result_best.x
# 咕咕咕
print(f"成品检测: {optimal_decisions_worst[11]}")
print(f"拆解决策: {optimal_decisions_worst[12]}")
print(f"Minimum Total Cost (Worst Case): {result_worst.fun:.2f}\n")
print("Best Case Optimal Decisions:")
print(f"零配件检测: {optimal_decisions_best[:8]}")
print(f"半成品检测: {optimal_decisions_best[8:11]}")
print(f"成品检测: {optimal_decisions_best[11]}")
print(f"拆解决策: {optimal_decisions_best[12]}")
print(f"Minimum Total Cost (Best Case): {result_best.fun:.2f}")
# 可视化结果比较
plt.figure(figsize=(10, 6))
decision_labels = ['零配件1检测', '零配件2检测', '零配件3检测', '零配件4检测',
'零配件5检测', '零配件6检测', '零配件7检测', '零配件8检测',
'半成品1检测', '半成品2检测', '半成品3检测', '成品检测', '拆解不合格品']
# 最坏情况下的决策
plt.bar(np.arange(len(decision_labels))-0.15, optimal_decisions_worst, width=0.3, color='red', label='Worst Case')
# 最优情况下的决策
plt.bar(np.arange(len(decision_labels))+0.15, optimal_decisions_best, width=0.3, color='green', label='Best Case')
# 咕咕咕
plt.show()
4.4 可视化结果分析
- 图示解释:条形图展示了最坏情况下和最优情况下的最优决策对比(0表示不做该决策,1表示做该决策)。红色条形表示最坏情况下的决策,绿色条形表示最优情况下的决策。
- 结果解读:通过鲁棒优化,可以看到在最坏情况下(即所有次品率达到其置信区间的上限),系统做出了不同的决策,确保了在最不利情况下的成本最低。相比之下,最优情况下的决策考虑了更理想的次品率,这样可以看到两者之间的差异。
24国赛赛前准备:
论文中好的可视化内容至关重要 这里先分享一些国赛数学建模中的常用的可视化内容
数学建模中的可视化分析是一个重要的环节,它帮助研究者和观众更好地理解数据和模型的结果。以下是一些进阶的可视化分析方法和算法,以及相应的Python代码示例:
蒙特卡罗算法
算法介绍:蒙特卡罗算法是一种基于概率和随机性的方法,通过生成大量随机样本来模拟复杂系统的行为或计算数值解。它不依赖于严格的解析解,而是通过随机采样来估计问题的结果。例如,在估计圆周率π的值时,可以在一个正方形内随机生成点,然后计算落在内切圆内的点的比例,利用这个比例估计π的值。蒙特卡罗算法广泛应用于金融风险分析、物理学中的粒子行为模拟、复杂系统的概率分析等领域.
算法示例:
我们可以使用蒙特卡罗算法来估计三维图形的体积。下面是一个简单的Python程序,它使用蒙特卡罗算法来估计一个球体的体积,并使用Matplotlib库进行三维可视化。
import random
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
def monte_carlo_volume(n):
count = 0
for i in range(n):
x = random.uniform(-1, 1)
y = random.uniform(-1, 1)
z = random.uniform(-1, 1)
if x**2 + y**2 + z**2 <= 1:
count += 1
return (count / n) * 8
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
n = 10000
volume = monte_carlo_volume(n)
print(f"Estimated volume of the sphere: {volume:.4f}")
xs = []
ys = []
zs = []
colors = []
for i in range(n):
x = random.uniform(-1, 1)
y = random.uniform(-1, 1)
z = random.uniform(-1, 1)
if x**2 + y**2 + z**2 <= 1:
xs.append(x)
ys.append(y)
zs.append(z)
colors.append(z)
ax.scatter(xs, ys, zs, c=colors, cmap='coolwarm', marker='o')
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')
plt.show()
- 程序首先定义了一个名为monte_carlo_volume的函数,该函数使用蒙特卡罗算法来估计球体的体积。
- 然后,程序使用monte_carlo_volume函数来估计球体的体积,并将结果打印到控制台上。
- 接下来,程序使用Matplotlib库创建一个3D散点图,该图显示了球体的随机采样点,并根据每个点的z坐标值进行颜色渐变。
可视化效果如下:
部分依赖分析图(Partial Dependence Plot)
部分依赖分析图(Partial Dependence Plot,简称PDP)是一种用于解释复杂机器学习模型的可视化工具。PDP可以帮助我们理解一个或两个特征对模型预测结果的影响,而忽略掉其他特征的影响。这种分析对于提高模型的透明度和可解释性非常有价值。
主要特点和用途
1. 展示特征影响:PDP显示了在保持模型中所有其他特征固定的情况下,一个特征(或两个特征的交互)对预测结果的平均影响。
2. 可解释性:对于复杂的模型(如随机森林、梯度提升机等),PDP帮助解释单个特征如何影响模型的预测,提高了模型的可解释性。
3. 非线性关系和交互效应:PDP特别适合揭示特征与预测目标之间的非线性关系,以及不同特征之间的交互效应。
工作原理
PDP通过对数据集中的特定特征进行多次采样,并保持其他特征不变,然后计算模型对这些样本的预测平均值来生成。
PDP是机器学习领域中一个非常有用的工具,尤其是在需要解释复杂模型的决策过程时。通过使用PDP,数据科学家和分析师可以更好地理解和信任他们的模型预测。图像: 部分依赖分析图的生成需要一个训练好的模型和特定的数据集,这里使用一个简单的合成数据集和一个基本的分类模型来演示。
这是一个部分依赖分析图的示例,它展示了在一个简单的合成数据集上训练的梯度提升分类器中,特征0、特征1以及它们的组合(特征0和1)对模型预测的影响。这种类型的图表非常有用于解释机器学习模型的行为,特别是在识别哪些特征对模型预测最有影响时。
生成这个图表的Python代码如下:
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.inspection import plot_partial_dependence
from sklearn.datasets import make_classification
# 创建合成数据集
X, y = make_classification(n_samples=100, n_features=5, random_state=42)
# 训练梯度提升分类器
clf = GradientBoostingClassifier(n_estimators=50, random_state=42).fit(X, y)
# 绘制部分依赖图
features = [0, 1, (0, 1)]
plot_partial_dependence(clf, X, features, grid_resolution=20)
# 显示图形
plt.suptitle('Partial Dependence Plots')
plt.show()
国赛的进阶可视化图表:成对关系图
成对关系图是一种可视化技术,用于显示数据集中每个变量之间的关系。它通常用于探索数据集中的相关性和分布情况。成对关系图可以用于许多不同的应用程序,例如数据分析、生物学、金融等领域。
下面是一个简单的Python程序,它使用Seaborn库创建一个成对关系图,该图显示了Iris数据集中每个变量之间的关系: iris数据集是一个经典的机器学习数据集,用于分类和聚类等任务。它包含了150个样本,每个样本有四个特征和一个标签。特征是鸢尾花的萼片和花瓣的长度和宽度,单位是厘米。标签是鸢尾花的三个品种之一:山鸢尾、变色鸢尾和维吉尼亚鸢尾。这个数据集是由英国统计学家和生物学家Fisher在1936年发表的论文中提出的,是最早用于评估分类方法的数据集之一。iris数据集在统计学和机器学习领域都有广泛的应用和影响,被认为是一个简单而优美的数据集。
这个程序使用Seaborn库创建一个成对关系图,该图显示了Iris数据集中每个变量之间的关系。程序使用sns.load_dataset函数加载Iris数据集,并使用sns.pairplot函数创建一个成对关系图。
import seaborn as sns
import matplotlib.pyplot as plt
iris = sns.load_dataset("iris")
sns.pairplot(iris, hue="species", markers=["o", "s", "D"])
plt.show()
成对关系图的应用场景包括但不限于以下几个方面:
- 数据分析:成对关系图可以用于显示数据集中每个变量之间的关系,帮助数据分析人员更好地理解数据。
- 生物学:成对关系图可以用于显示基因表达数据的密度和分布情况,帮助生物学家更好地理解基因表达数据。
- 金融:成对关系图可以用于显示股票价格的密度和分布情况,帮助投资者更好地理解股票市场。
其他常用可视化图表
1. 折线图(Line Plot)
用途:展示数据随时间或有序类别变化的趋势。
Python 示例:
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]
plt.plot(x, y)
plt.title('Line Plot Example')
plt.xlabel('X Axis')
plt.ylabel('Y Axis')
plt.show()
```
2. 柱状图(Bar Chart)
用途:比较不同类别间的数值大小。 Python 示例:
categories = ['Category A', 'Category B', 'Category C']
values = [10, 20, 15]
plt.bar(categories, values)
plt.title('Bar Chart Example')
plt.xlabel('Categories')
plt.ylabel('Values')
plt.show()
3. 散点图(Scatter Plot)
用途:展示两个变量之间的关系。 Python 示例:
x = [5, 7, 8, 7, 2, 17, 2, 9, 4, 11, 12, 9, 6]
y = [99, 86, 87, 88, 100, 86, 103, 87, 94, 78, 77, 85, 86]
plt.scatter(x, y)
plt.title('Scatter Plot Example')
plt.xlabel('X Axis')
plt.ylabel('Y Axis')
plt.show()
4. 直方图(Histogram)
用途:展示数据的分布情况。
Python 示例:
data = np.random.normal(0, 1, 1000)
plt.hist(data, bins=30)
plt.title('Histogram Example')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.show()
5. 饼图(Pie Chart)
用途:显示各部分占整体的比例。
Python 示例:
sizes = [15, 30, 45, 10]
labels = ['Frogs', 'Hogs', 'Dogs', 'Logs']
plt.pie(sizes, labels=labels, autopct='%1.1f%%')
plt.axis('equal') # Equal aspect ratio ensures that pie is drawn as a circle.
plt.title('Pie Chart Example')
plt.show()
6. 热力图(Heatmap)
用途:展示变量间的相关程度或数据的密度。
Python 示例:
data = np.random.rand(10, 10)
sns.heatmap(data, annot=True)
plt.title('Heatmap Example')
plt.show()
7. 箱形图(Box Plot)
用于展示数据的分布和异常值。
Python 示例:
data = np.random.rand(10, 5)
plt.boxplot(data)
plt.title('Box Plot Example')
plt.show()
8. 三维散点图(3D Scatter Plot)
用于在三维空间中展示数据点。
Python 示例:
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x = np.random.standard_normal(100)
y = np.random.standard_normal(100)
z = np.random.standard
9.三维曲面图
这种图表非常适合于展示有关两个自变量和一个因变量间复杂关系的数据。
Python 示例: 这是一个三维曲面图的示例,展示了一个由函数 z=sin(x2+y2) 生成的曲面。使用了matplotlib的plot_surface方法来绘制曲面,并通过viridis色彩映射来增强视觉效果。以下是生成这个图形的Python代码:
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np
# 创建一个图形对象
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='3d')
# 生成数据
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
x, y = np.meshgrid(x, y)
z = np.sin(np.sqrt(x**2 + y**2))
# 绘制三维曲面图
surf = ax.plot_surface(x, y, z, cmap=cm.viridis)
# 添加颜色条
fig.colorbar(surf)
# 设置标题
ax.set_title('3D Surface Plot')
# 显示图形
plt.show()
三维曲面的二维投影图
介绍:将三维曲面沿一个或多个轴投影到二维平面上,以查看曲面的不同视角。
示例代码:
fig = plt.figure()
ax = fig.add_subplot(111)
ax.contourf(x, y, z, cmap=cm.viridis)
plt.show()