资源描述
20. 层次分析法
一、概述
层次分析法(Analytic Hierarchy Process,AHD)是将要决策问题及其关于因素分解成目的、准则、方案等层次,进而进行定性和定量分析决策办法。它特性是合理地将定性与定量决策结合起来,按照思维、心理规律把决策过程细致化(层次化、数量化)。
层次分析法广泛地应用到解决复杂决策问题,而决策是基于该办法计算出权重,因此也惯用来拟定指标权重。
层次分析法基本思路与人们对一种决策问题思维、判断过程大体上是同样。例如,选购一台笔记本电脑,假设有三种不同品牌款式笔记本电脑A、B、C供选取。咱们普通会依照价格、外观、重量、用途、功耗、品牌等某些准则去重复比较这个三个候选。一方面,会拟定这些准则在自己心目中各占多大比重,不同人这种比重会有很大差别(喜欢玩游戏人看重硬件性能和散热、预算有限人看重价格等)。另一方面,还会就每一种准则将A、B、C进行对比,例如A最便宜,B次之;C性能最佳,B次之;C品牌最知名等。最后,将这两个层次比较判断进行综合,在A、B、C中拟定一台作为最符合自己需求电脑。
二、算法环节
1. 将问题条理化、层次化,建立层次构造模型
1)最高层(目的层)——只有一种元素:决策目的;
2)中间层(准则层)——考虑因素,决策准则、子准则;
3)最底层(方案层)——决策时备选方案、办法。
层次分析法要解决问题是,求出最底层对最高层相对权重,以此对最底层方案、办法进行排序,选取最优方案。
注1:为了避免两两比较判断过于复杂,每层次中各元素所支配元素普通不要超过9个,否则应划分为若干子层;
注2:层次分析法只考虑相邻两个层次间自上向下支配作用,以为同一层次元素间互相独立,若考虑进来需要网络分析法(ANP)。
例如前文提到选购笔记本电脑决策模型,可以建立如下层次构造:
2. 构造判断矩阵(成对比较矩阵)
构造好层次模型后,针对某一层来讲,在比较第i个元素与第j个元素相对于上一层某个因素重要性时,使用数量化相对权重aij来表达,假设共有n个元素参加比较,则矩阵
称为判断矩阵(或成对比较矩阵)。
Saaty依照绝大多数人认知事物心理习惯,建议用1~9及其倒数作为标度来拟定aij值。
其中,2,4,6,8分别介于1,3,5,7,9相应重要限度之间。显然,A中元素满足:
i) aij> 0; ii) aji = 1/aij; iii) aii =1
称为正互反矩阵。
例如,选购笔记本电脑模型中,可以依照实际三台电脑重量得到电脑对准则层B3判断矩阵(aij可以取笔记本电脑j与i重量之比,重量越轻越好):
3. 层次单排序及判断矩阵一致性检查
通惯用特性根法从判断矩阵导出,单一准则下元素相对排序权重。
定义若n阶正互反矩阵 (aij)n×n满足aikakj = aij(相应aij=wi/wj,故需要aikakj =(wi/wk)/(wk/wj) = aij),则称(aij)n×n为一致性矩阵。
特性根法基本思想是,当正互反矩阵 (aij)n×n为一致性矩阵时,相应于判断矩阵最大特性根λmax特性向量,经归一化后(使向量中各元素之和等于1)即为排序权向量,记为w,w元素为同一层次因素对于上一层次某因素相对重要性排序权值,这一过程称为层次单排序。
能否进行层次单排序,就看判断矩阵与否为一致性矩阵,有如下定理:
定理n阶正互反矩阵A为一致性矩阵充要条件是,A最大特性值λmax = n.
在实际操作中,由于客观事物复杂性以及人们对事物判断比较时模糊性,很难构造出完全一致判断矩阵。因而,Satty在构造层次分析法时,提出了一致性检查,所谓一致性检查是指判断矩阵容许有一定不一致范畴。
一致性检查环节如下:
1)计算判断矩阵A最大特性值λmax;
2)求出一致性指标(Consistencey Index):
C.I.=0表达完全一致,C.I.越大越不一致;
3)用随机模仿取平均办法,求相应平均随机一致性指标R.I.,或者直接用Satty模仿1000次得到R.I.表:
4)计算一致性比率:
5)判断,当C.R.<0.1时,以为判断矩阵A有满意一致性;若C.R.≥0.1,应考虑修正判断矩阵A.
4. 计算各元素对目的层合成权重(层次总排序)
为了实现层次分析法最后目,需要从上而下逐级进行各层元素对目的合成权重计算。
设已计算出第k-1层nk-1个元素相对于目的合成权重为:
再设第k层nk个元素关于第k-1层第j个元素(j=1,…,nk-1)单一准则排序权重向量为:
上式对k层nk个元素是完全,若某些元素不受k-1层第j个元素支配,相应位置用0补充,于是得到nk×nk-1阶矩阵:
从而可以得到第k层nk个元素关于目的层合成权重向量:
按递归展开得
写成分量形式为
各层元素对目的层合成排序权重向量与否可以满意接受,与单一准则下排序问题同样,需要进行综合一致性检查:
当C.R.(k)< 0.1时,则以为层次构造在第k层以上判断具备整体满意一致性。
注:实际应用中,整体一致性检查常不予进行。重要因素是,整体考虑十分困难;另一方面若每个单一准则下判断矩阵具备满意一致性,而整体达不到满意一致性时,调节起来非常困难。此外,整体一致性背景也不如单一准则下背景清晰,它必要性有待进一步研究。
三、Matlab实现
实现层次分析法Matlab函数:ahp.m
function [W,ahpResult] = ahp(C)
%层次分析法
%C为n×1元胞数组,存储整个层次模型构造:第2层对第1层、第3层对第2层、...第n+1层对第n层
%假设第k层有m_k个元素,从左到右依次编号1,...,m_k
%C{k}也是元胞数组,k=1,...,n
%C{k}{1,j}存储受第j元素支配第k+1层各元素判断矩阵(j=1,2,...,m_k)
%C{k}{2,j}存储第k+1层各元素与否受第k层第j元素支配(m_k+1)*1逻辑数组,1表达支配,0表达不受支配
%W返回方案层对目的层最后权重向量
%ahpResult为n×1元胞数组,存储层次分析过程各层成果信息,ahpResult{k}也是元胞数组
%ahpResult{k}{1,j}返回第k+1层所有元素相对第k层j元素权重向量,第k+1层元素不受第k层j元素支配权重为0
%ahpResult{k}{2,j}返回第k+1层所有元素相对于第k层第j元素判断矩阵最大特性值
%ahpResult{k}{3,j}返回第k+1层所有元素相对于第k层第j元素判断矩阵一致性比率C.R.
RI=[0 0 0.58 0.90 1.12 1.24 1.32 1.41 1.45 1.49 1.51]; % 平均随机一致性指标
n = length(C); %得到C长度n,于是懂得模型总层数为n+1
ahpResult = cell(n,1); % ´存储各层成果信息
for k = 1:n
m_k = size(C{k},2); % k层元素个数
ahpResult{k} = cell(m_k,1);
forkk = 1:m_k
%求第k+1层各元素对第k层kk元素成对比较矩阵特性值和特性向量
[V,D] = eig(C{k}{1,kk});
[maxD,ind] = max(diag(D)); % 求最大特性值和其位置
%为存储第k+1层所有元素相对k层kk元素权重预留出空间,长度应等于C{k}{2,kk}长度
ahpResult{k}{1,kk} = zeros(length(C{k}{2,kk}),1);
%将相应正互反矩阵属于最大特性值特性向量归一化后赋给ahpResult{k}{1,kk}中相应位置
%这些位置由逻辑数组C{k}{2,kk}决定
ahpResult{k}{1,kk}(C{k}{2,kk}) = V(:,ind)/sum(V(:,ind));
ahpResult{k}{2,kk} = maxD; % C{k}{1,kk}正互反矩阵最大特性值
nn = size(C{k}{1,kk},1); % C{k}{1,kk}阶数
ahpResult{k}{3,kk} = (maxD-nn)/(nn-1)/RI(nn); % 相应一致性比率C.R.
end
end
W = ahpResult{1}{1,1};
for k = 2:n
% cat(2,ahpResult{k}{1,:})把k+1层所有元素相对k层各个元素权重向量横向排在一起生成权重矩阵U^(k)
W = cat(2,ahpResult{k}{1,:})*W;
end
用该函数实现层次分析法核心是,把整个层次构造存入嵌套元胞数组C中(见程序注释):
C{k}——存储第k+1层与第k层构造(k=1,…,n);
设第k层有mk个元素,其中第j元素与第k+1层构造关系存储到C{k}{…,j}中(j=1,…,mk),需要存储信息有:
① 受第j元素支配第k+1层各元素判断矩阵
② 第k+1层各元素与否受第k层第j元素支配(即有无连线)
因此需要两个位置,即C{k}{1,j}和C{k}{2,j}.
例1某工厂有一笔公司留成利润,需要决定如何分派使用。已经决定有三种用途:奖金、集体福利办法、引进技术设备。考察准则也有三个:与否能调动职工积极性、与否有助于提高技术水平、考虑改进职工生活条件。建立如下层次模型:
通过工厂决策人员讨论,得到如下判断矩阵:
1. 第2层对第1层
三个元素C1,C2,C3都受A支配,判断矩阵C{1}{1,1}为
相应逻辑数组C{1}{2,1}为[true truetrue].
2. 第3层对第2层
(1) 第3层对第2层第1个元素C1
受C1支配只有两个元素P1和P2,判断矩阵C{2}{1,1}为
相应逻辑数组C{2}{2,1}为[true truefalse].
(2) 第3层对第2层第2个元素C2
受C2支配只有两个元素P2和P3,判断矩阵C{2}{1,2}为
相应逻辑数组C{2}{2,2}为[false true true].
(3) 第3层对第2层第3个元素C3
受C3支配只有两个元素P1和P2,判断矩阵C{2}{1,3}为
相应逻辑数组C{2}{2,3}为[true truefalse].
3. 有了上面分析,层次模型元胞数组表达C已经拟定,调用函数ahp.m即可
C = cell(2,1);%共n+1=3层,故n=2
C{1}{1,1} = [1 1/5 1/3;5 1 3;3 1/3 1];%第2层(C层)关于第1层(目的层A)判断矩阵
C{1}{2,1} = [true truetrue];%相应逻辑数组
C{2}{1,1} = [1 1/3;3 1];%第3层(P层)关于第2层第1元素C1判断矩阵
C{2}{2,1} = [true truefalse];%相应逻辑数组
C{2}{1,2} = [1 1/5;5 1];%第3层(P层)关于第2层第2元素C2判断矩阵
C{2}{2,2} = [false true true];%相应逻辑数组
C{2}{1,3} = [1 2;1/2 1];%第3层(P层)关于第2层第3元素C3判断矩阵
C{2}{2,3} = [true truefalse];%相应逻辑数组
[W,ahpResult]=ahp(C);%调用ahp求解
W %输出总排序权重向量
运营成果:
W = 0.1984 0.2708 0.5308
W就是方案层各个方案所占比重,可见引进技术设备所占比重最大,改进员工福利次之。体当前奖金分派上,即用所有留成利润53.08%引进技术设备,27.08%改进员工福利,19.84%发奖金。
例2假设某人在制定食谱时有三类食品可选:肉、面包、蔬菜。这三类食品所含营养成分及单价如下表所示:
假设该人体重为55kg,每天对各类营养最小需求为
维生素A 7500IU
维生素B2 1.6338mg
热量Q 8548.5kJ
问题是:应如何制定食谱使得在保证营养前提下支出最小?
单纯考虑问题条件,容易建立如下线性规划模型:设选取肉x1,面包x2,蔬菜x3,则有
用Matlab求解线性规划问题函数linprog,可以求出最优解:
f = [0.0275;0.006;0.007];
A = -[0.3527 0.0005 25;0.0021 0.0006 0.002;11.93 11.51 1.04];
b = -[7500;1.6338;8548.5];
options = optimset('LargeScale','off','Simplex','on');
[x,fval,flag] = linprog(f,A,b,[],[],[0;0;0],[infinfinf],[],options)
运营成果:
x = 0 687.5267 610.6420
fval= 8.3997
flag = 1 %表达算法成功
求解出成果是,每天不吃肉,吃面包687.5267g,蔬菜610.642g,最低支出为8.40元。但实际考虑话,这个方案是难以让人接受,只考虑了营养够、价格低,没有考虑到营养均衡(需要吃一定量肉)。
为此,咱们先用层次分析法拟定每天需要肉、面包、蔬菜比重,再重新线性规划。建立如下层次模型:
注意:由于第2层支出因素D2直接支配第4层,需要在第3层补上一种因素“补项B”(仍当作“支出”看待),它只受D2支配,并且支配D2每个支配因素(第4层肉Me,面包Br,蔬菜Ve)。
有了上面层次构造,再依照偏好建立判断矩阵(固然偏好因人而异):
1. 第2层对第1层
判断矩阵:
逻辑数组:C{1}{2,1}=[true true].
2. 第3层对第2层
(1) 第3层对第2层第1元素D1
判断矩阵:
逻辑数组:C{2}{2,1}=[true truetrue false].
(2) 第3层对第2层第2元素D2
判断矩阵:C{2}{1,2}=[1]
逻辑数组:C{2}{2,2}=[false falsefalseture].
3. 第4层对第3层
(1) 第4层对第3层第1元素A
判断矩阵(用数据直接做比得到):
逻辑数组:C{3}{2,1}=[true true true].
(2) 第4层对第3层第2元素B2
判断矩阵(用数据直接做比得到):
逻辑数组:C{3}{2,2}=[true true true].
(3) 第4层对第3层第3元素Q
判断矩阵(用数据直接做比得到):
逻辑数组:C{3}{2,3}=[true true true].
(4) 第4层对第3层第4元素B
判断矩阵(用单价比倒数,由于单价越高越不重要):
逻辑数组:C{3}{2,4}=[true true true].
4. 有了上面分析,层次模型元胞数组表达C已经拟定,调用函数ahp.m即可
C = cell(3,1);
C{1}{1,1} = [1 1/3;3 1];
C{1}{2,1} = true(2,1);
C{2}{1,1} = [1 1 2;1 1 2;1/2 1/2 1];
C{2}{2,1}=[true truetrue false];
C{2}{1,2}=1;
C{2}{2,2} = [false,false,false,true];
C{3}{1,1} = [1,0.3527/0.0005,0.3527/25;0.0005/0.3527,1,0.0005/25;25/0.3527,25/0.0005,1 ];
C{3}{2,1}=true(3,1);
C{3}{1,2} = [1,0.0021/0.0006,0.0021/0.002;0.0006/0.0021,1,0.0006/0.002;0.002/0.0021,0.002/0.0006,1 ];
C{3}{2,2}=true(3,1);
C{3}{1,3} = [1,11.93/11.51,11.93/1.04;11.51/11.93,1,11.51/1.04;1.04/11.93,1.04/11.51,1 ];
C{3}{2,3}=true(3,1);
C{3}{1,4} = [1,0.006/0.0275,0.007/0.0275;0.0275/0.006,1,0.007/0.006;0.0275/0.007,0.006/0.007,1 ];
C{3}{2,4}=true(3,1);
[W,ahpResult]=ahp(C);
W
运营成果:
W = 0.2376 0.2293 0.5331
该成果表白,按这个人状况,肉、面包、蔬菜比例取0.2376,0.2293,0.5331比较适当。引入参变量k,令x1=0.2376k,x2=0.2293k,x3=0.5331k,将其代入前文线性规划模型,得到
用linprog求解:
f = [0.0116];
A = -[13.4116;0.0017;6.0282];
b = -[7500;1.6338;8548.5];
W = [0.23760.22930.5331];
options = optimset('LargeScale','off','Simplex','on');
[k,fval,flag] = linprog(f,A,b,[],[],[0],[inf],[],options)
x = k*W
运营成果:
k = 1.4181e+03
fval = 16.4498
flag = 1
x = 336.9370 325.1669 755.9811
故k=1418.1,x1=336.94, x2=325.17, x3=755.98. 每天食品支出16.45元。
注:对于不同人可以有不同判断矩阵C{1}{1,1},即营养与支出相对重要限度,例如,修改为[1 1/3;3 1],可以得到x1=188.88,x2=497.82,x3=567.04. 每天食品支出12.14元。
重要参照文献:吴鹏,《Matlab高效编程技巧与应用:25个案例分析》第11章。
展开阅读全文