matlab层次分析法一致性.docx
- 文档编号:7319405
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:15
- 大小:19.34KB
matlab层次分析法一致性.docx
《matlab层次分析法一致性.docx》由会员分享,可在线阅读,更多相关《matlab层次分析法一致性.docx(15页珍藏版)》请在冰豆网上搜索。
matlab层次分析法一致性
用了两周左右的时间,我编写了网络分析法(TheAnalyticNetworkProcess,ANP)的Matlab源代码(将在下面给出),主要针对王莲芬老师的《网络分析法(ANP)的理论与算法》中的内部依存的递阶层次结构,而且假设N=4的情形,所以如果要使用该程序,需要作修改,如果你不想改,我可以帮忙!
ANP是美国匹兹堡大学的T.L.Saaty教授于1996年提出了一种适应非独立的递阶层次结构的决策方法,它是在网络分析法(AHP)基础上发展而形成的一种新的实用决策方法。
其关键步骤有以下几个:
1确定因素,并建立网络层和控制层模型。
2创建比较矩阵。
3按照指标类型针对每列进行规范化。
4求出每个比较矩阵的最大特征值和对应的特征向量。
5一致性检验。
如果不满足,则调整相应的比较矩阵中的元素。
6将各个特征向量单位化(归一化),组成判断矩阵。
7将控制层的判断矩阵和网络层的判断矩阵相乘,得到加权超矩阵。
8将加权超矩阵单位化(归一化),求其K次幂收敛时的矩阵。
其中第j列就是网络层中各元素对于元素j的极限排序向量。
%第一个函数
%矩阵归一化(单位化)
%Unitize函数开始
functionMatrix_Unitize=Unitize(Matrix)
[line,colume]=size(Matrix);
forj=1:
1:
colume
fa=0;
fori=1:
1:
line
fa=fa+Matrix(i,j);
end
sum(j)=fa;
end
forj=1:
1:
colume
fori=1:
1:
line
Matrix_Unitize(i,j)=Matrix(i,j)/sum(j);
end
end
%Unitize函数结束
%第二个函数
%求一个方阵的最大特征值及其对应的特征向量
%MAX_EigenV函数开始
function[Max_Eigenvector,Max_Eigenvalue]=Max_EigenV(Matrix)
[line,colume]=size(Matrix);
ifline~=colume
message='矩阵不是方阵,无法求解最大特征值及其对应的特征向量';
disp(message);
return;
end
[EigenvectorEigenvalue]=eigs(Matrix);
Max_Eigenvalue=Eigenvalue
(1);
fori=1:
1:
line
Max_Eigenvector(i)=Eigenvector(i,1);
end
%MAX_EigenV函数结束
%第三个函数(此函数我没有用)
%根据给定的指标类型对矩阵的列进行规范化
%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:
n
fori=1:
1:
m
ifIndexType(j)==1%效益型指标规范化
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);
end
end
end
%Standardize函数结束
%第四个函数
%读取一个格式化文件中所有矩阵,连接成归一化的判断矩阵
%计算最大特征值对应的特征向量,进行一致性检验,构造判断矩阵.
%version2.0
%矩阵文件的(*.txt)格式要求(共4条)
%1空格开头的行,回车行,注释行(见第3条)在读取时都会被忽略.
%
%2每个矩阵要有维数(Dimension)和序号(Sequence),其次序可以颠倒,但是不能缺项,
%且关键字及其取值要各占一行(共4行,中间可以有空格行或空行),但关键字行尾不能有空格.
%
%3竖线"|"是注释标记,要独自占一行,但是不要在有效的矩阵元素行之后加竖线.
%
%4矩阵的元素只能用空格分开,每个元素后都可以跟空格,且空格的数量可以是任意多个.
%但是,需要强调的是,每一行第一个元素的前面不能有空格(参照第1条)!
%JudgementMatrix函数开始
function[judge_matrix_unitize,flag]=JudgementMatrix(fid)
judge_matrix=0;
judge_matrix_unitize=0;
flag=0;%判断矩阵构造成功的标志
LineData=IgnoreLine(fid);%跳到第一行有效的数据
Count=0;%矩阵计数器
Flag1=0;%是否读取矩阵序号的开关
Flag2=0;%是否读取矩阵列数的开关
Flag3=0;%是否读取矩阵行数的开关
Sequence=0;%矩阵的序号
Dimension=0;%矩阵的阶
DCount=0;%同一文件中每个矩阵的阶数下标
LastCount=0;%同一文件中上一个矩阵的阶数下标
while(feof(fid)==0)
ifstrcmp(LineData,'Sequence')
LineData=IgnoreLine(fid);
ifLineData==-1
warning('已经到了文件末尾,无数据可读取!
');
flag=-1;
return;
end
Sequence=str2num(LineData);
Flag1=Flag1+1;
elseifstrcmp(LineData,'Dimension')
LineData=IgnoreLine(fid);
ifLineData==-1
warning('已经到了文件末尾,无数据可读取!
');
flag=-1;
return;
end
DCount=DCount+1;
Dimension(DCount)=str2num(LineData);
LastCount=DCount-1;
ifLastCount>0&&Dimension(DCount)~=Dimension(LastCount)
flag=-1;
warning('矩阵的维数不等,比较矩阵弄错了吧!
');
end
Flag2=Flag2+1;
end
if(Flag1>1||Flag2>1)
ifFlag1>1
c=num2str(Sequence);
c=strcat('第',c);
message=strcat(c,'个矩阵的上一个矩阵没有设置维数关键字"Dimension"!
');
flag=-1;
warning(message);
return;
elseifFlag2>1
c=num2str(Sequence);
c=strcat('第',c);
message=strcat(c,'个矩阵的上一个矩阵没有设置序号关键字"Sequence"!
');
warning(message);
flag=-1;
return;
end
elseif(Flag1==0&&Flag2==0)
warning('没有发现矩阵的序号或行数或列数关键字!
请参考文件格式要求!
');
flag=-1;
return;
elseif(Flag1==1&&Flag2==1)
Matrix=0;
%为了读分数矩阵,逐行读取再变为数值类型
fori=1:
1:
Dimension(DCount)
LineData=IgnoreLine(fid);
ifLineData==-1
warning('已经到了文件末尾,无数据可读取!
');
flag=-1;
judge_matrix_unitize=Unitize(Matrix);
return;
end
DoubleLine=str2num(LineData);
[line_DoubleLine,colume_DoubleLine]=size(DoubleLine);
ifcolume_DoubleLine~=Dimension(DCount)
flag=-1;
end
forj=1:
1:
colume_DoubleLine
Matrix(i,j)=DoubleLine(j);
end
end
ifflag==-1
judge_matrix_unitize=Unitize(Matrix);
return;
end
ifisreal(Matrix)
Count=Count+1;
ifSequence~=Count
c=num2str(Sequence);
c=strcat('文件中编号为',c);
message=strcat(c,'的矩阵的序号没有按照顺序排列!
');
warning(message);
end
%最大特征值及其对应的特征向量
[vector_lmd_max,lmd_max(Count)]=MaxEV(Matrix);
forj=1:
1:
Dimension(DCount)
judge_matrix(Count,j)=vector_lmd_max(j);
end
%一致性检验
CI(Count)=0;%一致性指标
%当矩阵的阶数n<3时,判断矩阵永远具有完全一致性。
ifDimension>=3
%一致性指标
CI(Count)=(lmd_max(Count)-Dimension(DCount))/(Dimension(DCount)-1);
ifCI(Count)>=0.1
c=num2str(Sequence);
c=strcat('第',c);
message=strcat(c,'个矩阵的一致性指标CI不满足条件,建议调整该矩阵元素!
');
warning(message);
flag=-1;
break;
end
end
else
c=num2str(Sequence);
c=strcat('第',c);
message=strcat(c,'个矩阵不是实矩阵吧?
');
flag=-1;
warning(message);
return;
end
Matrix=0;%矩阵清零
Flag1=0;%是否读取矩阵的开关复位
Flag2=0;%是否读取矩阵的开关复位
end
LineData=IgnoreLine(fid);
end
ifflag==-1||Dimension(DCount)~=Count
flag=-1;
disp('未进行归一化的特征向量');
judge_matrix=judge_matrix'
%特征向量归一化
disp('归一化的特征向量');
judge_matrix_unitize=Unitize(judge_matrix)
else
flag=1;
judge_matrix=judge_matrix';
%判断矩阵归一化
disp('归一化后的特征向量构成的判断矩阵');
judge_matrix_unitize=Unitize(judge_matrix)
end
%JudgementMatrix函数结束
%第五个函数
%忽略一些特定的行
%IgnoreLine函数开始
functiona=IgnoreLine(fid)
a=fgetl(fid);
%忽略'|'(竖线),''(空格)开头的行,以及''(回车)行
whileisempty(a)||strcmp(a
(1),'|')||strcmp(a
(1),'')
a=fgetl(fid);
end
%IgnoreLine函数结束
%第六个函数
%按如下图所示的方式连接各个矩阵,构造超矩阵
%BB
%DBDD
%ADAA
%CACC
%version1.0
%SuperMatrix函数开始
functionsuper=SuperMatrix(BB,DD,AA,CC,DB,AD,CA)
[lineBB,columeBB]=size(BB);
[lineDD,columeDD]=size(DD);
[lineAA,columeAA]=size(AA);
[lineCC,columeCC]=size(CC);
[lineDB,columeDB]=size(DB);
[lineAD,columeAD]=size(AD);
[lineCA,columeCA]=size(CA);
a=vertcat(BB,DB);
b=zeros(lineBB,columeDD);%补零
c=vertcat(b,DD);
d=horzcat(a,c);%方阵
e=zeros(lineAD,columeBB);%补零
f=horzcat(e,AD);
g=vertcat(d,f);
[lined,columed]=size(d);
h=zeros(lined,columeAA);%补零
i=vertcat(h,AA);
j=horzcat(g,i);%方阵
k=zeros(lineCA,columed);%补零
l=horzcat(k,CA);
m=vertcat(j,l);
[linej,columej]=size(j);
n=zeros(linej,columeCC);%补零
p=vertcat(n,CC);
super=horzcat(m,p);%超矩阵
%SuperMatrix函数结束
%主函数ANP开始
functionANP
clc;
%读取多个数据文件中的比较矩阵,形成归一化的判断矩阵
disp('————从文件AA.txt中构造判断矩阵————');
[fid_AA,message]=fopen('AA.txt','r');
iffid_AA==-1
error('!
文件打开失败!
');
end
[Waa,flag]=JudgementMatrix(fid_AA);
ifflag==-1
warning('文件中的比较矩阵有问题,!
!
!
构造失败!
!
!
');
else
disp('!
!
!
构造成功!
!
!
');
end
fclose(fid_AA);
disp('————从文件BB.txt中构造判断矩阵————');
[fid_BB,message]=fopen('BB.txt','r');
iffid_BB==-1
error('文件打开失败!
');
end
[Wbb,flag]=JudgementMatrix(fid_BB);
ifflag==-1
warning('文件中的比较矩阵有问题,!
!
!
构造失败!
!
!
');
else
disp('!
!
!
构造成功!
!
!
');
end
fclose(fid_BB);
disp('————从文件CC.txt中构造判断矩阵————');
[fid_CC,message]=fopen('CC.txt','r');
iffid_CC==-1
error('文件打开失败!
');
end
[Wcc,flag]=JudgementMatrix(fid_CC);
ifflag==-1
warning('文件中的比较矩阵有问题,!
!
!
构造失败!
!
!
');
else
disp('!
!
!
构造成功!
!
!
');
end
fclose(fid_CC);
disp('————从文件DD.txt中构造判断矩阵————');
[fid_DD,message]=fopen('DD.txt','r');
iffid_DD==-1
error('文件打开失败!
');
end
[Wdd,flag]=JudgementMatrix(fid_DD);
ifflag==-1
warning('文件中的比较矩阵有问题,!
!
!
构造失败!
!
!
');
else
disp('!
!
!
构造成功!
!
!
');
end
fclose(fid_DD);
%由于WdbWad不是方阵,此处对WdbWad的一组原始数据进行单位化
disp('————从文件DB.txt中构造判断矩阵————');
[fid_DB,message]=fopen('DB.txt','r');
iffid_DB==-1
error('文件打开失败!
');
end
[Wdb,flag]=JudgementMatrix(fid_DB);
fclose(fid_DB);
disp('————从文件AD.txt中构造判断矩阵————');
[fid_AD,message]=fopen('AD.txt','r');
iffid_AD==-1
error('文件打开失败!
');
end
[Wad,flag]=JudgementMatrix(fid_AD);
fclose(fid_AD);
disp('————从文件CA.txt中构造判断矩阵————');
[fid_CA,message]=fopen('CA.txt','r');
iffid_CA==-1
error('文件打开失败!
');
end
[Wca,flag]=JudgementMatrix(fid_CA);
ifflag==-1
warning('文件中的比较矩阵有问题,!
!
!
构造失败!
!
!
');
else
disp('!
!
!
构造成功!
!
!
');
end
fclose(fid_CA);
%加权矩阵
Wzz=[0.6429000
0.35710.595800
00.40420.52230
000.47771
];
%%注意:
矩阵Wzz也可通过读取文件ZZ.txt获得
%%可以用下面注释掉的代码代替上面的矩阵Wzz
%disp('————从文件ZZ.txt中构造判断矩阵————');
%[fid_ZZ,message]=fopen('ZZ.txt','r');
%iffid_ZZ==-1
%error('文件打开失败!
');
%end
%[Wzz,flag]=JudgementMatrix(fid_ZZ);
%ifflag==-1
%warning('!
!
!
文件中的比较矩阵有问题,构造失败!
!
!
');
%else
%disp('!
!
!
构造成功!
!
!
');
%end
%fclose(fid_ZZ);
%按照如下形式组合判断矩阵
%W=[
%Wbb000
%WdbWdd00
%0WadWaa0
%00WcaWcc
%];
%加权超矩阵的各个元素
Wbb=Wzz(1,1)*Wbb;
Wdd=Wzz(2,2)*Wdd;
Waa=Wzz(3,3)*Waa;
Wcc=Wzz(4,4)*Wcc;
Wdb=Wzz(2,1)*Wdb;
Wad=Wzz(3,2)*Wad;
Wca=Wzz(4,3)*Wca;
%disp('————加权超矩阵!
————');
%组成超矩阵
weighted_supermatrix=SuperMatrix(Wbb,Wdd,Waa,Wcc,Wdb,Wad,Wca);
%计算加权超矩阵收敛时的无穷次幂
[Wcc_infpower,flag]=PowerConvergence(Wcc);
ifflag==1
D4=Wcc_infpower;
[lineAcolumeA]=size(Waa);
IA=eye(lineA,columeA);
D3=D4*Wca/(IA-Waa);
[lineDcolumeD]=size(Wdd);
ID=eye(lineD,columeD);
D2=D3*Wad/(ID-Wdd);
[lineBcolumeB]=size(Wbb);
IB=eye(lineB,columeB);
D1=D2*Wdb/(IB-Wbb);
J=zeros(37,37);
disp('————加权超矩阵的无穷次幂的解————');
weighted_supermatrix_infpower=[J(1:
25,1:
37);D1D2D3D4]
elseifflag==0
message='加权超矩阵不收敛,奇数次幂不存在!
';
disp(message);
return;
end
disp('————将加权超矩阵的无穷次幂的解写入WW.txt文件中————');
fid_WW=fopen('WW.txt','w+');
iffid_WW==-1
error('文件打开失败!
');
end
fori=1:
1:
37
forj=1:
1:
37
fprintf(fid_WW,'%.4f',weighted_supermatrix_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- matlab 层次 分析 一致性