MATLAB 层次分析法

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。
🍎个人主页:小嗷犬的个人主页
🍊个人网站:小嗷犬的技术小站
🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。



层次分析法

层次分析法,简称 AHP,是指将与决策总是有关的元素分解成目标、准则、方案等层次,在此基础之上进行定性和定量分析的决策方法。该方法是美国运筹学家匹茨堡大学教授萨蒂于 20 世纪 70 年代初,在为美国国防部研究“根据各个工业部门对国家福利的贡献大小而进行电力分配”课题时,应用网络系统理论和多目标综合评价方法,提出的一种层次权重决策分析方法

层次分析法一般包括以下几个步骤:

  1. 建立层次结构模型
  2. 构造判断矩阵
  3. 层次单排序及其一致性检验
  4. 层次总排序及其一致性检验

建立层次结构模型

将将决策的目标、考虑的因素(决策准则)和决策方案,按它们之间的相互关系分为最高层中间层最低层,画出层次结构图。

  • 最高层:目标层。决策的目的、要解决的问题。
  • 中间层:准则层。考虑的因素、决策的准则。
  • 最低层:方案层。决策时可供选择的方案。

层次结构模型

构造判断矩阵

在确定各层次各因素之间的权重时,如果只是定性的结果,则常常不容易被别人接受,因而 Saaty 等人提出一致矩阵法,即不把所有因素放在一起比较,而是两两相互比较,对此时采用相对尺度,以尽可能减少性质不同的诸因素相互比较的困难,以提高准确度。如对某一准则,对其下的各方案进行两两对比,并按其重要性程度评定等级。 a i j a_{ij} aij 为要素 i i i 与要素 j j j 重要性比较结果,按两两比较结果构成的矩阵称作判断矩阵,判断矩阵具有如下性质:

a i j > 0 , a i j = 1 a j i , a i i = 1 a_{ij} > 0, a_{ij} = \frac{1}{a_{ji}}, a_{ii} = 1 aij>0,aij=aji1,aii=1

下表列出了 Saaty 给出的 9 个重要性等级及其赋值:

因素 i i i 与因素 j j j 的重要性比较结果量化值
i i i j j j 同等重要1
i i i j j j 稍微重要3
i i i j j j 较强重要5
i i i j j j 强烈重要7
i i i j j j 极端重要9
两相邻判断的中间值2, 4, 6, 8

层次单排序及其一致性检验

对应于判断矩阵最大特征根 λ m a x \lambda_{max} λmax 的特征向量,经归一化(使向量中各元素之和等于 1)后记为 W W W W W W 的元素为同一层次因素对于上一层次因素某因素相对重要性的排序权值,这一过程称为层次单排序。得到的 W W W 称为单层权向量。

计算得到的单层权向量 W W W 是否合理,取决于判断矩阵是否一致,一个完全一致的判断矩阵 A A A 应满足以下条件:

a i j a j k = a i k , ∀ i , j , k ∈ { 1 , 2 , ⋯   , n } a_{ij}a_{jk} = a_{ik}, \forall i, j, k \in \{1, 2, \cdots, n\} aijajk=aik,i,j,k{1,2,,n}

但事实上,由于人们的主观性,构造出来的判断矩阵很难做到完全一致,因此人们引入了一致性指标 C I CI CI 来衡量判断矩阵的一致性, C I CI CI 的计算公式为:

C I = λ m a x − n n − 1 CI = \frac{\lambda_{max} - n}{n - 1} CI=n1λmaxn

  • C I = 0 CI = 0 CI=0 时,判断矩阵 A A A 完全一致。
  • C I > 0 CI > 0 CI>0 时,判断矩阵 A A A 不一致。
  • C I CI CI 值越大,判断矩阵 A A A 不一致程度越大。

为了衡量 C I CI CI 的大小,引入了随机一致性指标 R I RI RI

R I = 1 n ∑ i = 1 n C I i RI = \frac{1}{n}\sum_{i=1}^n CI_{i} RI=n1i=1nCIi

一般情况下,矩阵阶数越大,则出现一致性随机偏离的可能性也越大,即 R I RI RI 的值会随着 n n n 的增大而增大, R I RI RI 的值与 n n n 的关系如下表所示:

n n n12345678910
R I RI RI000.580.901.121.241.321.411.451.49

考虑到一致性的偏离可能是由于随机原因造成的,因此在检验判断矩阵是否具有满意的一致性时,还需将 C I CI CI 和随机一致性指标 R I RI RI 进行比较,得出一致性比例 C R CR CR ,公式如下:

