预备知识点
层次分析法AHP(Analytic Hierarchy Process)根据问题的性质和要达到的总目标,将问题分解为不同的组成因素,并按照因素间的相互关联影响以及隶属关系将因素按不同的层次聚集组合,形成一个多层次的分析结构模型,从而最终使问题归结为最低层(供决策的方案、措施等)相对于最高层(总目标)的相对重要权值的确定或相对优劣次序的排定。
将评价问题分为三个层次,目标层、准则层和方案层。通过判断矩阵得到准则层的各评价因素的比重,同理得到方案层的每个方案的各评价因素的比重。评价比重和方案比重相乘后得到每个方案的评分。
运用层次分析法构造系统模型时,大体可以分为以下四个步骤:
1.建立层次结构模型;
2.构造判断(成对比较)矩阵;
3.层次单排序及其一致性检验;
4.层次总排序及其一致性检验;
最高层(目标层):决策的目的、要解决的问题;
中间层(准则层或指标层):考虑的因素、决策的准则;
最低层(方案层):决策时的备选方案;
构造判断(成对比较)矩阵时,为了避免直接确定各层次元素之间的比重,采用一致矩阵法,即两两对比确定相对重要性。
得到最终判断矩阵如下:
计算分为三种方法:算数平均数法、几何平均数法和特征值法(常用)
计算得到的特征向量可以作为判断矩阵的权重向量。一致矩阵的特征向量就是任意列向量,简化后的一致性较好的判断矩阵的特征向量求法是可以取列向量的算数平均。
根据最大特征值求出特征向量
计算得到矩阵的特征值和特征向量,通过特征值计算一致性指标
当矩阵为一致矩阵时,特征值n最小,矩阵越不一致,最大特征值与n相差越大,通过差值判断一致程度。
为了衡量CI的大小,引入随机一致性指标RI
随机一致性指标可以通过查表获取,也可以通过matlab进行计算
最终得到
为什么要构造CI以及为什么要以0.1为划分依据?这是作者通过多次蒙特卡洛模拟得到的最佳的方案。
先确定判断矩阵;然后用以下程序就好了:
%层次分析法的matlab程序 %%%%diertimoxingyi
clc,clear
disp('输入判断矩阵')% 在屏幕显示这句话
A=input('A=')% 从屏幕接收判断矩阵
[n,n]=size(A)% 计算A的维度,这里是方阵,这么写不太好
x=ones(n,100)% x为n行100列全1的矩阵
y=ones(n,100)% y同x
m=zeros(1,100)% m为1行100列全0的向量
m(1)=max(x(:,1))% x第一列中最大的值赋给m的第一个分量
y(:,1)=x(:,1)% x的第一列赋予y的第一列
x(:,2)=A*y(:,1)% x的第二列为矩阵A*y(:,1)
m(2)=max(x(:,2))% x第二列中最大的值赋给m的第二个分量
y(:,2)=x(:,2)/m(2)% x的第二列除以m(2)后赋给y的第二列
p=0.0001i=2k=abs(m(2)-m(1))% 初始化p,i,k为m(2)-m(1)的绝对值
while k>p% 当k>p是执行循环体
i=i+1% i自加1
x(:,i)=A*y(:,i-1)% x的第i列等于A*y的第i-1列
m(i)=max(x(:,i))% m的第i个分量等于x第i列中最大的值
y(:,i)=x(:,i)/m(i)% y的第i列等于x的第i列除以m的第i个分量
k=abs(m(i)-m(i-1))% k等于m(i)-m(i-1)的绝对值
end
a=sum(y(:,i))% y的第i列的和赋予a
w=y(:,i)/a% y的第i列除以a
t=m(i)% m的第i个分量赋给t
disp('权向量:')disp(w)% 显示权向量w
disp('最大特征值:')disp(t)% 显示最大特征值t
%以下是一致性检验
CI=(t-n)/(n-1)% t-维度再除以维度-1的值赋给CI
RI=[0 0 0.52 0.89 1.12 1.26 1.36 1.41 1.46 1.49 1.52 1.54 1.56 1.58 1.59]% 计算的标准
CR=CI/RI(n)% 计算一致性
if CR<0.10
disp('此矩阵的一致性可以接受!')
disp('CI=')disp(CI)
disp('CR=')disp(CR)
else
disp('此矩阵的一致性不可以接受!')
end
我这里有一个通用的求解程序。% 层次分析法程序
function [w,ahpr]=ahp(c)% c为元胞矩阵,输出向量w即为最终排名
RI=[0 0 0.58 0.90 1.12 1.24 1.32 1.41 1.45 1.49 1.51]% 一致性指标
n=length(c)ahpr=cell(n,1)
for k=1:n
m_k=size(c{k},2)ahpr{k}=cell(m_k,1)
for kk=1:m_k
[V,D]=eig(c{k}{1,kk})
[maxD,ind]=max(diag(D))
ahpr{k}{1,kk}=zeros(length(c{k}{2,kk}),1)
ahpr{k}{1,kk}(c{k}{2,kk})=V(:,ind)/sum(V(:,ind))
ahpr{k}{2,kk}=maxD
nn=size(c{k}{1,kk},1)ahpr{k}{3,kk}=(maxD-nn)/(nn-1)/RI(nn)
end
end
w=ahpr{1}{1,1}
for k=2:n
g=ahpr{k}{1,1}
w=cat(2,ahpr{k}{1,:})*w
end
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)