资源描述:
《matlab-层次分析法一致性》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、用了两周左右的时间,我编写了网络分析法(TheAnalyticNetworkProcess,ANP)的Matlab源代码(将在下面给出),主要针对王莲芬老师的《网络分析法(ANP)的理论与算法》中的内部依存的递阶层次结构,而且假设N=4的情形,所以如果要使用该程序,需要作修改,如果你不想改,我可以帮忙!ANP是美国匹兹堡大学的T.L.Saaty教授于1996年提出了一种适应非独立的递阶层次结构的决策方法,它是在网络分析法(AHP)基础上发展而形成的一种新的实用决策方法。其关键步骤有以下几个:1确定因素,并建立网络层和控制层模
2、型。2创建比较矩阵。3按照指标类型针对每列进行规范化。4求出每个比较矩阵的最大特征值和对应的特征向量。5一致性检验。如果不满足,则调整相应的比较矩阵中的元素。6将各个特征向量单位化(归一化),组成判断矩阵。7将控制层的判断矩阵和网络层的判断矩阵相乘,得到加权超矩阵。8将加权超矩阵单位化(归一化),求其K次幂收敛时的矩阵。其中第j列就是网络层中各元素对于元素j的极限排序向量。%第一个函数%矩阵归一化(单位化)%Unitize函数开始functionMatrix_Unitize=Unitize(Matrix)[line,colu
3、me]=size(Matrix);forj=1:1:columefa=0;fori=1:1:linefa=fa+Matrix(i,j);endsum(j)=fa;endforj=1:1:columefori=1:1:lineMatrix_Unitize(i,j)=Matrix(i,j)/sum(j);endend%Unitize函数结束%第二个函数%求一个方阵的最大特征值及其对应的特征向量%MAX_EigenV函数开始function[Max_Eigenvector,Max_Eigenvalue]=Max_EigenV(Ma
4、trix)[line,colume]=size(Matrix);ifline~=columemessage='矩阵不是方阵,无法求解最大特征值及其对应的特征向量';disp(message);return;end[EigenvectorEigenvalue]=eigs(Matrix);Max_Eigenvalue=Eigenvalue(1);fori=1:1:lineMax_Eigenvector(i)=Eigenvector(i,1);end%MAX_EigenV函数结束%第三个函数(此函数我没有用)%根据给定的指标类型对
5、矩阵的列进行规范化%Standardize函数开始functionMatrix_Standardize=Standardize(Matrix,IndexType)%a是需要规范化的矩阵%IndexType是该矩阵各列的指标类型数组%IndexType(j)=1a的第j列是效益型指标%IndexType(j)=0a的第j列是成本型指标[mn]=size(Matrix);MAX=max(Matrix);MIN=min(Matrix);d=MAX-MIN;forj=1:1:nfori=1:1:mifIndexType(j)==1%
6、效益型指标规范化Matrix_Standardize(i,j)=(Matrix(i,j)-MIN(j))/d(j);elseifIndexType(j)==0%成本型指标规范化Matrix_Standardize(i,j)=(MAX(j)-Matrix(i,j))/d(j);endendend%Standardize函数结束%第四个函数%读取一个格式化文件中所有矩阵,连接成归一化的判断矩阵%计算最大特征值对应的特征向量,进行一致性检验,构造判断矩阵.%version2.0%矩阵文件的(*.txt)格式要求(共4条)%1空格开
7、头的行,回车行,注释行(见第3条)在读取时都会被忽略.%%2每个矩阵要有维数(Dimension)和序号(Sequence),其次序可以颠倒,但是不能缺项,%且关键字及其取值要各占一行(共4行,中间可以有空格行或空行),但关键字行尾不能有空格.%%3竖线"
8、"是注释标记,要独自占一行,但是不要在有效的矩阵元素行之后加竖线.%%4矩阵的元素只能用空格分开,每个元素后都可以跟空格,且空格的数量可以是任意多个.%但是,需要强调的是,每一行第一个元素的前面不能有空格(参照第1条)!%JudgementMatrix函数开始functi
9、on[judge_matrix_unitize,flag]=JudgementMatrix(fid)judge_matrix=0;judge_matrix_unitize=0;flag=0;%判断矩阵构造成功的标志LineData=IgnoreLine(fid);%跳到第一行有效的数据Co