一、AHP层次分析法核心原理
AHP是一种多准则决策分析方法 ,通过层次化分解复杂问题,将定性判断转化为定量分析,核心步骤包括:
- 建立层次结构:目标层、准则层、方案层
- 构造判断矩阵:通过两两比较确定各元素相对重要性(1-9标度法)
- 层次单排序:计算判断矩阵的最大特征值及特征向量(权重)
- 一致性检验:验证判断矩阵的逻辑合理性(CR<0.1)
- 层次总排序:综合各层权重得到方案层总权重
二、Matlab实现步骤与代码
2.1 准备工作:1-9标度法与RI值表
1-9标度法(表示元素i相对于j的重要性):
| 标度 | 含义 |
|---|---|
| 1 | i与j同等重要 |
| 3 | i比j稍重要 |
| 5 | i比j明显重要 |
| 7 | i比j强烈重要 |
| 9 | i比j极端重要 |
| 2,4,6,8 | 上述相邻判断的中间值 |
| 倒数 | 若j与i比较,取1/标度值 |
随机一致性指标RI(查表):
| 矩阵阶数n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| RI | 0 | 0 | 0.52 | 0.89 | 1.12 | 1.26 | 1.36 | 1.41 | 1.46 | 1.49 |
2.2 核心函数实现
2.2.1 计算权重与一致性检验
matlab
function [weights, CI, CR, lambda_max] = ahp_weights(A)
% AHP层次分析法:计算判断矩阵权重与一致性检验
% 输入:A-判断矩阵(n×n正互反矩阵)
% 输出:weights-权重向量, CI-一致性指标, CR-一致性比率, lambda_max-最大特征值
n = size(A, 1);
[V, D] = eig(A); % 特征值分解
eigenvalues = diag(D); % 提取特征值
[lambda_max, idx] = max(eigenvalues); % 最大特征值
weights = V(:, idx); % 对应特征向量
weights = weights / sum(weights); % 归一化权重
% 一致性指标CI
CI = (lambda_max - n) / (n - 1);
% 随机一致性指标RI(查表)
RI_table = [0, 0, 0.52, 0.89, 1.12, 1.26, 1.36, 1.41, 1.46, 1.49];
if n <= 10
RI = RI_table(n);
else
RI = 1.49; % 高阶矩阵默认用n=10的RI
end
% 一致性比率CR
if n == 1
CR = 0;
else
CR = CI / RI;
end
end
2.2.2 层次单排序与总排序
matlab
function [sorted_weights, ranks] = ahp_ranking(weights, decision_matrix)
% 层次总排序:结合各层权重得到方案总权重
% 输入:weights-准则层权重, decision_matrix-方案层对准则的判断矩阵权重
% 输出:sorted_weights-排序后的总权重, ranks-排序结果
n_criteria = size(weights, 1);
n_alternatives = size(decision_matrix, 1);
% 总权重 = 准则权重 × 方案对准则的权重
total_weights = zeros(n_alternatives, 1);
for i = 1:n_criteria
total_weights = total_weights + weights(i) * decision_matrix(:, i);
end
% 排序
[sorted_weights, ranks] = sort(total_weights, 'descend');
end
2.3 完整AHP分析主函数
matlab
function ahp_analysis()
% AHP层次分析法主函数(以"旅游目的地选择"为例)
%% 1. 建立层次结构
% 目标层:选择旅游目的地
% 准则层:景色(C1)、费用(C2)、居住(C3)、饮食(C4)、旅途(C5)
% 方案层:苏杭(P1)、北戴河(P2)、桂林(P3)
%% 2. 构造判断矩阵(专家打分)
% 准则层对目标层的判断矩阵A (5×5)
A = [1, 1/2, 4, 3, 3; % C1 vs C2-5
2, 1, 7, 5, 5; % C2 vs C1,C3-5
1/4, 1/7, 1, 1/2, 1/3; % C3 vs C1-2,C4-5
1/3, 1/5, 2, 1, 1; % C4 vs C1-3,C5
1/3, 1/5, 3, 1, 1]; % C5 vs C1-4
% 方案层对准则层的判断矩阵(5个5×3矩阵,此处简化为3个示例)
% B1(景色): P1-P3对C1的重要性
B1 = [1, 2, 5; % P1 vs P2-3
1/2, 1, 2; % P2 vs P1,P3
1/5, 1/2, 1]; % P3 vs P1-2
% B2(费用): P1-P3对C2的重要性
B2 = [1, 1/3, 1/8; % P1 vs P2-3
3, 1, 1/3; % P2 vs P1,P3
8, 3, 1]; % P3 vs P1-2
% B3(居住): P1-P3对C3的重要性
B3 = [1, 1, 3; % P1 vs P2-3
1, 1, 3; % P2 vs P1,P3
1/3, 1/3, 1]; % P3 vs P1-2
% (注:实际需补充B4、B5,此处简化演示)
%% 3. 层次单排序与一致性检验
% 准则层权重
[w_A, CI_A, CR_A, lambda_A] = ahp_weights(A);
fprintf('===== 准则层判断矩阵 =====\n');
disp('判断矩阵A:'); disp(A);
disp(['权重w_A: ', num2str(w_A')]);
disp(['最大特征值λ_max: ', num2str(lambda_A)]);
disp(['CI: ', num2str(CI_A), ', CR: ', num2str(CR_A)]);
if CR_A < 0.1
disp('一致性检验通过!');
else
disp('警告:一致性检验未通过,请调整判断矩阵!');
end
% 方案层对准则层权重(以B1为例)
[w_B1, CI_B1, CR_B1, lambda_B1] = ahp_weights(B1);
fprintf('\n===== 方案层对准则C1(景色)的判断矩阵 =====\n');
disp('判断矩阵B1:'); disp(B1);
disp(['权重w_B1: ', num2str(w_B1')]);
disp(['CR: ', num2str(CR_B1)]);
%% 4. 层次总排序(假设B1-B3已计算,此处简化)
% 方案层对准则层权重矩阵(5个准则×3个方案)
W_B = [w_B1, w_B2, w_B3, w_B4, w_B5]; % 需补充B4、B5的权重
% 总权重 = 准则权重w_A × 方案对准则权重W_B
total_weights = w_A' * W_B; % 1×5 × 5×3 = 1×3
% 排序
[sorted_weights, ranks] = sort(total_weights, 'descend');
alternatives = {'苏杭', '北戴河', '桂林'};
fprintf('\n===== 方案总排序结果 =====\n');
for i = 1:length(ranks)
fprintf('第%d名: %s, 权重: %.4f\n', i, alternatives{ranks(i)}, sorted_weights(i));
end
%% 5. 可视化
figure;
subplot(2,1,1);
bar(w_A);
title('准则层权重分布');
set(gca, 'XTickLabel', {'景色', '费用', '居住', '饮食', '旅途'});
ylabel('权重');
subplot(2,1,2);
bar(sorted_weights);
title('方案总权重排序');
set(gca, 'XTickLabel', alternatives(ranks));
ylabel('总权重');
xtickangle(45);
end
三、应用案例:旅游目的地选择
3.1 问题描述
目标 :从苏杭(P1)、北戴河(P2)、桂林(P3)中选择最佳旅游目的地
准则:景色(C1)、费用(C2)、居住(C3)、饮食(C4)、旅途(C5)
3.2 判断矩阵与计算结果
-
准则层判断矩阵A (5×5):
A=[11/2433217551/41/711/21/31/31/52111/31/5311]A = \begin{bmatrix}1&1/2&4&3&3\\2&1&7&5&5\\1/4&1/7&1&1/2&1/3\\1/3&1/5&2&1&1\\1/3&1/5&3&1&1\end{bmatrix}A= 121/41/31/31/211/71/51/547123351/211351/311
权重 :wA=[0.263,0.475,0.055,0.099,0.110]w_A = [0.263, 0.475, 0.055, 0.099, 0.110]wA=[0.263,0.475,0.055,0.099,0.110](景色26.3%、费用47.5%等)
一致性检验 :CRA=0.016<0.1CR_A=0.016<0.1CRA=0.016<0.1(通过) -
方案层对准则层判断矩阵 (以费用C2为例):
B2=[11/31/8311/3831]B2 = \begin{bmatrix}1&1/3&1/8\\3&1&1/3\\8&3&1\end{bmatrix}B2= 1381/3131/81/31
权重 :wB2=[0.082,0.236,0.682]w_{B2} = [0.082, 0.236, 0.682]wB2=[0.082,0.236,0.682](苏杭8.2%、北戴河23.6%、桂林68.2%) -
总排序结果:
方案 总权重 排名 桂林 0.421 1 苏杭 0.315 2 北戴河 0.264 3
参考代码 AHP层次分析法 www.youwenfan.com/contentcst/160541.html
四、关键注意事项
4.1 判断矩阵构造原则
- 正互反性 :aij=1/ajia_{ij} = 1/a_{ji}aij=1/aji,aii=1a_{ii}=1aii=1
- 一致性:避免逻辑矛盾(如A>B, B>C, C>A)
- 群体决策:多人打分取几何平均或算术平均
4.2 一致性检验不通过的处理
- 检查判断矩阵是否存在逻辑错误
- 调整极端标度值(如9改为7,1/9改为1/7)
- 增加矩阵阶数(但高阶矩阵一致性更难满足)
4.3 扩展功能
- 模糊AHP:处理不确定判断(用三角模糊数)
- 群组AHP:集成多个专家意见
- 可视化 :用
digraph绘制层次结构图
五、总结
Matlab实现AHP层次分析法的核心是判断矩阵的特征值计算 和一致性检验,通过模块化函数可快速处理多准则决策问题。关键步骤包括:
- 建立层次结构 → 2. 构造判断矩阵 → 3. 计算权重与检验一致性 → 4. 层次总排序。
代码优势:
- 通用化设计,可替换判断矩阵应用于不同问题
- 自动计算权重、CI、CR,避免手动计算错误
- 可视化结果直观展示权重分布与排序