层次分析法是对一些较为复杂而且模糊的问题做出分析的一种简易方法,它适用于解决难以完全定量的问题。
该方法在数学建模中运用较多,但是主观因素很大,特别是构造成对比较矩阵的时候,必须要有完全合适正确的理由,不然矩阵构造错误,那么之后的问题结果也会错误。此方法不能完全用来解决数学建模问题,也就是说,一个复杂的数学建模问题不能单靠它来解决,而是还要结合其他的分析方法。
层次分析法一般分为三层:方案层 ,准则层 ,和目标层。
方案层:就是最开始可供选择的方案,最后的结果也是根据权值来在方案里面进行选取。
准则层:评定方案的因素和规则。
目标层:最终选取的结果。
如何构造成对比较矩阵是层次分析法的核心环节。
根据成对比较标度表来构造矩阵,成对比较标度表如下:
如何构造举一个具体的例子。
有一个毕业生为挑选合适的工作。经双方恳谈,已有三个单位表示愿意录用某毕业生,该毕业生考虑的因素有6个,研究课题、发展前途、待遇、同事情况、地理位置和单位名气。
那么这六个因素就是准则层,三个单位就是方案层,最后要求的就是应该去哪个单位。
1)准则层判断矩阵(主观性)
(对于这个矩阵,B1对于B2来说同样重要,B1对B4很重要,以此类推...)
2)方案层判断矩阵(主观性)
计算的 Matlab 程序如下:
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
-173-
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
ps:一致性检测是指 比如B1:B2 = 1 B2:B3 = 2 那么按理来说B1:B3 = 2 但是有时候根据成对矩阵表来看并不是这个数值,会有偏差,那么一致性检测是判断是否在偏差范围内,如果在范围内,那么这个矩阵便是可信的。
方法:
就按照以上的那个例子,在一致性检测成功后,先用代码算出 B1 B2 B3 B4 B5 B6 对目标层Z 的权重 b1 b2 b3 b4 b5 b6
然后算出C1 C2 C3 分别对B1 的权重 C1B1 C2B2 C3B3 分别对B2的权重 C1B2 C2B2 C3B2,以此类推...
那么C1对Z的权重便为
c1 = C1B1 * b1 + C1B2 *b2 + C1B3 *b3 +C1B4 *b4 +C1B5 *b5 +C1B6 *b6
c2 = C2B1 * b1 + C2B2 *b2 + C2B3 *b3 +C2B4 *b4 +C2B5 *b5 +C2B6 *b6
c3 = C3B1 * b1 + C3B2 *b2 + C3B3 *b3 +C3B4 *b4 +C3B5 *b5 +C3B6 *b6
比较c1 c2 c3的权值大小便可选出最优方案。