华为杯数学建模C题
当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2021年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。
让我们来看看研赛的C题呀~!
问题重述
现在创新类竞赛很多,其中规模较大的竞赛,一般采用两阶段(网评、现场评审)或三阶段(网评、现场评审和答辩)评审。创新类竞赛的特点是没有标准答案,需要评审专家根据命题人(组)提出的评审框架(建议)独立评审。所以,对同一份作品,不同评委的评分可能存在较大差异。事实上,当竞赛规模大,评委的人数众多时,极差大的问题更为突出。显然,简单地依据多位评委评分的总和进行排序并不是创新类竞赛评审的好方案。因此,探讨大规模创新类竞赛评审方案的公正性、公平性和科学性具有深远意义。
问题一
在每个评审阶段,作品通常都是随机分发的,每份作品需要多位评委独立评审。为了增加不同评审专家所给成绩之间的可比性,不同专家评审的作品集合之间应有一些交集。但有的交集大了,则必然有交集小了,则可比性变弱。请针对3000支参赛队和125位评审专家,每份作品由5位专家评审的情况,建立数学模型确定最优的“交叉分发”方案,并讨论该方案的有关指标(自己定义)和实施细节。
目标是确定最优的“交叉分发”方案,以增加不同评审专家所给成绩之间的可比性。我们可以将这个问题建模为一个组合优化问题,通过数学建模和求解方法来找到最佳方案。
- 确定变量:
定义一个二元变量 x(i, j),其中 i 表示评审专家的编号,j 表示作品的编号。这个变量表示第 i 位评审专家是否评审第 j 份作品。x(i, j) 取值为 1 表示评审专家 i 评审了作品 j,取值为 0 表示没有评审。 - 定义目标函数:
目标是最大化不同评审专家所给成绩之间的可比性,即最大化不同专家评审的作品集合之间的交集。因此,我们可以定义目标函数为:
M a x i m i z e : ∑ ( i , j ) x ( i , j ) Maximize: ∑(i,j) x(i, j) Maximize:∑(i,j)x(i,j)
这个目标函数表示要最大化所有评审专家和作品之间的交叉评审数量。 - 添加约束条件:
限制每位评审专家最多评审 k 份作品:这可以表示为以下约束条件:
Subject to: ∑j x(i, j) <= k,对所有 i
这个约束条件确保每位评审专家不会超过最大评审作品数 k。
每份作品需要被 m 位评审专家评审:这可以表示为以下约束条件:
S u b j e c t t o : ∑ i x ( i , j ) = m ,对所有 j Subject to: ∑i x(i, j) = m,对所有 j Subjectto:∑ix(i,j)=m,对所有j
这个约束条件确保每份作品都会被 m 位评审专家评审。
二元变量约束: x ( i , j ) ∈ 0 , 1 x(i, j) ∈ {0, 1} x(i,j)∈0,1 - 求解优化问题:
●使用优化算法或数学规划工具来求解上述建立的优化问题。这些工具可以帮助找到最优的 x(i, j) 变量值,即最佳的“交叉分发”方案。 - 分析结果:
●一旦求解完成,可以分析结果,确定哪些评审专家应该评审哪些作品,以最大程度上提高评审的可比性。 - 实施细节:
●实际应用时,需要考虑评审专家的可用性、作品的特点、评审时间等实际因素。此外,可能需要进行多次实验和调整以优化方案。
它是一个整数线性规划问题(Integer Linear Programming, ILP),因为我们要求解的变量 x(i, j) 是二进制整数(0或1),并且我们要最大化一个线性目标函数。
import pulp
# 创建线性规划问题
model = pulp.LpProblem("CrossDistribution", pulp.LpMaximize)
# 定义评审专家数量和作品数量
num_experts = 125
num_works = 3000
# 定义每位评审专家最多评审的作品数量和每份作品需要被评审的专家数量
k = 20 # 最多评审的作品数量
m = 5 # 每份作品需要被评审的专家数量
# 创建二进制变量x(i, j)
x = pulp.LpVariable.dicts("x", ((i, j) for i in range(num_experts) for j in range(num_works)), cat='Binary')
# 定义目标函数:最大化交叉评审数量
model += pulp.lpSum(x[i, j] for i in range(num_experts) for j in range(num_works))
# 添加约束条件
# 每位评审专家最多评审k份作品的约束
for i in range(num_experts):
model += pulp.lpSum(x[i, j] for j in range(num_works)) <= k
# 每份作品需要被评审m位专家的约束
for j in range(num_works):
model += pulp.lpSum(x[i, j] for i in range(num_experts)) == m
# 求解线性规划问题
model.solve()
# 打印结果
print("Status:", pulp.LpStatus[model.status])
# 打印每位评审专家评审的作品列表
for i in range(num_experts):
selected_works = [j for j in range(num_works) if x[i, j].value() == 1]
print(f"评审专家 {i+1} 评审的作品列表:{selected_works}")
# 打印最大化的交叉评审数量
print("最大化的交叉评审数量:", pulp.value(model.objective))
问题二
我们需要探索不同的评审方案,比较它们的效果,并设计新的标准分计算模型。首先,我们可以选择两种不同的评审方案并进行比较。接着,根据比较结果和数据1中的一等奖作品排序(经专家协商取得一致的数据),可以改进标准分计算模型。以下是问题二的具体步骤:
步骤一:选择两种评审方案并比较
1.原始评审方案:
a.采用附件1中的标准分计算方法进行评审,并按标准分排序。
2.新评审方案(示例):
a.使用加权平均方法计算每位专家的评审成绩,以考虑专家之间的差异。可以使用专家历史评审表现作为权重。
b.对每份作品的加权平均评审成绩进行排序。
通过这两种方案,您可以得到不同的作品排名和获奖结果。比较它们的优劣,包括评审结果的一致性、公平性和可信度等。
步骤二:改进标准分计算模型
1.分析数据1(附件2提供的数据1):
a.分析数据1中的一等奖作品排序,这是经专家协商一致的排名。了解这些作品的特点和分布。
2.改进标准分计算模型:
a.基于数据1的分析结果和比较两种评审方案的经验,设计新的标准分计算公式,以更好地反映大规模创新类竞赛的评审特点。这个新的计算公式可以考虑专家的历史表现、作品的特点和多维度评审等因素。
示例如下(这只是一个示例,您可以根据实际情况进行修改):
新标准分 = 原始成绩 + 专家历史评审偏差
其中,专家历史评审偏差可以根据专家历史评审表现和作品的特点进行计算。
步骤三:验证和调整
1.使用新的标准分计算模型对数据1中的一等奖作品进行排序,与专家协商一致的排序进行比较。确保新模型能够更好地捕捉评审结果。
2.进行一些实验和测试,验证新标准分计算模型是否在更广泛的竞赛数据集上表现良好。
3.不断调整和改进新标准分计算模型,以满足不同竞赛和评审条件的需求。
4.每份作品的原始成绩(Raw Score):
a.让
R
i
j
R_{ij}
Rij 表示专家 i 对作品 j 的原始成绩。
5.每位专家的历史评审偏差(Expert Bias):
a.让
E
i
E_i
EiE 表示专家 i 的历史评审平均得分。
b.专家偏差
B
i
j
B_{ij}
Bij 可以表示为:
B
i
j
=
R
i
j
−
E
i
B_{ij} = R_{ij} - E_i
Bij=Rij−Ei
6.多维度评审成绩(Multidimensional Score):
a.让
M
j
M_j
Mj 表示作品 j 的多维度评审成绩。
7.作品之间的差异(Work Variation):
a.让
V
j
V_j
Vj 表示作品 j 的原始成绩的方差。
8.标准分(Standard Score):
a.让
S
i
j
S_{ij}
Sij 表示专家 ii 对作品 jj 的标准分,可以表示为:
S
i
j
=
R
i
j
+
B
i
j
−
α
⋅
V
j
S_{ij} = R_{ij} + B_{ij} - \alpha \cdot V_j
Sij=Rij+Bij−α⋅Vj
其中,\alphaα 是一个调整参数,用于平衡作品之间的差异对标准分的影响。您可以根据实际需求来选择合适的
α
α
\alphaα
αα 值。
import numpy as np
# 原始评审成绩矩阵,其中每行代表一位评审专家的评审成绩
# 每列代表一份作品的不同维度评审成绩
raw_scores = np.array([
[85, 90, 88, 92],
[78, 82, 80, 85],
# 添加更多专家的评审成绩
])
# 专家历史评审平均得分
expert_average_scores = np.mean(raw_scores, axis=1)
# 作品原始成绩的方差
work_variations = np.var(raw_scores, axis=0)
# 调整参数,用于平衡作品之间的差异对标准分的影响
alpha = 0.1 # 您可以根据需要调整这个参数
# 计算标准分
num_experts, num_works = raw_scores.shape
standard_scores = np.zeros((num_experts, num_works))
for i in range(num_experts):
for j in range(num_works):
expert_bias = raw_scores[i, j] - expert_average_scores[i]
standard_scores[i, j] = raw_scores[i, j] + expert_bias - alpha * work_variations[j]
# 打印每位专家对每份作品的标准分
for i in range(num_experts):
for j in range(num_works):
print(f"专家 {i+1} 对作品 {j+1} 的标准分:{standard_scores[i, j]}")
问题3
步骤一:分析极差问题
首先,我们需要分析大规模创新类竞赛评审中的极差问题。极差大的作品通常会处于高分段或低分段,而这可能会导致评审结果的不稳定性和不公平性。为了更好地理解极差问题,可以进行以下分析:
1.极差数据统计:计算每份作品在评审阶段的极差,以了解极差的分布情况。
2.创新性与极差关系:分析创新性与极差之间是否存在相关性,即创新性较高的作品是否更容易出现极差。
3.专家调整极差情况:分析第二阶段评审中专家对作品的极差调整情况,了解哪些作品需要调整极差以获得更准确的评审结果。
步骤二:建立极差模型
为了解决极差问题,可以建立一个极差模型,该模型考虑作品的特征、创新性和评审专家的历史表现。以下是一个示例极差模型的构建步骤:
1.特征工程:将每份作品的特征(如题目难度、创新性评分、论文结构等)纳入考虑,作为模型的输入特征。
2.创新性指标:引入一个创新性指标,该指标可以从作品的描述、方法、实验等方面评估创新性。这可以是基于自然语言处理或其他技术的指标。
3.专家历史评审数据:使用专家过去的评审历史数据,包括他们的评审结果和评审偏差。
4.模型训练:使用机器学习或统计模型(如回归模型、决策树、神经网络等),将输入特征与极差建立关联。
5.模型调整:根据模型的性能进行调整和验证,以确保模型能够准确预测作品的极差。
步骤三:极差调整策略
一旦建立了极差模型,可以采取以下策略来调整极差大的作品:
1.自动极差调整:使用模型预测极差,对极差大的作品进行自动调整。这可以通过重新分配评审权重、重新计算标准分或其他方法来实现。
2.专家协商:在第二阶段评审中,专家可以协商并讨论极差较大的作品,以达成一致的评审结果。这需要专家之间的合作和讨论。
3.模型反馈:将模型预测的极差信息反馈给专家,让他们在评审时更加注意极差大的作品,以减少不一致性。
4.多维度评审:采用多维度评审方法,以减少评审结果的极差。
步骤四:验证和改进
最后,需要验证模型和极差调整策略的效果。可以使用历史竞赛数据进行模型验证,并根据实际评审情况不断改进模型和策略。确保它们能够提高评审结果的一致性和公平性,同时保持对创新性的灵敏度。
import numpy as np
from sklearn.linear_model import LinearRegression
# 假设有以下数据,其中X是作品的特征,Y是极差
X = np.array([
[0.8, 0.9, 0.7],
[0.6, 0.5, 0.8],
# 添加更多作品的特征
])
Y = np.array([0.2, 0.3, 0.1, ...]) # 对应的极差数据
# 创建线性回归模型
model = LinearRegression()
# 训练模型
model.fit(X, Y)
# 假设有新的作品需要进行评审,需要预测其极差
new_work = np.array([[0.7, 0.8, 0.6]]) # 新作品的特征
predicted_variation = model.predict(new_work)
# 根据预测的极差进行调整
adjusted_score = raw_score - predicted_variation
# 打印结果
print("预测的极差:", predicted_variation)
print("调整后的成绩:", adjusted_score)
问题4
评审模型概述:
这个评审模型旨在综合考虑评审专家、作品特征和创新性,以产生更公正和准确的评审结果。该模型将评审问题转化为一个优化问题,通过优化算法求解最佳评审结果。
模型建议和步骤:
1.特征工程:
a.收集作品的特征数据,这些特征可以包括题目难度、创新性评分、方法复杂度、实验设计、作者背景等。
b.收集评审专家的历史评审数据,包括他们的评审结果和评审偏差。
2.构建目标函数:
a.定义一个目标函数,该函数将评审结果与作品特征和专家评审相关联。
b.目标函数可以包括对创新性的权重、对不同特征的权重、专家历史表现的权重等。
3.优化问题:
a.将评审问题转化为一个优化问题,目标是最大化或最小化目标函数。例如,可以尝试最大化作品的综合评分,以反映作品的质量和创新性。
4.求解优化问题:
a.使用优化算法(如线性规划、整数规划、遗传算法等)求解优化问题,以获得最佳的评审结果。
b.这可以通过现有的数学优化库来实现。
5.验证和调整模型:
a.使用历史竞赛数据进行模型验证和调整,以确保模型能够产生准确的评审结果。
b.考虑使用交叉验证等技术来评估模型的性能。
改进建议:
1.数据收集:
a.收集更多关于评审专家的信息,包括专业领域、经验和评审历史。
b.收集更多有关作品的信息,特别是关于创新性和贡献的信息。
2.多层次评审:
a.考虑采用多层次评审方法,其中第一层专家对作品进行初步评审,第二层专家对初选作品进行进一步评审。这可以减少极差和提高评审的准确性。
3.专家协商:
a.鼓励专家在评审结果上进行协商和讨论,以提高一致性和可信度。
4.透明性:
a.使评审过程更加透明,包括对评审标准和权重的明确说明。
5.反馈机制:
a.引入反馈机制,使得评审专家能够了解他们的评审结果如何影响最终评审结果,并在未来的评审中进行改进。
6.算法改进:
a.不断改进优化算法,以更高效地解决评审问题。
消融实验分析:
基准模型:使用完整的方法,即矩阵分解+取值范围控制+稀疏性约束。测量其逼近误差RMSE和复杂度C。
移除取值范围控制:仅使用矩阵分解+稀疏性约束,不限制取值范围。测量RMSE和C。
移除稀疏性约束:仅使用矩阵分解+取值范围控制,不要求稀疏性。测量RMSE和C。
仅矩阵分解:不使用取值范围控制和稀疏性约束。测量RMSE和C。
对比不同模型的RMSE和C。高RMSE表示逼近精度损失;高C表示复杂度增加。
矩阵分解是实现低复杂度逼近DFT的有效方法,但需要设计实现稀疏性。
约束矩阵中元素的取值范围,可以降低单个乘法的计算量。
在满足精度需求前提下,通过搜索可以找到使复杂度最小的分解方案。
对Kronecker积矩阵进行分解,可以将大型DFT分解为多个小矩阵,降低优化难度。
消融实验可以验证不同设计决策对逼近误差和复杂度的影响。
需要权衡误差精度与计算复杂度,根据实际需求确定可接受的trade-off。
该方法可以作为一种替代FFT的低复杂度DFT实现策略。
优化搜索和代码实现等细节亟待进一步改进。
目标函数(Objective Function):
●通常表示为J或f(x),其中x是决策变量,可以是评审结果。
●例如,最大化作品的综合评分可以表示为:
J
(
x
)
=
∑
(
w
i
∗
f
i
(
x
)
)
J(x) = ∑(w_i * f_i(x))
J(x)=∑(wi∗fi(x))
约束条件(Constraints):
●可以表示为等式或不等式条件,用于限制决策变量的取值范围。
●例如,约束总评分不超过某个阈值:
∑
(
w
i
∗
f
i
(
x
)
)
≤
C
∑(w_i * f_i(x)) ≤ C
∑(wi∗fi(x))≤C
1.标准差(Standard Deviation):
a.用于衡量数据集的分散程度,通常表示为σ。
b.评审结果的标准差可以用来衡量评审结果的不稳定性。
2.相关系数(Correlation Coefficient):
a.用于衡量两个变量之间的关联性,通常表示为ρ(rho)。
b.可以用于分析评审结果与作品特征之间的相关性。
3.权重(Weight):
a.用于给不同特征或评审结果赋予不同的重要性。
b.可以表示为w。
4.优化问题符号:
a.最大化问题通常用max表示,例如maximize J(x)。
b.最小化问题通常用min表示,例如minimize J(x)。
5.优化变量(Optimization Variables):
a.表示需要优化的决策变量,通常表示为x。
6.模型参数(Model Parameters):
a.表示模型中的参数,可以是权重、系数等,通常表示为θ。
from scipy.optimize import minimize
# 定义目标函数
def objective_function(x):
# 这是一个示例目标函数,可以根据实际情况替换
return x[0]**2 + x[1]**2
# 定义约束条件
def constraint(x):
# 这是一个示例约束条件,可以根据实际情况替换
return x[0] + x[1] - 1
# 初始猜测值
initial_guess = [0.5, 0.5]
# 定义约束
constraints = ({'type': 'eq', 'fun': constraint})
# 最小化目标函数
result = minimize(objective_function, initial_guess, constraints=constraints)
# 输出结果
print("最优解:", result.x)
print("最优值:", result.fun)
消融实验分析
1.明确研究问题:
a.确定哪些因素可能影响评审的公正性和效果。
2.定义要消融的因素:
a.根据研究问题,确定要消融的关键因素。这些因素可以包括:评审专家数量
i.评审方式(一阶段、两阶段)
ii.成绩调整方法(标准化、去掉最高分最低分等)
3.设置基准实验:
a.进行一次基准实验,使用当前的评审方案作为基准。记录所有相关数据,包括评审分数、作品的获奖情况、极差等。
4.逐步消融因素:
a.针对每个因素,进行逐步消融实验。例如,对于评审专家数量,可以按以下方式进行:在基准实验中使用全部专家进行评审。
i.然后,逐渐减少评审专家的数量,例如,只使用80%、60%、40%等比例的专家进行评审。
ii.记录每个实验条件下的评审结果。
5.记录和分析数据:
a.记录每个实验条件下的数据,包括各个阶段的评审分数、获奖情况、极差大小等。
b.使用统计分析方法比较不同实验条件下的数据,以确定哪些因素对评审结果和极差有显著影响。
6.得出结论:
a.根据数据分析的结果,得出结论。确定哪些因素对评审方案的公正性和效果具有重要影响,哪些因素对极差的大小有影响。
7.改进评审方案:
a.基于结论,提出可能的改进建议。例如,如果评审专家数量显著影响结果,可以考虑增加专家的参与或者改进专家的培训。
8.验证实验:
a.如果可能,进行验证实验以确认结论的可靠性。验证实验可以采用不同的数据集或竞赛进行。
9.总结研究结果:
a.撰写报告或总结,详细说明实验设计、结果和结论。这将有助于其他人了解您的研究工作。
(5 封私信 / 2 条消息) 如何评价2023数学建模研赛C题? - csdn