基于Matlab的层次分析法代码



原理

层次分析法(Analytic Hierarchy Process, AHP)是一种结构化的决策分析方法,它通过将复杂的决策问题分解为更小的部分,评估各部分的相对重要性,并通过合成的方式来进行最终决策。以下是使用AHP方法的一个例子,假设你需要选择一个新的工作地点。
步骤1:定义问题和层次结构

假设你在考虑三个城市作为你的新工作地点:城市A、城市B和城市C。决定最适合的工作地点时,你考虑了三个准则:生活成本(C1)、工作机会(C2)和生活质量(C3)。这样,你就建立了一个由目标层(选择最佳工作地点)、准则层(生活成本、工作机会、生活质量)和方案层(城市A、城市B、城市C)构成的三层结构。
步骤2:构造成对比较矩阵

对于准则层,你需要评估每个准则相对于总目标的重要性。假设你构造了以下成对比较矩阵:
在这里插入图片描述同样,对于每个准则,你也需要评估方案层中每个城市的相对表现。例如,对于生活成本(C1):
在这里插入图片描述你需要为其他准则(工作机会和生活质量)也构造相应的成对比较矩阵。
步骤3:计算权重和一致性检验

使用特定方法(例如,特征向量法)从成对比较矩阵中计算权重。然后,进行一致性检验,确保判断的一致性是可以接受的(一般CR < 0.10)。

假设计算结果显示所有矩阵都通过了一致性检验,准则层的权重为:生活成本(0.5)、工作机会(0.3)、生活质量(0.2)。对于生活成本准则,城市的权重为:A(0.15)、B(0.55)、C(0.3)。
步骤4:合成总排序

最后一步是将各层权重合成以得出方案层(即城市)的总排序。这通常涉及到将每个方案在各个准则下的权重与该准则的权重相乘,并对所有准则求和。
结果和决策
通过比较每个城市的总排序权重,你可以决定哪个城市最适合作为你的新工作地点。假设最终的权重显示城市B得分最高,那么根据AHP分析,你应该选择城市B作为新的工作地点。

这个例子展示了AHP方法的基本步骤:定义问题和建立层次结构、构造成对比较矩阵、计算权重并进行一致性检验、以及合成总排序来做出决策。通过这种方法,可以将复杂的多准则决策问题系统化和量化,帮助决策者根据一系列标准做出更加合理和客观的选择。

概述

以下MATLAB代码实现了层次分析法(AHP)的核心计算过程,包括一致性检验和计算层次总排序权重。层次分析法是一种定性和定量结合的决策分析方法,用于解决复杂的决策问题。代码按照三层结构设计,即目标层、准则层和方案层。下面是代码的详细解释和注释:

初始化:设置准则层的元素数量(n2=5)和方案层的元素数量(n3=3),并初始化随机一致性指数(RI)数组。

输入数据:
构造准则层的成对比较矩阵A,用于评估准则相对于目标的重要性。
构造方案层的成对比较矩阵B,这里B是一个三维数组,每个B(:,:,i)代表针对第i个准则的方案间的成对比较矩阵。

层次单排序权重计算:
使用CI_test函数对准则层的成对比较矩阵A进行一致性检验,若通过,计算准则的权重w_A。
 对于每个准则,使用CI_test函数对方案层的成对比较矩阵B进行一致性检验,若通过,计算相对于该准则的方案的权重w_B。

层次总排序权重计算:
 根据准则层的权重w_A和方案层的权重w_B计算方案对于总目标的权重w_Z。计算过程包括检验层次总排序的一致性比率CR,若CR小于0.1,则认为总排序通过一致性检验。

结果输出:如果所有一致性检验都通过,最终输出方案对总目标的权向量w_Z,即每个方案的综合权重。

代码中使用的CI_test函数对给定的判断矩阵进行一致性检验,并返回权重向量、一致性指数和一致性检验的标志。如果判断矩阵未通过一致性检验,CI_test会给出相应的提示信息。

这段代码直接使用了AHP方法的核心思想,即通过成对比较矩阵来评估决策元素(准则和方案)的相对重要性,并进行一致性检验以确保评估结果的合理性。通过这种方法,决策者能够根据各个方案对总目标的贡献度做出选择。