C R = C I R I CR = \frac{CI}{RI} CR=RICI

通常情况下,我们认为:

  • C R < 0.1 CR < 0.1 CR<0.1 时,判断矩阵 A A A 具有满意的一致性。
  • C R > 0.1 CR > 0.1 CR>0.1 时,判断矩阵 A A A 不具有满意的一致性。

层次总排序及其一致性检验

计算某一层次所有因素对于最高层(总目标)相对重要性的权值,称为层次总排序。这一过程是从最高层次到最低层次依次进行的。

对于第 k k k 层次,设其一致性指标为 C I ( k ) CI_{(k)} CI(k),随机一致性指标为 R I ( k ) RI_{(k)} RI(k),则有:

C I ( k ) = C I ( k ) T W ( k − 1 ) R I ( k ) = R I ( k ) T W ( k − 1 ) CI_{(k)} = CI_{(k)}^{T}W_{(k-1)} \\ RI_{(k)} = RI_{(k)}^{T}W_{(k-1)} CI(k)=CI(k)TW(k1)RI(k)=RI(k)TW(k1)

k k k 层次的一致性比例为:

C R ( k ) = C I ( k ) R I ( k ) CR_{(k)} = \frac{CI_{(k)}}{RI_{(k)}} CR(k)=RI(k)CI(k)

评判标准与层次单排序相同。


层次分析法解志愿填报问题

问题描述

小李需要填报考研志愿,已经确定了 3 个方案,需要你从专业认可度、院校认可度、院校所在地、考研难易 4 个方面进行评估,最终确定最佳方案。

填报考研志愿 - 层次结构模型

小李给出的准则层判断矩阵如下:

A = [ 1 2 4 2 1 / 2 1 3 2 1 / 4 1 / 3 1 1 / 3 1 / 2 1 / 2 3 1 ] A = \begin{bmatrix} 1 & 2 & 4 & 2 \\ 1/2 & 1 & 3 & 2 \\ 1/4 & 1/3 & 1 & 1/3 \\ 1/2 & 1/2 & 3 & 1 \end{bmatrix} A= 11/21/41/2211/31/24313221/31

小李对预选的 3 个方案进行了两两比较,得到的判断矩阵如下:

B 1 = [ 1 4 6 1 / 4 1 2 1 / 6 1 / 2 1 ] , B 2 = [ 1 2 3 1 / 2 1 2 1 / 3 1 / 2 1 ] , B 3 = [ 1 8 1 1 / 8 1 1 / 9 1 9 1 ] , B 4 = [ 1 2 4 1 / 2 1 3 1 / 4 1 / 3 1 ] B_{1} = \begin{bmatrix} 1 & 4 & 6 \\ 1/4 & 1 & 2 \\ 1/6 & 1/2 & 1 \end{bmatrix}, B_{2} = \begin{bmatrix} 1 & 2 & 3 \\ 1/2 & 1 & 2 \\ 1/3 & 1/2 & 1 \end{bmatrix}, B_{3} = \begin{bmatrix} 1 & 8 & 1 \\ 1/8 & 1 & 1/9 \\ 1 & 9 & 1 \end{bmatrix}, B_{4} = \begin{bmatrix} 1 & 2 & 4 \\ 1/2 & 1 & 3 \\ 1/4 & 1/3 & 1 \end{bmatrix} B1= 11/41/6411/2621 ,B2= 11/21/3211/2321 ,B3= 11/8181911/91 ,B4= 11/21/4211/3431

MATLAB 求解

% 准则层判断矩阵
A = [1 2 4 2; 1/2 1 3 2; 1/4 1/3 1 1/3; 1/2 1/2 3 1];

% 方案层判断矩阵
B1 = [1 4 6; 1/4 1 2; 1/6 1/2 1];
B2 = [1 2 3; 1/2 1 2; 1/3 1/2 1];
B3 = [1 8 1; 1/8 1 1/9; 1 9 1];
B4 = [1 2 4; 1/2 1 3; 1/4 1/3 1];

% 计算准则层权向量
[V2, D2] = eig(A);
W2 = V2(:, 1) / sum(V2(:, 1));
lambda2 = D2(1, 1);

% 准则层一致性检验
CI2 = (lambda2 - size(A, 1)) / (size(A, 1) - 1);
RI = [0 0 0.58 0.90 1.12 1.24 1.32 1.41 1.45 1.49];
CR2 = CI2 ./ RI(size(A, 1));
if CR2 < 0.1
    disp('准则层一致性检验通过');
    CR2
