Wanjia Huang

西南交通大学 软件工程

0%

【数学建模】层次分析法

层次分析法简介

​ 层次分析法(AHP)主要是通过建立梯阶层次结构,将复杂的问题分解成主要的目标(O)、方案§、准则©三个结构层,并通过对准则和方案的两两比较,确定各准则、方案间的权重。

层次分析法的基本步骤

​ (i) 分析问题中各因素间的关系,建立递阶层次结构模型。

​ (ii) 构造出各层次的所有判断矩阵

​ (iii) 根据判断矩阵计算被比较元素对于该准则的相对权重,进行一致性检验

​ (iv) 层次总排序及一致性检验

模型建立过程

建立递阶层次结构模型

​ 在应用AHP模型时,我们需要对模型解决的问题进行层次化,构造出一个有层次地结构模型。该模型将复杂地问题分解为三个层次(目标层、准则层、措施层/方案层),每个层次又包含着若干元素。上一层次的元素作为准则对下一层次有关元素起着支配作用。下面是各个层次的简介:

​ (i) 目标层:分析问题的预定目标或者结果,该层次只有一个元素。

​ (ii) 准则层:为了实现目标而涉及的中间环节,它可以由若干个层次。

​ (iii)方案层/措施层:为实现目标可供选择的各种措施、决策方案。

​ 一般来说每一层次中的元素不要超过9个,因为支配的元素过度哦会给两两比较判断带来困难。

​ 引用《数学建模算法与应用》中的一个例子:

​ 例:

​ 在该例中,为了解决“选择旅游目的地”问题,将准则层分为“景色”、“费用”、“居住”、“饮食”、“旅途”五个准则层,措施层有P1、P2、P3三个。

构造出各层次的所有判断矩阵

​ AHP中构建判断矩阵A的方式是对因子进行两两比较,其中判断矩阵中aij表示与i指标相比,j的重要程度。确定aij的值一般采用Satty建议的标度:

标度 标度
1 表示两个因素相比,具有相同重要性
3 表示两个因素相比,前者比后者稍重要
5 表示两个因素相比,前者比后者明显重要
7 表示两个因素相比,前者比后者强烈重要
9 表示两个因素相比,前者比后者极端重要
2,4,6,8 表示上述相邻判断的中间值
计算权重,进行一致性检验

​ 判断矩阵A对应最大特征值**$\lambda$的特征向量W,该特征向量进行归一化处理**后既为同一层次的权重。

​ 再将W经归一化后进行排序,得到同一层次相应因素对于上一层次某因素相对重要性的排序权值。但我们综合全部比较结果时,难免包含一定的非一致性,所以需要我们进行一致性检验。

一致性检验的步骤

​ (1) 计算一致性指标CI
$$
CI=\frac{\lambda_m-n}{n-1}
$$
​ (2) 查找相应的平均随机一致性指标RI(RI的计算方法略,直接查表就好了。)

n 1 2 3 4 5 6 7 8 9
RI 0 0 0.58 0.90 1.12 1.24 1.32 1.41 1.45

​ (3) 计算一致性比例CR
$$
CR=\frac{CI}{CR}
$$
​ 当CR<0.10时,认为判断举证的一致性是可以接受的,否则要对判断矩阵作适当修改

计算总得分,进行排序

​ 在AHP中,总排序权重要自上而下地将单准则下的权重进行合成。计算的方法类似于将权重*因素得分,但需要注意的是,计算出来的层次总排序也需要作一致性检验。


$$
CR=\frac{\sum_{j=1}^{m}CI(j)a_j}{\sum_{j=1}^{m}RI(j)a_j}
$$
​ 当CR<0.10时认为层次总排序结果具有较满意的一致性并接受该分析结果

Matlab实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
clc,clear
fid=fopen('txt3.txt','r');
n1=6;n2=3;%n1为准则层元素个数,n2为方案层个数
a=[];
for i=1:n1
tmp=str2num(fgetl(fid));
a=[a;tmp]; %读准则层判断矩阵
end
for i=1:n1
str1=char(['b',int2str(i),'=[];']);
str2=char(['b',int2str(i),'=[b',int2str(i),';tmp];']);
eval(str1);
for j=1:n2
tmp=str2num(fgetl(fid));
eval(str2); %读方案层的判断矩阵
end
end
ri=[0,0,0.58,0.90,1.12,1.24,1.32,1.41,1.45]; %一致性指标
[x,y]=eig(a); % matlab eig(a) 返回矩阵的特征值和特征向量, 这里的 x 为矩阵 a 的 n 个特征向量, y 为矩阵 a 的 n 个特征值
lamda=max(diag(y)); % eig 函数返回的 y 是矩阵形式保存的, dig(y) 提取对角线上的n 个特征值到一个数组中, 求出最大特征值 lamda
num=find(diag(y)==lamda); % 返回最大特征的索引
w0=x(:,num)/sum(x(:,num)); % x( :num) 为最大特征值所对应的那一列特征向量。 w0 中准则层计算出的 包含归一化后的n 个权重值
cr0=(lamda-n1)/(n1-1)/ri(n1)

for i=1:n1 % 循环 n 个维度, 针对每个维度, 都计算一次方案层的比较矩阵及其权重值
[x,y]=eig(eval(char(['b',int2str(i)])));
lamda=max(diag(y));
num=find(diag(y)==lamda);
w1(:,i)=x(:,num)/sum(x(:,num));
cr1(i)=(lamda-n2)/(n2-1)/ri(n2);
end
cr1, ts=w1*w0, cr=cr1*w0 %ts 为得分

​ 其中fid=fopen('txt3.txt','r');为打开txt3.txt文件,该文件为引例中的判断矩阵

1
2
3
4
5
6
7
8
9
	输出结果为:
ts =
0.3952
0.2996
0.3052

cr =

0.0117 %需要重改矩阵~但我懒

​ 方案1得分最高为0.3952,说明选择方案1。

参考

[1]司守奎,孙兆亮,数学建模算法与应用,北京:国防工业出版社,2015年,p192-p194.

[2]司守奎,数学建模算法与应用,海军航空工程学院,p167-p172

[3]黄san岁.数学建模-层次分析[EB/OL].https://blog.csdn.net/hyd_hss/article/details/106745446?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159496639319725250150451%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=159496639319725250150451&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-2-106745446.first_rank_ecpm_v3_pc_rank_v2&utm_term=%E5%B1%82%E6%AC%A1%E5%88%86%E6%9E%90%E6%B3%95,2020-06-14