一、AHP 是什么层次分析法 AHP是一种常用的多准则决策方法适合处理这类问题有多个备选方案同时评价标准不止一个需要综合判断哪个方案最优。例如决策问题评价指标选择供应商价格、质量、交付能力、服务选择旅游城市费用、景色、交通、安全选择投资项目收益、风险、周期、政策支持选择员工晋升对象业绩、能力、潜力、协作AHP 的核心思想是将复杂决策问题分解成多个层次通过两两比较得到各因素权重最后计算各方案的综合得分。二、AHP 的层次结构AHP 通常包含三层目标层最终决策目标 准则层评价指标或判断标准 方案层待选择的方案例如选择最佳供应商。选择最佳供应商 / / \ \ 价格 质量 交付 服务 / | \ / | \ / | \ / | \ A B C A B C A B C A B C其中目标层选择最佳供应商 准则层 C1价格 C2质量 C3交付能力 C4服务 方案层 A供应商A B供应商B C供应商C三、AHP 的基本步骤AHP 的完整流程如下建立层次结构 ↓ 构造判断矩阵 ↓ 计算权重 ↓ 一致性检验 ↓ 计算方案综合得分 ↓ 得到最终排序四、判断矩阵AHP 不是直接给出权重而是进行两两比较。例如比较价格 和 质量 哪个更重要 质量 和 服务 哪个更重要 交付 和 服务 哪个更重要Saaty 提出了 1–9 标度法。标度含义1两个因素同等重要3一个因素比另一个稍微重要5一个因素比另一个明显重要7一个因素比另一个强烈重要9一个因素比另一个极端重要2、4、6、8介于相邻判断之间倒数如果 i 相对于 j 为 3则 j 相对于 i 为 1/3判断矩阵形式为[A \begin{bmatrix}1 a_{12} a_{13} \a_{21} 1 a_{23} \a_{31} a_{32} 1\end{bmatrix}]其中[a_{ij} \frac{1}{a_{ji}}]这说明判断矩阵必须满足互反性。五、权重计算方法常见权重计算方法有特征值法几何平均法归一化列平均法最常用的是特征值法。1. 特征值法设判断矩阵为[A]求最大特征值对应的特征向量[Aw \lambda_{\max} w]其中( A )判断矩阵( w )权重向量( \lambda_{\max} )最大特征值将特征向量归一化[w_i \frac{w_i}{\sum_{i1}^{n} w_i}]即可得到权重。2. 几何平均法对判断矩阵每一行求几何平均[g_i \sqrt[n]{\prod_{j1}^{n} a_{ij}}]然后归一化[w_i \frac{g_i}{\sum_{i1}^{n} g_i}]几何平均法计算简单适合快速实现。六、一致性检验由于判断矩阵来自主观判断可能会出现不一致。例如A 比 B 重要 3 倍 B 比 C 重要 3 倍 但 A 只比 C 重要 2 倍这就存在逻辑矛盾。因此 AHP 需要进行一致性检验。1. 一致性指标 CI[CI \frac{\lambda_{\max} - n}{n - 1}]其中( \lambda_{\max} )判断矩阵最大特征值( n )判断矩阵阶数2. 随机一致性指标 RI常用 RI 表如下nRI10.0020.0030.5840.9051.1261.2471.3281.4191.45101.493. 一致性比例 CR[CR \frac{CI}{RI}]判断标准CR 0.10一致性可以接受 CR 0.10一致性较差需要调整判断矩阵七、案例选择最佳供应商假设有三个供应商供应商A 供应商B 供应商C评价准则有四个C1价格 C2质量 C3交付能力 C4服务准则层判断矩阵如下[A \begin{bmatrix}1 1/3 3 4 \3 1 5 7 \1/3 1/5 1 2 \1/4 1/7 1/2 1\end{bmatrix}]含义示例质量比价格重要 3 倍 价格比交付能力重要 3 倍 价格比服务重要 4 倍 质量比服务重要 7 倍八、MATLAB 实现单个判断矩阵权重计算下面先给出一个基础函数用于计算权重最大特征值CICR一致性是否通过function [weights, lambda_max, CI, CR] ahp_weight(matrix) % AHP_WEIGHT 使用特征值法计算 AHP 权重并进行一致性检验 % % 输入 % matrix: 判断矩阵 % % 输出 % weights: 权重向量 % lambda_max: 最大特征值 % CI: 一致性指标 % CR: 一致性比例 RI_table [0, 0, 0.58, 0.90, 1.12, 1.24, 1.32, 1.41, 1.45, 1.49]; [n, m] size(matrix); if n ~ m error(判断矩阵必须是方阵); end if n 10 error(当前 RI 表只支持 1 到 10 阶矩阵); end % 检查互反性 for i 1:n for j 1:n if abs(matrix(i, j) * matrix(j, i) - 1) 1e-6 error(判断矩阵不满足互反性); end end end % 计算特征值和特征向量 [V, D] eig(matrix); eigenvalues diag(D); % 找到最大特征值 [lambda_max, index] max(real(eigenvalues)); % 最大特征值对应的特征向量 weight_vector real(V(:, index)); % 特征向量方向可能为负取绝对值 weight_vector abs(weight_vector); % 归一化 weights weight_vector / sum(weight_vector); % 一致性指标 CI if n 1 CI 0; else CI (lambda_max - n) / (n - 1); end % 随机一致性指标 RI RI RI_table(n); % 一致性比例 CR if RI 0 CR 0; else CR CI / RI; end end九、MATLAB 示例准则层权重计算clc; clear; criteria_matrix [ 1, 1/3, 3, 4; 3, 1, 5, 7; 1/3, 1/5, 1, 2; 1/4, 1/7, 1/2, 1 ]; [weights, lambda_max, CI, CR] ahp_weight(criteria_matrix); disp(准则层权重); disp(weights); disp([最大特征值 lambda_max , num2str(lambda_max)]); disp([一致性指标 CI , num2str(CI)]); disp([一致性比例 CR , num2str(CR)]); if CR 0.1 disp(一致性检验通过); else disp(一致性检验未通过需要调整判断矩阵); end可能输出准则层权重 0.2534 0.5738 0.1077 0.0651 最大特征值 lambda_max 4.0583 一致性指标 CI 0.0194 一致性比例 CR 0.0216 一致性检验通过对应解释准则权重价格0.2534质量0.5738交付能力0.1077服务0.0651说明在该判断矩阵下质量最重要其次是价格然后是交付能力最后是服务。十、完整 AHP 决策 MATLAB 代码下面给出一个完整案例包括准则层权重计算各准则下方案层权重计算一致性检验最终综合得分计算输出最佳方案可以将下面代码保存为main_ahp_demo.mclc; clear; %% % AHP 完整案例选择最佳供应商 % criteria_names {价格, 质量, 交付, 服务}; supplier_names {供应商A, 供应商B, 供应商C}; %% 1. 准则层判断矩阵 criteria_matrix [ 1, 1/3, 3, 4; 3, 1, 5, 7; 1/3, 1/5, 1, 2; 1/4, 1/7, 1/2, 1 ]; [criteria_weight, criteria_CR] check_consistency(criteria_matrix, 准则层判断矩阵); %% 2. 方案层判断矩阵 % 价格准则下的方案判断矩阵 % 假设价格方面A 最优其次 B最后 C price_matrix [ 1, 3, 5; 1/3, 1, 3; 1/5, 1/3, 1 ]; % 质量准则下的方案判断矩阵 % 假设质量方面B 最优其次 C最后 A quality_matrix [ 1, 1/5, 1/3; 5, 1, 3; 3, 1/3, 1 ]; % 交付能力准则下的方案判断矩阵 % 假设交付方面C 最优其次 B最后 A delivery_matrix [ 1, 1/3, 1/5; 3, 1, 1/2; 5, 2, 1 ]; % 服务准则下的方案判断矩阵 % 假设服务方面B 最优其次 A最后 C service_matrix [ 1, 1/2, 3; 2, 1, 5; 1/3, 1/5, 1 ]; scheme_matrices { price_matrix; quality_matrix; delivery_matrix; service_matrix }; %% 3. 计算各准则下方案权重 scheme_weights zeros(length(criteria_names), length(supplier_names)); for i 1:length(criteria_names) matrix scheme_matrices{i}; name [criteria_names{i}, 准则下的方案判断矩阵]; [weight, CR] check_consistency(matrix, name); scheme_weights(i, :) weight; end disp( ); disp(各准则下方案权重矩阵); disp(array2table(scheme_weights, ... VariableNames, supplier_names, ... RowNames, criteria_names)); %% 4. 计算最终综合得分 % criteria_weight 是 4 x 1 % scheme_weights 是 4 x 3 % final_score 是 1 x 3 final_score criteria_weight * scheme_weights; disp( ); disp(最终综合得分); for i 1:length(supplier_names) fprintf(%s: %.4f\n, supplier_names{i}, final_score(i)); end %% 5. 输出最优方案 [best_score, best_index] max(final_score); fprintf(\n最优方案%s综合得分为 %.4f\n, supplier_names{best_index}, best_score); %% % 局部函数 1一致性检验与权重计算 % function [weights, CR] check_consistency(matrix, matrix_name) [weights, lambda_max, CI, CR] ahp_weight(matrix); fprintf(\n%s\n, matrix_name); fprintf(----------------------------------------\n); disp(权重); disp(round(weights, 4)); fprintf(lambda_max %.4f\n, lambda_max); fprintf(CI %.4f\n, CI); fprintf(CR %.4f\n, CR); if CR 0.1 disp(一致性检验通过); else disp(一致性检验未通过需要调整判断矩阵); end end %% % 局部函数 2AHP 权重计算 % function [weights, lambda_max, CI, CR] ahp_weight(matrix) % AHP_WEIGHT 使用特征值法计算 AHP 权重并进行一致性检验 RI_table [0, 0, 0.58, 0.90, 1.12, 1.24, 1.32, 1.41, 1.45, 1.49]; [n, m] size(matrix); if n ~ m error(判断矩阵必须是方阵); end if n 10 error(当前 RI 表只支持 1 到 10 阶矩阵); end % 判断矩阵元素必须为正 if any(matrix(:) 0) error(判断矩阵中的元素必须全部为正数); end % 检查互反性 for i 1:n for j 1:n if abs(matrix(i, j) * matrix(j, i) - 1) 1e-6 error(判断矩阵不满足互反性); end end end % 计算特征值和特征向量 [V, D] eig(matrix); eigenvalues diag(D); % 找到最大特征值 [lambda_max, index] max(real(eigenvalues)); % 最大特征值对应的特征向量 weight_vector real(V(:, index)); % 特征向量方向可能为负取绝对值 weight_vector abs(weight_vector); % 权重归一化 weights weight_vector / sum(weight_vector); % 一致性指标 CI if n 1 CI 0; else CI (lambda_max - n) / (n - 1); end % 随机一致性指标 RI RI RI_table(n); % 一致性比例 CR if RI 0 CR 0; else CR CI / RI; end end十一、完整代码运行结果示例运行后可能得到类似结果准则层判断矩阵 ---------------------------------------- 权重 0.2534 0.5738 0.1077 0.0651 lambda_max 4.0583 CI 0.0194 CR 0.0216 一致性检验通过各准则下方案权重大致为准则供应商A供应商B供应商C价格0.63700.25830.1047质量0.10470.63700.2583交付0.10950.30900.5816服务0.30900.58160.1095最终综合得分大致为供应商A: 0.2534 供应商B: 0.5021 供应商C: 0.2445 最优方案供应商B综合得分为 0.5021说明在当前判断矩阵下供应商B 综合表现最好。十二、几何平均法 MATLAB 实现除了特征值法还可以用几何平均法计算权重。几何平均法代码如下function weights ahp_weight_geometric(matrix) % AHP_WEIGHT_GEOMETRIC 使用几何平均法计算 AHP 权重 [n, m] size(matrix); if n ~ m error(判断矩阵必须是方阵); end if any(matrix(:) 0) error(判断矩阵中的元素必须全部为正数); end % 每一行求几何平均 geometric_mean zeros(n, 1); for i 1:n geometric_mean(i) prod(matrix(i, :))^(1 / n); end % 归一化 weights geometric_mean / sum(geometric_mean); end使用示例clc; clear; criteria_matrix [ 1, 1/3, 3, 4; 3, 1, 5, 7; 1/3, 1/5, 1, 2; 1/4, 1/7, 1/2, 1 ]; weights ahp_weight_geometric(criteria_matrix); disp(几何平均法计算得到的权重); disp(weights);十三、AHP 类封装 MATLAB 版本如果想在项目中复用可以写成 MATLAB 类。保存为AHP.m代码如下classdef AHP properties Matrix Weights LambdaMax CI CR end methods function obj AHP(matrix) obj.Matrix matrix; obj obj.validate_matrix(); end function obj validate_matrix(obj) [n, m] size(obj.Matrix); if n ~ m error(判断矩阵必须是方阵); end if any(obj.Matrix(:) 0) error(判断矩阵中的元素必须全部为正数); end for i 1:n for j 1:n if abs(obj.Matrix(i, j) * obj.Matrix(j, i) - 1) 1e-6 error(判断矩阵不满足互反性); end end end end function obj calculate(obj) RI_table [0, 0, 0.58, 0.90, 1.12, 1.24, 1.32, 1.41, 1.45, 1.49]; [n, ~] size(obj.Matrix); if n 10 error(当前 RI 表只支持 1 到 10 阶矩阵); end [V, D] eig(obj.Matrix); eigenvalues diag(D); [obj.LambdaMax, index] max(real(eigenvalues)); weight_vector real(V(:, index)); weight_vector abs(weight_vector); obj.Weights weight_vector / sum(weight_vector); if n 1 obj.CI 0; else obj.CI (obj.LambdaMax - n) / (n - 1); end RI RI_table(n); if RI 0 obj.CR 0; else obj.CR obj.CI / RI; end end function show(obj) disp(权重); disp(round(obj.Weights, 4)); fprintf(lambda_max %.4f\n, obj.LambdaMax); fprintf(CI %.4f\n, obj.CI); fprintf(CR %.4f\n, obj.CR); if obj.CR 0.1 disp(一致性检验通过); else disp(一致性检验未通过); end end end end调用方式clc; clear; matrix [ 1, 1/3, 3, 4; 3, 1, 5, 7; 1/3, 1/5, 1, 2; 1/4, 1/7, 1/2, 1 ]; ahp AHP(matrix); ahp ahp.calculate(); ahp.show();十四、AHP 的优点优点说明结构清晰能把复杂问题分解成目标层、准则层、方案层可解释性强每个权重来自两两比较过程透明适合定性与定量结合如服务质量、发展潜力等难以直接量化的指标有一致性检验能判断专家打分是否存在明显矛盾计算过程简单MATLAB、Python、Excel 都容易实现十五、AHP 的缺点缺点说明主观性较强判断矩阵依赖专家经验指标太多时工作量大n 个指标需要比较 ( n(n-1)/2 ) 次一致性可能不容易通过判断矩阵可能需要反复调整不适合方案特别多的情况方案层判断矩阵数量会快速增加对专家判断质量要求较高专家判断不合理会影响最终结果十六、AHP 使用建议实际使用 AHP 时建议注意以下几点建议说明每层指标不要过多一般 3–9 个比较合适判断矩阵要请熟悉业务的人填写保证判断质量必须进行一致性检验通常要求 CR 0.1对未通过一致性检验的矩阵进行调整找出明显矛盾的比较关系可与其他方法结合如 AHP-TOPSIS、AHP-熵权法、AHP-模糊综合评价十七、AHP 与其他方法的关系方法主要作用特点AHP计算主观权重、综合评价强调专家判断熵权法计算客观权重强调数据差异性TOPSIS方案排序根据理想解和负理想解排序模糊综合评价处理模糊评价问题适合定性模糊指标灰色关联分析衡量方案与理想方案的接近程度适合小样本、不完全信息常见组合方式AHP 计算指标权重 TOPSIS 进行方案排序或者AHP 主观权重 熵权法客观权重十八、总结AHP 的核心是用两两比较构造判断矩阵 用特征值法或几何平均法计算权重 用 CR 判断一致性是否可接受 最后计算各方案综合得分并排序核心公式[Aw \lambda_{\max}w][CI \frac{\lambda_{\max} - n}{n - 1}][CR \frac{CI}{RI}]一般判断标准CR 0.1判断矩阵一致性可以接受 CR 0.1需要调整判断矩阵在实际建模中AHP 特别适合指标数量适中 需要专家判断 定性指标较多 需要清晰解释决策过程例如供应商选择、项目评估、绩效评价、风险评估、选址决策、投资决策等问题。
层次分析法(AHP) 简介
一、AHP 是什么层次分析法 AHP是一种常用的多准则决策方法适合处理这类问题有多个备选方案同时评价标准不止一个需要综合判断哪个方案最优。例如决策问题评价指标选择供应商价格、质量、交付能力、服务选择旅游城市费用、景色、交通、安全选择投资项目收益、风险、周期、政策支持选择员工晋升对象业绩、能力、潜力、协作AHP 的核心思想是将复杂决策问题分解成多个层次通过两两比较得到各因素权重最后计算各方案的综合得分。二、AHP 的层次结构AHP 通常包含三层目标层最终决策目标 准则层评价指标或判断标准 方案层待选择的方案例如选择最佳供应商。选择最佳供应商 / / \ \ 价格 质量 交付 服务 / | \ / | \ / | \ / | \ A B C A B C A B C A B C其中目标层选择最佳供应商 准则层 C1价格 C2质量 C3交付能力 C4服务 方案层 A供应商A B供应商B C供应商C三、AHP 的基本步骤AHP 的完整流程如下建立层次结构 ↓ 构造判断矩阵 ↓ 计算权重 ↓ 一致性检验 ↓ 计算方案综合得分 ↓ 得到最终排序四、判断矩阵AHP 不是直接给出权重而是进行两两比较。例如比较价格 和 质量 哪个更重要 质量 和 服务 哪个更重要 交付 和 服务 哪个更重要Saaty 提出了 1–9 标度法。标度含义1两个因素同等重要3一个因素比另一个稍微重要5一个因素比另一个明显重要7一个因素比另一个强烈重要9一个因素比另一个极端重要2、4、6、8介于相邻判断之间倒数如果 i 相对于 j 为 3则 j 相对于 i 为 1/3判断矩阵形式为[A \begin{bmatrix}1 a_{12} a_{13} \a_{21} 1 a_{23} \a_{31} a_{32} 1\end{bmatrix}]其中[a_{ij} \frac{1}{a_{ji}}]这说明判断矩阵必须满足互反性。五、权重计算方法常见权重计算方法有特征值法几何平均法归一化列平均法最常用的是特征值法。1. 特征值法设判断矩阵为[A]求最大特征值对应的特征向量[Aw \lambda_{\max} w]其中( A )判断矩阵( w )权重向量( \lambda_{\max} )最大特征值将特征向量归一化[w_i \frac{w_i}{\sum_{i1}^{n} w_i}]即可得到权重。2. 几何平均法对判断矩阵每一行求几何平均[g_i \sqrt[n]{\prod_{j1}^{n} a_{ij}}]然后归一化[w_i \frac{g_i}{\sum_{i1}^{n} g_i}]几何平均法计算简单适合快速实现。六、一致性检验由于判断矩阵来自主观判断可能会出现不一致。例如A 比 B 重要 3 倍 B 比 C 重要 3 倍 但 A 只比 C 重要 2 倍这就存在逻辑矛盾。因此 AHP 需要进行一致性检验。1. 一致性指标 CI[CI \frac{\lambda_{\max} - n}{n - 1}]其中( \lambda_{\max} )判断矩阵最大特征值( n )判断矩阵阶数2. 随机一致性指标 RI常用 RI 表如下nRI10.0020.0030.5840.9051.1261.2471.3281.4191.45101.493. 一致性比例 CR[CR \frac{CI}{RI}]判断标准CR 0.10一致性可以接受 CR 0.10一致性较差需要调整判断矩阵七、案例选择最佳供应商假设有三个供应商供应商A 供应商B 供应商C评价准则有四个C1价格 C2质量 C3交付能力 C4服务准则层判断矩阵如下[A \begin{bmatrix}1 1/3 3 4 \3 1 5 7 \1/3 1/5 1 2 \1/4 1/7 1/2 1\end{bmatrix}]含义示例质量比价格重要 3 倍 价格比交付能力重要 3 倍 价格比服务重要 4 倍 质量比服务重要 7 倍八、MATLAB 实现单个判断矩阵权重计算下面先给出一个基础函数用于计算权重最大特征值CICR一致性是否通过function [weights, lambda_max, CI, CR] ahp_weight(matrix) % AHP_WEIGHT 使用特征值法计算 AHP 权重并进行一致性检验 % % 输入 % matrix: 判断矩阵 % % 输出 % weights: 权重向量 % lambda_max: 最大特征值 % CI: 一致性指标 % CR: 一致性比例 RI_table [0, 0, 0.58, 0.90, 1.12, 1.24, 1.32, 1.41, 1.45, 1.49]; [n, m] size(matrix); if n ~ m error(判断矩阵必须是方阵); end if n 10 error(当前 RI 表只支持 1 到 10 阶矩阵); end % 检查互反性 for i 1:n for j 1:n if abs(matrix(i, j) * matrix(j, i) - 1) 1e-6 error(判断矩阵不满足互反性); end end end % 计算特征值和特征向量 [V, D] eig(matrix); eigenvalues diag(D); % 找到最大特征值 [lambda_max, index] max(real(eigenvalues)); % 最大特征值对应的特征向量 weight_vector real(V(:, index)); % 特征向量方向可能为负取绝对值 weight_vector abs(weight_vector); % 归一化 weights weight_vector / sum(weight_vector); % 一致性指标 CI if n 1 CI 0; else CI (lambda_max - n) / (n - 1); end % 随机一致性指标 RI RI RI_table(n); % 一致性比例 CR if RI 0 CR 0; else CR CI / RI; end end九、MATLAB 示例准则层权重计算clc; clear; criteria_matrix [ 1, 1/3, 3, 4; 3, 1, 5, 7; 1/3, 1/5, 1, 2; 1/4, 1/7, 1/2, 1 ]; [weights, lambda_max, CI, CR] ahp_weight(criteria_matrix); disp(准则层权重); disp(weights); disp([最大特征值 lambda_max , num2str(lambda_max)]); disp([一致性指标 CI , num2str(CI)]); disp([一致性比例 CR , num2str(CR)]); if CR 0.1 disp(一致性检验通过); else disp(一致性检验未通过需要调整判断矩阵); end可能输出准则层权重 0.2534 0.5738 0.1077 0.0651 最大特征值 lambda_max 4.0583 一致性指标 CI 0.0194 一致性比例 CR 0.0216 一致性检验通过对应解释准则权重价格0.2534质量0.5738交付能力0.1077服务0.0651说明在该判断矩阵下质量最重要其次是价格然后是交付能力最后是服务。十、完整 AHP 决策 MATLAB 代码下面给出一个完整案例包括准则层权重计算各准则下方案层权重计算一致性检验最终综合得分计算输出最佳方案可以将下面代码保存为main_ahp_demo.mclc; clear; %% % AHP 完整案例选择最佳供应商 % criteria_names {价格, 质量, 交付, 服务}; supplier_names {供应商A, 供应商B, 供应商C}; %% 1. 准则层判断矩阵 criteria_matrix [ 1, 1/3, 3, 4; 3, 1, 5, 7; 1/3, 1/5, 1, 2; 1/4, 1/7, 1/2, 1 ]; [criteria_weight, criteria_CR] check_consistency(criteria_matrix, 准则层判断矩阵); %% 2. 方案层判断矩阵 % 价格准则下的方案判断矩阵 % 假设价格方面A 最优其次 B最后 C price_matrix [ 1, 3, 5; 1/3, 1, 3; 1/5, 1/3, 1 ]; % 质量准则下的方案判断矩阵 % 假设质量方面B 最优其次 C最后 A quality_matrix [ 1, 1/5, 1/3; 5, 1, 3; 3, 1/3, 1 ]; % 交付能力准则下的方案判断矩阵 % 假设交付方面C 最优其次 B最后 A delivery_matrix [ 1, 1/3, 1/5; 3, 1, 1/2; 5, 2, 1 ]; % 服务准则下的方案判断矩阵 % 假设服务方面B 最优其次 A最后 C service_matrix [ 1, 1/2, 3; 2, 1, 5; 1/3, 1/5, 1 ]; scheme_matrices { price_matrix; quality_matrix; delivery_matrix; service_matrix }; %% 3. 计算各准则下方案权重 scheme_weights zeros(length(criteria_names), length(supplier_names)); for i 1:length(criteria_names) matrix scheme_matrices{i}; name [criteria_names{i}, 准则下的方案判断矩阵]; [weight, CR] check_consistency(matrix, name); scheme_weights(i, :) weight; end disp( ); disp(各准则下方案权重矩阵); disp(array2table(scheme_weights, ... VariableNames, supplier_names, ... RowNames, criteria_names)); %% 4. 计算最终综合得分 % criteria_weight 是 4 x 1 % scheme_weights 是 4 x 3 % final_score 是 1 x 3 final_score criteria_weight * scheme_weights; disp( ); disp(最终综合得分); for i 1:length(supplier_names) fprintf(%s: %.4f\n, supplier_names{i}, final_score(i)); end %% 5. 输出最优方案 [best_score, best_index] max(final_score); fprintf(\n最优方案%s综合得分为 %.4f\n, supplier_names{best_index}, best_score); %% % 局部函数 1一致性检验与权重计算 % function [weights, CR] check_consistency(matrix, matrix_name) [weights, lambda_max, CI, CR] ahp_weight(matrix); fprintf(\n%s\n, matrix_name); fprintf(----------------------------------------\n); disp(权重); disp(round(weights, 4)); fprintf(lambda_max %.4f\n, lambda_max); fprintf(CI %.4f\n, CI); fprintf(CR %.4f\n, CR); if CR 0.1 disp(一致性检验通过); else disp(一致性检验未通过需要调整判断矩阵); end end %% % 局部函数 2AHP 权重计算 % function [weights, lambda_max, CI, CR] ahp_weight(matrix) % AHP_WEIGHT 使用特征值法计算 AHP 权重并进行一致性检验 RI_table [0, 0, 0.58, 0.90, 1.12, 1.24, 1.32, 1.41, 1.45, 1.49]; [n, m] size(matrix); if n ~ m error(判断矩阵必须是方阵); end if n 10 error(当前 RI 表只支持 1 到 10 阶矩阵); end % 判断矩阵元素必须为正 if any(matrix(:) 0) error(判断矩阵中的元素必须全部为正数); end % 检查互反性 for i 1:n for j 1:n if abs(matrix(i, j) * matrix(j, i) - 1) 1e-6 error(判断矩阵不满足互反性); end end end % 计算特征值和特征向量 [V, D] eig(matrix); eigenvalues diag(D); % 找到最大特征值 [lambda_max, index] max(real(eigenvalues)); % 最大特征值对应的特征向量 weight_vector real(V(:, index)); % 特征向量方向可能为负取绝对值 weight_vector abs(weight_vector); % 权重归一化 weights weight_vector / sum(weight_vector); % 一致性指标 CI if n 1 CI 0; else CI (lambda_max - n) / (n - 1); end % 随机一致性指标 RI RI RI_table(n); % 一致性比例 CR if RI 0 CR 0; else CR CI / RI; end end十一、完整代码运行结果示例运行后可能得到类似结果准则层判断矩阵 ---------------------------------------- 权重 0.2534 0.5738 0.1077 0.0651 lambda_max 4.0583 CI 0.0194 CR 0.0216 一致性检验通过各准则下方案权重大致为准则供应商A供应商B供应商C价格0.63700.25830.1047质量0.10470.63700.2583交付0.10950.30900.5816服务0.30900.58160.1095最终综合得分大致为供应商A: 0.2534 供应商B: 0.5021 供应商C: 0.2445 最优方案供应商B综合得分为 0.5021说明在当前判断矩阵下供应商B 综合表现最好。十二、几何平均法 MATLAB 实现除了特征值法还可以用几何平均法计算权重。几何平均法代码如下function weights ahp_weight_geometric(matrix) % AHP_WEIGHT_GEOMETRIC 使用几何平均法计算 AHP 权重 [n, m] size(matrix); if n ~ m error(判断矩阵必须是方阵); end if any(matrix(:) 0) error(判断矩阵中的元素必须全部为正数); end % 每一行求几何平均 geometric_mean zeros(n, 1); for i 1:n geometric_mean(i) prod(matrix(i, :))^(1 / n); end % 归一化 weights geometric_mean / sum(geometric_mean); end使用示例clc; clear; criteria_matrix [ 1, 1/3, 3, 4; 3, 1, 5, 7; 1/3, 1/5, 1, 2; 1/4, 1/7, 1/2, 1 ]; weights ahp_weight_geometric(criteria_matrix); disp(几何平均法计算得到的权重); disp(weights);十三、AHP 类封装 MATLAB 版本如果想在项目中复用可以写成 MATLAB 类。保存为AHP.m代码如下classdef AHP properties Matrix Weights LambdaMax CI CR end methods function obj AHP(matrix) obj.Matrix matrix; obj obj.validate_matrix(); end function obj validate_matrix(obj) [n, m] size(obj.Matrix); if n ~ m error(判断矩阵必须是方阵); end if any(obj.Matrix(:) 0) error(判断矩阵中的元素必须全部为正数); end for i 1:n for j 1:n if abs(obj.Matrix(i, j) * obj.Matrix(j, i) - 1) 1e-6 error(判断矩阵不满足互反性); end end end end function obj calculate(obj) RI_table [0, 0, 0.58, 0.90, 1.12, 1.24, 1.32, 1.41, 1.45, 1.49]; [n, ~] size(obj.Matrix); if n 10 error(当前 RI 表只支持 1 到 10 阶矩阵); end [V, D] eig(obj.Matrix); eigenvalues diag(D); [obj.LambdaMax, index] max(real(eigenvalues)); weight_vector real(V(:, index)); weight_vector abs(weight_vector); obj.Weights weight_vector / sum(weight_vector); if n 1 obj.CI 0; else obj.CI (obj.LambdaMax - n) / (n - 1); end RI RI_table(n); if RI 0 obj.CR 0; else obj.CR obj.CI / RI; end end function show(obj) disp(权重); disp(round(obj.Weights, 4)); fprintf(lambda_max %.4f\n, obj.LambdaMax); fprintf(CI %.4f\n, obj.CI); fprintf(CR %.4f\n, obj.CR); if obj.CR 0.1 disp(一致性检验通过); else disp(一致性检验未通过); end end end end调用方式clc; clear; matrix [ 1, 1/3, 3, 4; 3, 1, 5, 7; 1/3, 1/5, 1, 2; 1/4, 1/7, 1/2, 1 ]; ahp AHP(matrix); ahp ahp.calculate(); ahp.show();十四、AHP 的优点优点说明结构清晰能把复杂问题分解成目标层、准则层、方案层可解释性强每个权重来自两两比较过程透明适合定性与定量结合如服务质量、发展潜力等难以直接量化的指标有一致性检验能判断专家打分是否存在明显矛盾计算过程简单MATLAB、Python、Excel 都容易实现十五、AHP 的缺点缺点说明主观性较强判断矩阵依赖专家经验指标太多时工作量大n 个指标需要比较 ( n(n-1)/2 ) 次一致性可能不容易通过判断矩阵可能需要反复调整不适合方案特别多的情况方案层判断矩阵数量会快速增加对专家判断质量要求较高专家判断不合理会影响最终结果十六、AHP 使用建议实际使用 AHP 时建议注意以下几点建议说明每层指标不要过多一般 3–9 个比较合适判断矩阵要请熟悉业务的人填写保证判断质量必须进行一致性检验通常要求 CR 0.1对未通过一致性检验的矩阵进行调整找出明显矛盾的比较关系可与其他方法结合如 AHP-TOPSIS、AHP-熵权法、AHP-模糊综合评价十七、AHP 与其他方法的关系方法主要作用特点AHP计算主观权重、综合评价强调专家判断熵权法计算客观权重强调数据差异性TOPSIS方案排序根据理想解和负理想解排序模糊综合评价处理模糊评价问题适合定性模糊指标灰色关联分析衡量方案与理想方案的接近程度适合小样本、不完全信息常见组合方式AHP 计算指标权重 TOPSIS 进行方案排序或者AHP 主观权重 熵权法客观权重十八、总结AHP 的核心是用两两比较构造判断矩阵 用特征值法或几何平均法计算权重 用 CR 判断一致性是否可接受 最后计算各方案综合得分并排序核心公式[Aw \lambda_{\max}w][CI \frac{\lambda_{\max} - n}{n - 1}][CR \frac{CI}{RI}]一般判断标准CR 0.1判断矩阵一致性可以接受 CR 0.1需要调整判断矩阵在实际建模中AHP 特别适合指标数量适中 需要专家判断 定性指标较多 需要清晰解释决策过程例如供应商选择、项目评估、绩效评价、风险评估、选址决策、投资决策等问题。