层次分析法
对一些较为复杂、较为模糊的问题做出决策的简易方法,适用于难于完全定量分析的问题。
基本原理和步骤
- 建立递阶层次结构模型;
- 构造出各层次中的所有判断矩阵
- 层次单排序及一致性检验;
-
一、递阶层结构的建立与特点
目标层:分析问题的预定目标或理想结果
中间层(准则层):实现目标涉及的中间环节,包括所需考虑的准则、子准则
最底层(措施层、方案层):为实现目标可供选择选择的各种措施
二、构造判断矩阵:
三、层次单排序及一次性检验
定义:判断矩阵A对应于最大特征值的特征向量W,经归一化后即为同一层次相应因素对于上一层次某因素相对重要性的排序权值
完全一致矩阵A的元素应该满足:,该矩阵为一致矩阵检验矩阵A是否严重非一致
定理1 2 3
由定理3得,可从是否等于n来判断矩阵A是否为一致矩阵,比n大得越多,A的非一致性程度也就越严重一次性检验步骤:
计算一致性指标CI:
查找相应的平均随机一致性指标RI,对n=1,2…
![image.png](https://cdn.nlark.com/yuque/0/2021/png/12513000/1611976484992-e75692e7-eabe-44b8-ae00-d17efcdd2bc3.png#align=left&display=inline&height=75&margin=%5Bobject%20Object%5D&name=image.png&originHeight=149&originWidth=1244&size=34548&status=done&style=none&width=622)
计算一致性比例CR: ,CR<0.1时,认为判断矩阵的一致性时可以接受的,否则应该适当修正
四、层次总排序及一致性检验
层次单排序算的是一组元素对其上一层中某元素的权重向量,最终要得到各元素,总排序权重要自上而下地将单准则下的权重进行合成
一致性检验:
五、应用
clc,clear
fid = fopen('txt.txt','r'); %r是读出命令
n1 = 6;
n2 = 3;
a = [];
for i = 1:n1
tmp = str2num(fgetl(fid)); %fgetl读一行并丢弃换行符
a = [a;tmp]; %读准则层判断矩阵
end
for i = 1:n1
str1 =char(['b',int2str(i),'=[];']);
str2 =char(['b',int2str(i),'=[b',int2str(i),';tmp];']);
eval(str1); %eval函数的功能是将字符串转换为matlab可执行语句。通俗而言,比如
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); %[V,D]=eig(A):求矩阵A的全部特征值,构成对角阵D,并求A的特征向量构成V的列向量
lamda=max(diag(y)); %diag(y)返回列向量,每个元素为对角线的值
num=find(diag(y)==lamda);
w0=x(:,num)/sum(x(:,num));
cr0=(lamda-n1)/(n1-1)/ri(n1)
for i=i: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
选择工作一