ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

2022五一赛C题火灾报警系统多模型评价:熵权Topsis与灰色关联度实战

2022五一赛C题火灾报警系统多模型评价:熵权Topsis与灰色关联度实战 简介这份资源是2022年五一数学建模联赛C题「火灾报警系统问题」的完整参赛成品论文面向备战数学建模竞赛的学生及需要建模案例参考的读者可用于学习熵权Topsis、灰色关联度与模糊综合评价等方法的实际应用。压缩包内共1个PDF文件约532KB内容为排版完整的论文正文涵盖问题重述、模型假设、符号说明及四问的建模求解全过程。论文针对火灾报警系统先筛选附件数据得到492起真实火灾建立熵权Topsis模型评估探测器并推荐光束感烟探测器再用层次分析法与模糊综合评价构建智能研判模型量化各大队报警真实性随后以熵权法结合灰色关联度评价管理水平指出F、D、Q大队较弱并给出改进方向最后提出系统维护建议。目前已有2739人学习下载适合作为赛题复盘、方法借鉴与作业参考的实战范例。1. 火灾报警系统问题里的多模型评价2022年五一赛C题到底在考什么2022年五一数学建模竞赛C题「火灾报警系统问题」的第一问核心不是让你去设计一个探测器电路而是给一批火灾报警系统的运行数据或评价指标要求你判断哪些系统更可靠、哪些指标更关键、不同评价方法给出的排序是否一致。这类题在赛后被反复讨论原因很实际它踩中了「多指标综合评价」这个工程里天天遇到、却总有人做翻车的点。熵权Topsis、灰色关联度模型、模糊综合评价模型、智能研判模型这几个词几乎成了这道题的标配工具箱。你如果是第一次接触会以为套个公式就完事真做过就知道指标正向化、量纲归一、权重到底用熵权还是AHP、Topsis的贴近度怎么算、灰色关联的分辨系数取多少每一步都能让最终排名变个样。这篇笔记就按我实际复现这道题的顺序把选型理由、可抄的代码、参数怎么定、哪里最容易翻车讲清楚目标是你读完能自己跑出一套自洽的评价结果而不是拼凑一份交差论文。2. 先把评价对象和指标体系立住火灾报警系统问题怎么建模2.1 从题目数据反推评价对象系统、指标、样本三层结构火灾报警系统问题的第一问通常给的是若干套报警系统或若干区域、若干型号在多个指标上的观测值。你要做的第一件事不是打开Python而是把三层结构写清楚评价对象是「哪几套系统」评价指标是「哪些列」样本是「每套系统一行」。常见指标包括响应时间、误报率、漏报率、探测灵敏度、覆盖半径、平均无故障时间、维护成本等。这里面有正向指标越大越好如灵敏度、无故障时间有负向指标越小越好如响应时间、误报率还有适度指标如覆盖半径太大太小都不好。如果这一步不区分方向后面熵权算出来的权重全是错的这是血泪经验里最常见的一条。我一般会先建一张指标属性表把每个指标的方向、量纲、取值范围列出来再决定预处理方式。量纲差异大的指标比如时间用秒、成本用万元必须归一化否则Topsis里欧氏距离会被大数量级指标主导。归一化的方法要和后续模型匹配Topsis常用向量归一化灰色关联常用初值化或均值化模糊综合评价常用隶属度函数。选错归一化等于给模型喂了错数据。提示先把指标方向表写进代码注释或单独一个字典后面所有模型共用避免每个模型各写一套导致口径不一致。2.2 指标正向化与归一化一段可复用的预处理代码下面这段代码把负向指标和适度指标统一转成正向再做向量归一化。这是Topsis和灰色关联都能用的基础层。import numpy as np import pandas as pd # 假设 df 是原始数据行系统列指标 # direction: 1 正向, -1 负向, 0 适度(需给最优值) direction { 响应时间: -1, 误报率: -1, 漏报率: -1, 探测灵敏度: 1, 覆盖半径: 0, 无故障时间: 1, 维护成本: -1 } best_value {覆盖半径: 50} # 适度指标的最优值按题目量纲填 def positive_transform(df, direction, best_value): df df.copy() for col, d in direction.items(): if d -1: df[col] df[col].max() - df[col] # 负向转正向 elif d 0: b best_value[col] df[col] 1 - (df[col] - b).abs() / (df[col] - b).abs().max() return df def vector_normalize(df): return df / np.sqrt((df ** 2).sum(axis0)) df_pos positive_transform(df, direction, best_value) df_norm vector_normalize(df_pos)逻辑说明负向指标用「最大值减当前值」做线性反转保证单调性不变适度指标用「1 减去偏离最优值的相对距离」偏离越大得分越低。向量归一化让每列平方和为1消除量纲。参数说明best_value必须按题目给出的合理范围填如果题目没给就用该指标均值或中位数并在论文里说明假设。这一步做完df_norm就是后续所有模型的统一输入。2.3 熵权法定权重信息量越大权重越高但别迷信它熵权Topsis里的「熵权」不是随便加的它根据指标变异程度定权某指标在各系统间差异越大信息熵越小权重越高。计算步骤是先算第j个指标下第i个系统的比重 p_ij再算熵 e_j最后算权重 w_j。代码很短但有两个坑一是归一化后如果有0值log会报错要加极小量二是熵权完全由数据驱动如果某个重要指标恰好各系统差异小权重会被压得很低这时要结合AHP或专家打分做组合赋权。def entropy_weight(df_norm): p df_norm / df_norm.sum(axis0) p p.replace(0, 1e-12) # 避免 log(0) n df_norm.shape[0] e -(p * np.log(p)).sum(axis0) / np.log(n) d 1 - e w d / d.sum() return w w entropy_weight(df_norm) print(w)参数说明n是系统数量log用自然对数。1e-12是防零极小量不要用0.0001这种会改变熵值的数。如果题目要求组合权重常见做法是w_final 0.5 * w_entropy 0.5 * w_ahp但AHP判断矩阵要自己构造并通过一致性检验CR0.1。3. 熵权Topsis和灰色关联度怎么落地两套排序互相验证3.1 熵权Topsis正负理想解与贴近度计算Topsis的思路是构造一个正理想解每个指标取最优和一个负理想解每个指标取最差算每个系统到两者的距离贴近度越大越好。加权是在归一化数据上乘权重。代码里注意距离用欧氏距离贴近度公式是C D_minus / (D_plus D_minus)。def topsis(df_norm, w): z df_norm * w # 加权归一化矩阵 z_plus z.max(axis0) z_minus z.min(axis0) d_plus np.sqrt(((z - z_plus) ** 2).sum(axis1)) d_minus np.sqrt(((z - z_minus) ** 2).sum(axis1)) c d_minus / (d_plus d_minus) return pd.Series(c, indexdf_norm.index).sort_values(ascendingFalse) rank_topsis topsis(df_norm, w) print(rank_topsis)逻辑说明z_plus和z_minus是加权后的理想解d_plus越小说明越接近最优。贴近度c在0到1之间越接近1越好。参数说明权重w来自熵权或组合权重必须和df_norm列顺序一致否则加权错位。如果某系统贴近度非常接近说明指标区分度不够要考虑增加指标或换模型。3.2 灰色关联度模型分辨系数取0.5不是铁律灰色关联度通过比较各系统与参考序列的几何形状相似度来排序。参考序列一般取每个指标的最优值。分辨系数 ρ 通常取0.5但它影响关联度数值大小不改变排序多数情况下所以论文里写0.5即可但要知道它不是唯一选择。计算步骤初值化或均值化、求差序列、算关联系数、求关联度。def grey_relation(df_pos, rho0.5): ref df_pos.max(axis0) # 参考序列取最优 diff (df_pos - ref).abs() delta_min diff.min().min() delta_max diff.max().max() xi (delta_min rho * delta_max) / (diff rho * delta_max) r xi.mean(axis1) return pd.Series(r, indexdf_pos.index).sort_values(ascendingFalse) rank_grey grey_relation(df_pos) print(rank_grey)逻辑说明diff是各系统与参考序列的绝对差xi是关联系数r是各指标关联系数的均值。参数说明rho取0.5是常规取值越小分辨力越大。注意这里用的是正向化后的数据df_pos不是归一化后的因为灰色关联对量纲不敏感但要求同向。如果Topsis和灰色关联排序差异大说明指标间冲突强要在论文里讨论。3.3 两套排序结果对比一致性检验与差异解释把rank_topsis和rank_grey并排放算Spearman秩相关系数。如果系数大于0.8说明两模型结论一致可信度高如果低于0.6就要找原因是某个指标权重过大还是归一化方式不同还是数据本身有异常值。这一步不是走过场而是整篇论文的论证核心。from scipy.stats import spearmanr common rank_topsis.index.intersection(rank_grey.index) rho, pval spearmanr(rank_topsis[common].rank(), rank_grey[common].rank()) print(fSpearman: {rho:.3f}, p{pval:.3f})参数说明rank()把贴近度和关联度转成排名再算相关避免数值尺度影响。p值小于0.05说明相关显著。如果差异大常见做法是引入模糊综合评价做第三套验证或者用组合评价法如Copeland法融合排序。4. 模糊综合评价和智能研判模型什么时候该上怎么上4.1 模糊综合评价隶属度函数与评价矩阵构造模糊综合评价适合指标带有「模糊边界」的场景比如「系统可靠性高/中/低」这种等级划分。火灾报警系统问题里如果题目要求给出安全等级模糊综合评价比Topsis更贴切。步骤是确定因素集和评语集构造隶属度函数常用梯形或三角形得到评价矩阵R再和权重向量合成。import numpy as np def triangular_membership(x, a, b, c): # a,b,c 为三角形参数b为峰值 if x a or x c: return 0.0 elif x b: return (x - a) / (b - a) else: return (c - x) / (c - b) # 示例对某指标构造三个等级的隶属度 levels [低, 中, 高] params {低: (0, 0, 0.5), 中: (0.3, 0.5, 0.7), 高: (0.5, 1, 1)} x 0.6 membership {lv: triangular_membership(x, *params[lv]) for lv in levels} print(membership)逻辑说明triangular_membership返回某数值属于某等级的隶属度三个等级参数要覆盖指标范围。参数说明a,b,c根据指标实际分布定常用等分或专家经验。得到每个系统的评价矩阵后用B W · R合成再按最大隶属度原则定级。注意权重W要和因素集顺序一致。4.2 智能研判模型规则引擎还是机器学习看数据量「智能研判模型」这个词听起来高级落到这道题里常见做法有两种一是基于规则的专家系统把指标阈值写成if-else或决策树二是如果有历史标签用随机森林、SVM做分类。但五一赛C题第一问通常没有大量标签所以规则引擎更现实。我一般会先用Topsis和灰色关联给出排序再把排序靠后的系统用规则标记为「高风险」形成研判结论。def rule_based_judge(row, thresholds): # thresholds: 指标名 - (下限, 上限) alerts [] for col, (low, high) in thresholds.items(): if row[col] low or row[col] high: alerts.append(col) return 高风险 if len(alerts) 2 else 正常 thresholds {响应时间: (0, 30), 误报率: (0, 0.05), 无故障时间: (500, 10000)} df[研判] df.apply(lambda r: rule_based_judge(r, thresholds), axis1) print(df[[研判]])逻辑说明规则引擎可解释性强适合没有标签的场景。参数说明thresholds要按题目给的规范或行业标准填不能拍脑袋。如果题目提供了历史故障记录可以把规则输出作为特征再训一个逻辑回归做二次研判但要注意过拟合。5. 避坑与排查火灾报警系统评价里最容易翻车的5个点5.1 指标方向搞反排名整体倒挂现象Topsis算出来最好的系统恰好是响应时间最长、误报率最高的那个。原因负向指标没做正向化或者正向化时用了min - x导致单调性反转。解决逐列检查direction字典正向化后打印每列与原始列的相关系数负向指标应该接近-1。5.2 归一化方式混用两模型结果无法对比现象Topsis和灰色关联排序差异巨大Spearman只有0.3。原因Topsis用了向量归一化灰色关联用了初值化数据尺度不同。解决统一在正向化后做同一套归一化或者明确说明灰色关联用原始正向化数据、Topsis用归一化数据并在论文里解释差异来源。5.3 熵权出现零权重某指标被完全忽略现象某个重要指标权重接近0排序里完全不起作用。原因该指标各系统数值差异极小熵值接近1差异系数接近0。解决检查该指标数据是否录入错误如果确实差异小改用组合赋权加入AHP主观权重避免数据驱动导致的偏颇。5.4 分辨系数ρ取值随意关联度数值不可复现现象别人复现你的灰色关联结果和你不一样。原因ρ没写清楚或者差序列计算时参考序列选错选了均值而不是最优值。解决论文里明确写ρ0.5参考序列取正向化后的最大值并给出差序列的计算公式。5.5 模糊综合评价隶属度函数参数拍脑袋现象评价等级结果和Topsis排序完全矛盾。原因隶属度函数的a,b,c参数没有依据导致评价矩阵失真。解决用数据的分位数如25%、50%、75%定参数或者引用行业标准阈值并在论文里做敏感性分析。6. 让评价结果站得住组合排序与敏感性验证的一个具体技巧最后一章讲一个我常用的收尾技巧组合排序与敏感性验证。前面你有了Topsis贴近度、灰色关联度、模糊综合评价向量甚至规则研判标签但这些结果可能不一致。直接选一个交差评审一问就露馅。我的习惯是做一个「Borda组合排序」把每个模型的名次相加总名次越小越优。这样既保留了多模型信息又给出一个综合结论。def borda_combine(rank_dict): # rank_dict: 模型名 - Series(索引系统, 值排名) df_rank pd.DataFrame(rank_dict) borda df_rank.sum(axis1).sort_values() return borda rank_dict { Topsis: rank_topsis.rank(), Grey: rank_grey.rank(), Fuzzy: pd.Series(fuzzy_scores, indexdf.index).rank() } final_rank borda_combine(rank_dict) print(final_rank)逻辑说明rank()把各模型输出转成1到n的名次sum(axis1)得到Borda分越小越好。参数说明如果某模型缺失某个系统的结果要先对齐索引用reindex补。Borda法假设各模型同等重要如果你更信Topsis可以加权求和。接下来做敏感性验证把熵权权重上下扰动10%重跑Topsis看最终排序是否稳定。如果前3名不变说明结论稳健如果剧烈变动说明权重敏感要在论文里说明局限。这个动作花不了多少时间但能让你的方案从「跑通」变成「可信」。def sensitivity(df_norm, w, perturb0.1, n20): base topsis(df_norm, w).index.tolist() changes 0 for _ in range(n): w_new w * (1 np.random.uniform(-perturb, perturb, len(w))) w_new w_new / w_new.sum() new_rank topsis(df_norm, w_new).index.tolist() if new_rank[:3] ! base[:3]: changes 1 return changes / n print(f前3名变化比例: {sensitivity(df_norm, w):.2f})参数说明perturb0.1表示权重扰动±10%n20是模拟次数。变化比例低于0.2算稳定。这个技巧我每次做多指标评价都会用它不能帮你拿满分但能帮你挡住「权重怎么来的」这类追问。希望帮到你。本文还有配套的精品资源点击获取
返回列表