代码和注释

1.源代码

代码如下:
这段MATLAB代码使用层次分析法(AHP)来评估和决策问题,具体是通过计算准则层和方案层的权重来确定各个方案对总目标的相对重要性。以下是逐行解释:


clear all;
clc;

% 设置层次分析中准则层和方案层的元素数量
n2=5; % 准则层元素数量
n3=3; % 方案层元素数量
% 初始化随机一致性指数RI数组,用于后续的一致性检验
RI=[0 0.58 0.90 1.12 1.24 1.32 1.41 1.45 1.49 1.52 1.54 1.56 1.58 1.59];

% 输入成对比较矩阵A和B
% A是准则层的成对比较矩阵,用于评估准则间的相对重要性
A=[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];
% B是三维数组,存储针对每个准则的方案层成对比较矩阵
B=zeros([n3,n3,n2]);
B(:,:,1)=[1 2 5;1/2 1 2;1/5 1/2 1];
B(:,:,2)=[1 1/3 1/8;3 1 1/3;8 3 1];
B(:,:,3)=[1 1 3;1 1 3;1/3 1/3 1];
B(:,:,4)=[1 3 4;1/3 1 1;1/4 1 1];
B(:,:,5)=[1 1 1/4;1 1 1/4; 4 4 1];

% 对准则层成对比较矩阵A进行一致性检验,并计算权重
w_A=zeros([1,n2]);
[w_A,CI_A,flag]=CI_test(A,0);
if (flag==1) 
    return; % 如果A未通过一致性检验,终止程序
end

% 对方案层成对比较矩阵B进行一致性检验,并计算每个准则下的方案权重
w_B=zeros([n2,n3]);
CI_B=zeros([n2,1]);
for i=1:n2
    [w_B(i,:),CI_B(i),flag]=CI_test(B(:,:,i),i);
    if(flag==1) 
        return; % 如果任一B矩阵未通过一致性检验,终止程序
    end
end

% 计算层次总排序的一致性比率CR,并检验
RIB=ones([n2,1])*RI(n3);
CR=w_A*CI_B/(w_A*RIB);
if (CR>=0.1)
    disp('总排序未通过一致性检验,请重新给定判定矩阵!');
    return; % 如果总排序未通过一致性检验,终止程序
end

% 计算并输出方案对总目标的权向量
w_Z=w_A*w_B;
disp('各个方案对总目标的权向量为:');
disp(w_Z);

功能函数如下

function [w, CI, flag] = CI_test(A, tag)
    RI = [0 0.58 0.90 1.12 1.24 1.32 1.41 1.45 1.49 1.52 1.54 1.56 1.58 1.59];
    [n, ~] = size(A); % 使用波浪线(~)忽略不需要的输出
    flag = 0; % 初始化flag为0,表示通过一致性检验

    % 返回A的特征向量v与特征值d
    [v, d] = eig(A);
    % 找到最大特征值及其索引
    [r, max_index] = max(diag(d));
    % 计算CI
    CI = (r - n) / (n - 1);
    % 计算CR
    CR = CI / RI(n);

    if CR < 0.10
        % 通过一致性检验,计算权重向量
        max_eig_vec = v(:, max_index); % 获取最大特征值对应的特征向量
        w = max_eig_vec / sum(max_eig_vec); % 归一化特征向量作为权重向量
        w = w'; % 转置以满足输出格式
    else
        % 未通过一致性检验
        w = []; % 未通过检验时,权重向量为空
        CI = []; % 同样,CI设为空
        flag = 1; % 设置flag为1,表示未通过检验
        if tag == 0
            disp('准则层的判定矩阵A未通过一致性检验,请重新给定!');
        else
            disp(['方案层的判定矩阵B', num2str(tag), '未通过一致性检验,请重新给定!']);
        end
    end
end

欢迎关注gongzhonghao 趣品科研,获取更多代码和前沿论文资讯等相关内容

2.输出效果

各个方案对总目标的权向量为:
0.2993 0.2453 0.4554

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值