
目录一、 引言为什么需要 CRITIC 法二、 CRITIC 模型三、 C 语言实战高可靠性的工程化实现3.1 核心数据结构3.2 核心算法实现节选3.3 工程化输出四、 MATLAB 实战极简矩阵运算与对比分析4.1 核心算法流4.2 CRITIC 与 EWM 的直观对比五、 工程经验总结与避坑指南六、 结语七、勘误及更新说明附录完整代码获取一、 引言为什么需要 CRITIC 法在上一篇 《装备效能评估算法实战基于 C 语言与 MATLAB 的熵权法EWM模型实现》 中我们介绍了完全基于数据离散程度的熵权法EWM。然而熵权法存在一个天然的局限性它仅考虑了单个指标的离散程度完全忽略了指标之间的相关性。在实际的装备效能评估中很多指标是存在信息冗余的。例如“探测距离”和“跟踪距离”、“反应时间”和“准备时间”它们之间往往存在较强的正相关。如果只用熵权法这些冗余指标会被重复赋权导致评估结果失真。CRITIC 法Criteria Importance Through Intercriteria Correlation 应运而生。它不仅考虑了指标内数据的对比强度标准差还引入了指标间的冲突性相关系数能够自动剔除冗余指标使得赋权结果更加科学。二、 CRITIC 模型CRITIC 法的核心思想是某个指标与其他指标冲突性越强、自身数据对比强度越大则该指标包含的信息量越多权重越高。三、 C 语言实战高可靠性的工程化实现在底层仿真系统中我们需要关注矩阵运算的边界安全、除零保护以及模块化封装。3.1 核心数据结构我们将所有中间变量标准差、相关系数矩阵、冲突性、信息量封装在结构体中便于调试和结果落盘。typedef struct { int n, m; double raw_data[MAX_N][MAX_M]; double norm_data[MAX_N][MAX_M]; double std_dev[MAX_M]; // 对比强度 double corr_matrix[MAX_M][MAX_M]; // 相关系数矩阵 double conflict[MAX_M]; // 冲突性 double info_amount[MAX_M]; // 信息承载量 C double weights[MAX_M]; // 最终权重 double scores[MAX_N]; // 综合得分 } CriticModel;3.2 核心算法实现节选1. 相关系数矩阵的计算与防溢出手动实现 Pearson 相关系数计算并加入EPS6防止标准差为 0 时的除零异常。// 计算协方差与相关系数 double covariance 0.0; for (int i 0; i n; i) { covariance (norm_data[i][j] - mean_j) * (norm_data[i][k] - mean_k); } covariance / (n - 1); double denom std_dev[j] * std_dev[k]; if (denom EPS6) { corr_matrix[j][k] 0.0; // 防除零 } else { corr_matrix[j][k] covariance / denom; }2. 冲突性与信息量计算// 冲突性 F_j Σ(1 - r_jk) model-conflict[j] 0.0; for (int k 0; k m; k) { model-conflict[j] (1.0 - model-corr_matrix[j][k]); } // 信息量 C_j S_j * F_j model-info_amount[j] model-std_dev[j] * model-conflict[j];3.3 工程化输出C 语言版本支持将完整的原始数据、标准化矩阵、相关系数矩阵、最终排名输出到.txt文件中非常适合作为后台服务的评估引擎。四、 MATLAB 实战极简矩阵运算与对比分析MATLAB 擅长矩阵运算可以用极少的代码完成复杂的统计计算。以下代码兼容 R2016a 版本。4.1 核心算法流%% 1. 标准化正向/负向指标处理 Z zeros(n, m); for j 1:m if indicatorType(j) 1 Z(:, j) (X(:, j) - min(X(:, j))) / range; % 正向 else Z(:, j) (max(X(:, j)) - X(:, j)) / range; % 负向 end end %% 2. 对比强度标准差 S std(Z, 0, 1); %% 3. 冲突性基于相关系数矩阵 R corrcoef(Z); % 计算 Pearson 相关系数矩阵 F sum(1 - R, 2); % 按行求和计算冲突性 %% 4. 信息量与权重 C S .* F; W C / sum(C); %% 5. 综合得分与排名 Score 100 * (Z * W); [~, rankIdx] sort(Score, descend);4.2 CRITIC 与 EWM 的直观对比在 MATLAB 版代码中我们可以很方便地将 CRITIC 权重与上一篇的 EWM 权重进行同屏对比fprintf(指标%-2d %15.4f %15.4f\n, j, W(j), entropy_weights(j));结论CRITIC 由于考虑了相关性通常会给高度相关的冗余指标降低权重使得权重分布更加均衡、合理。五、 工程经验总结与避坑指南样本量问题CRITIC 需要计算相关系数矩阵对样本量有一定要求。一般建议方案数 $n \ge 5$否则相关性估计会极不稳定甚至失真。与 EWM 的选型建议如果指标之间相互独立、无冗余用EWM 即可计算量小且直观。如果指标存在多重共线性如装备评估中常见的火力、机动、防护指标互相关联必须用CRITIC 或后续的主成分分析PCA。标准化范围不同于 EWM 需要映射到[0.002, 0.996]以防止 $\log(0)$CRITIC 不涉及对数运算标准化到标准的[0, 1]区间即可。六、 结语CRITIC 赋权法弥补了熵权法忽略指标间相关性的缺陷是装备效能评估中更为严谨的客观赋权方法。本文提供的 C 语言与 MATLAB 双版本代码已在实际项目中得到验证。后续我将继续更新TOPSIS 法结合 CRITIC 赋权进行最终方案排序欢迎关注交流。七、勘误及更新说明本文如有疏漏或表述不当之处欢迎各位读者在评论区指正博主会持续关注反馈并及时修正优化力求内容准确可靠。感谢大家的监督与陪伴。附录完整代码获取C 语言版本[https://download.csdn.net/download/qq_41917295/93409997]MATLAB 版本[https://download.csdn.net/download/qq_41917295/93409997]【专栏目录】效能评估系列目录