Matlab AHP层次分析法(Analytic Hierarchy Process)实现指南

一、AHP层次分析法核心原理

AHP是一种多准则决策分析方法 ,通过层次化分解复杂问题,将定性判断转化为定量分析,核心步骤包括:

  1. 建立层次结构:目标层、准则层、方案层
  2. 构造判断矩阵:通过两两比较确定各元素相对重要性(1-9标度法)
  3. 层次单排序:计算判断矩阵的最大特征值及特征向量(权重)
  4. 一致性检验:验证判断矩阵的逻辑合理性(CR<0.1)
  5. 层次总排序:综合各层权重得到方案层总权重

二、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 判断矩阵与计算结果

  1. 准则层判断矩阵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(通过)

  2. 方案层对准则层判断矩阵 (以费用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%)

  3. 总排序结果

    方案 总权重 排名
    桂林 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层次分析法的核心是判断矩阵的特征值计算一致性检验,通过模块化函数可快速处理多准则决策问题。关键步骤包括:

  1. 建立层次结构 → 2. 构造判断矩阵 → 3. 计算权重与检验一致性 → 4. 层次总排序。

代码优势

  • 通用化设计,可替换判断矩阵应用于不同问题
  • 自动计算权重、CI、CR,避免手动计算错误
  • 可视化结果直观展示权重分布与排序
相关推荐
无缘之缘2 小时前
蓝桥杯手把手教你备战(C/C++ B组)(最全面!最贴心!适合小白!)
c语言·c++·算法·蓝桥杯
星辰徐哥2 小时前
C语言运算符的优先级与结合性详解
c语言·开发语言
HZ·湘怡2 小时前
顺序表 2 续集 c 实现增删查改
c语言·开发语言·顺序表
红目香薰2 小时前
Ascend C 算子:Sigmoid 函数原理深入解析与工程化构建及验证
c语言·开发语言·华为·华为云·昇腾·cann·modelarts
OTWOL2 小时前
C语言操作符终极揭秘:表达式求值秘籍
c语言·开发语言·c++
code monkey.2 小时前
【寻找Linux的奥秘】Linux 基础 IO 全解析:从 C 库到内核,吃透文件操作的底层逻辑
linux·c语言·基础io
Ancelin安心2 小时前
西工大noj(C/C++)100题参考题解及注意事项(2024)
c语言·c++·ide·windows·vscode·算法
jolimark2 小时前
C语言函数的构成、定义、使用方法及程序控制权转移介绍
c语言·函数调用·函数定义·参数传递·程序控制权
机器学习之心2 小时前
基于CNN卷积神经网络的轴承剩余寿命预测MATLAB实现
人工智能·matlab·cnn·轴承剩余寿命预测