else
    error('准则层一致性检验不通过');
end

% 计算方案层权向量
[V3_1, D3_1] = eig(B1);
[V3_2, D3_2] = eig(B2);
[V3_3, D3_3] = eig(B3);
[V3_4, D3_4] = eig(B4);
W3_1 = V3_1(:, 1) / sum(V3_1(:, 1));
W3_2 = V3_2(:, 1) / sum(V3_2(:, 1));
W3_3 = V3_3(:, 1) / sum(V3_3(:, 1)); 
W3_4 = V3_4(:, 1) / sum(V3_4(:, 1));
lambda3_1 = D3_1(1, 1);
lambda3_2 = D3_2(1, 1);
lambda3_3 = D3_3(1, 1);
lambda3_4 = D3_4(1, 1);

% 方案层一致性检验
lambda3 = [lambda3_1 lambda3_2 lambda3_3 lambda3_4];
CI3 = (lambda3 - size(B1, 1)) ./ (size(B1, 1) - 1);
CR3 = CI3 ./ RI(size(B1, 1));
if CR3 < 0.1
    disp('方案层一致性检验通过');
    CR3
else
    error('方案层一致性检验不通过');
end

% 组合一致性检验
CR = CR2 + CR3 * W2;
if CR < 0.1
    disp('组合一致性检验通过');
    CR
else
    error('组合一致性检验不通过');
end

% 计算最终权向量
W3 = [W3_1 W3_2 W3_3 W3_4];
W = W3 * W2;

% 输出结果
disp('最终权向量为:');
W

结果:

准则层一致性检验通过
CR2 =
    0.0301

方案层一致性检验通过
CR3 =
    0.0079    0.0079    0.0013    0.0158

组合一致性检验通过
CR =
    0.0390

最终权向量为:
W =
    0.6057
    0.2359
    0.1583

因此,最佳方案为方案 1

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
层次分析是一种常用的决策分析,可以用于处理多个因素之间的复杂关系。以下是一个与层次分析相关的数学建模题,并提供了MATLAB代码来实现。 问题描述: 某公司计划购买新的生产机器,他们需要在4种不同的机器中进行选择,包括机器A、机器B、机器C和机器D。他们希望选出最适合他们需求的一台机器。他们将考虑以下6个因素来进行评估:成本、生产效率、质量、可靠性、维护成本和售后服务。现在需要通过层次分析进行权重的计算,以选择最佳的机器。 解决方案: 1. 构建层次结构:通过对问题的分析,我们可以建立以下层次结构: 层次1:选择机器 层次2:因素权重 层次3:成本、生产效率、质量、可靠性、维护成本和售后服务 2. 构建判断矩阵:根据专家意见或数据分析,我们可以构建一个3×3的判断矩阵来衡量因素之间的相对重要性。例如,我们可以根据专家意见将生产效率、质量和可靠性相对地评为9、5和7,那么判断矩阵如下: 1 9 7 1/9 1 3/5 1/7 5/3 1 3. 计算权重:根据判断矩阵,我们可以通过计算特征向量和特征值的方来计算权重。这里可以使用MATLAB中的eig函数来计算判断矩阵的特征向量和特征值,并归一化得到权重向量。 4. 评估选择:根据每个机器的因素权重,可以通过加权求和来评估每个机器的总权重,并选择最高的一台机器作为最佳选择。 MATLAB代码示例: ``` % 构建判断矩阵 A = [1 9 7; 1/9 1 3/5; 1/7 5/3 1]; % 计算特征向量和特征值 [~, eig_vals] = eig(A); % 获取最大特征值 max_eig_val = max(max(eig_vals)); % 获取最大特征值对应的特征向量 max_eig_vec = eig_vals(:, max(eig_vals) == max_eig_val); % 归一化计算权重向量 weights = max_eig_vec ./ sum(max_eig_vec); % 各机器得分 machine_scores = [0.6, 0.7, 0.8, 0.9]; % 假设都是随机得分 % 计算各机器的总权重 weighted_scores = machine_scores * weights; % 找到最高得分机器 [~, max_index] = max(weighted_scores); % 输出结果 disp(['最佳机器是机器', num2str(max_index)]); ``` 以上代码可以帮助解决该问题,根据输入的判断矩阵和各机器的得分,计算出每个机器的总权重,并选出最优机器。请根据具体的需求和数据进行修改和适配。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小嗷犬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值