层次分析法(Analytic Hierarchy Process,简称 AHP)是对一些较为复杂、较为模 糊的问题作出决策的简易方法,它特别适用于那些难于完全定量分析的问题。
1.层次分析法的基本原理与步骤
人们在进行社会的、经济的以及科学管理领域问题的系统分析中,面临的常常是 一个由相互关联、相互制约的众多因素构成的复杂而往往缺少定量数据的系统。层次分析法为这类问题的决策和排序提供了一种新的、简洁而实用的建模方法。运用层次分析法建模,可按下面四个步骤进行:
(i)建立递阶层次结构模型;
(ii)构造出各层次中的所有判断矩阵;
(iii)层次单排序及一致性检验;
(iv)层次总排序及一致性检验。
1.1建立递阶层次结构模型
首先要把问题条理化、层次化,构造出一个有层次的结构模型。在这个模型下,复杂问题被分解为元素的组成部分。这些元素又按其属性及关系形成若干层次。上一层次的元素作为准则对下一层次有关元素起支配作用。 这些层次可以分为三类:
(i)最高层:这一层次中只有一个元素,一般它是分析问题的预定目标或理想结 果,因此也称为目标层。
(ii)中间层:这一层次中包含了为实现目标所涉及的中间环节,它可以由若干 个层次组成,包括所需考虑的准则、子准则,因此也称为准则层。
(iii)最底层:这一层次包括了为实现目标可供选择的各种措施、决策方案等, 因此也称为措施层或方案层。
1.2 构造判断矩阵
层次结构反映了因素之间的关系,但准则层中的各准则在目标衡量中所占的比重 并不一定相同,在决策者的心目中,它们各占有一定的比例。
构造判断矩阵根据层次结构图,将同一层次中的因素做两两比较,并且采用相对比例标 度来度量,为了使各因素的重要性能定量表示,以及指标因素相对重要性具体化、数量化, 通常用 1-9 标度法确定。
1.3 层次单排序及一致性检验
判断矩阵 A 对应于最大特征值λmax 的特征向量W ,经归一化后即为同一层次相应因素对于上一层次某因素相对重要性的排序权值,这一过程称为层次单排序。
对判断矩阵的一致性检验的步骤如下:
1.4 层次总排序及一致性检验
上面我们得到的是一组元素对其上一层中某元素的权重向量。我们最终要得到各 元素,特别是最低层中各方案对于目标的排序权重,从而进行方案选择。总排序权重 要自上而下地将单准则下的权重进行合成。
层次总排序合成表:
对层次总排序也需作一致性检验,检验仍象层次总排序那样由高层到低层逐层进行。这是因为虽然各层次均已经过层次单排序的一致性检验,各成对比较判断矩阵都 已具有较为满意的一致性。但当综合考察时,各层次的非一致性仍有可能积累起来,引起最终分析结果较严重的非一致性。
2.层次分析法的实际应用
2.1.建立层次结构模型
以大学生就业城市选择为目标,影响就业城市选择的六个因素作为准则,北京、上 海、深圳三个城市为方案,建立模型如 1.1 图所示:第一层就业城市选择为目标层,第二 层就业前景、薪资水平、城市位置、城市竞争力、政策制度、生活环境为准则层,第三 层北京、上海、深圳为方案层。
2.2.构造判断矩阵
将准则层中六个元素𝐵1,𝐵2, … , 𝐵6进行两两比较,得到对比较矩阵A。在构建所得的成对 比较矩阵中的元素𝑎𝑖𝑗,其所表示第𝑖个元素相对于第𝑗个元素的比较结果。最终得到目标层对 准则层的对比较矩阵为A,准则层对方案层的对比矩阵为𝐵1、𝐵2、𝐵3、𝐵4、𝐵5、𝐵6.
2.3 层次单排序及其一致性检验
2.4 层次总排序及一致性检验
2.5程序实现
定义函数:
function [W, ahpResult] = ahp(C)
RI = [0, 0, 0.58, 0.90, 1.12, 1.24, 1.32, 1.41, 1.45, 1.49, 1.51];
n = length(C);
ahpResult = cell(n, 1);
W = eye(1); % 初始化W为单位矩阵
for k = 1:n
m_k = size(C{k}, 2);
ahpResult{k} = cell(m_k, 1);
for kk = 1:m_k
[V, D] = eig(C{k}{1, kk});
[maxD, ind] = max(diag(D));
V = V(:, ind);
V = V / sum(V); % 归一化特征向量
ahpResult{k}{1, kk} = V;
ahpResult{k}{2, kk} = maxD;
nn = size(C{k}{1, kk}, 1);
if nn > 1
CR = (maxD - nn) / (nn - 1) / RI(nn);
ahpResult{k}{3, kk} = CR;
else
ahpResult{k}{3, kk} = 0; % 单一元素矩阵的CR设为0
end
end
if k > 1
W = W * ahpResult{k}{1, 1};
end
end
end
加载数据 :
C=cell(2,1);
C{1}{1,1} = [1 1 1/2 3 1 1/2;1 1 2 3 1 1/2;2 1/2 1 5 3 1/2;1/3 1/3 1/5 1 1/3 1/3;1 1 1/3 3 1 1;2 2 2 3 3 1];
C{1}{2,1} = [true true true true true true];
C{2}{1,1} = [1 1/2 1;2 1 3;1 1/3 1];
C{2}{2,1} = [true true true];
C{2}{1,2} = [1 3 2;1/3 1 1;1/2 1 1];
C{2}{2,2} = [true true true];
C{2}{1,3} = [1 2 1/2;1/2 1 1/3;2 3 1];
C{2}{2,3} = [true true true];
C{2}{1,4} = [1 1/2 1/2;2 1 1/2;2 2 1];
C{2}{2,4} = [true true true];
C{2}{1,5} = [1 1 1/3;1 1 1/2;3 2 1];
C{2}{2,5} = [true true true];
C{2}{1,6} = [1 2 1;1/2 1 1;1 1 1];
C{2}{2,6} = [true true true];
% 调用函数
[W, ahpResult] = ahp(C);
每个子cell内的布尔向量,用来表示一致性检验的结果,在上述代码中这些向量都被硬编码为true
,这在实际应用中是不合逻辑的,因为一致性检验的结果需要通过计算得出。于是对其进行修正。
clc,clear
fid=fopen('txt3.txt','r');
n1=6;n2=3;
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);
lamda=max(diag(y));
num=find(diag(y)==lamda);
w0=x(:,num)/sum(x(:,num));
cr0=(lamda-n1)/(n1-1)/ri(n1)
for i=1:n1
[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
2.6结果分析
上图输出为层次单排序一致性检验结果、总排序的权重和层次总排序一致性检验结果。
上图为:方案层单排序的权重。
上图为:准则层的权重。