目录
读取数据
读取准则层判断矩阵
读取方案层的判断矩阵
一致性检验
求解权重值
寻找权重值最高的结果
代码分享及注释
例题:挑选合适的工作,经双方恳谈,已有三个单位表示愿意录用某毕业生。该生根据已有信息从研究课题、发展前途、待遇、同事情况、地理位置、单位名气六个方面衡量三个工作单位。
层次结构模型为
将准则层和方案层的判断矩阵数据存入txt3.txt文本文档,具体数据如下,其中前6行为准则层判断矩阵A-B,剩余数据每三行分别对应方案层判断矩阵B1-C、B2-C、B3-C、B4-C、B5-C、B6-C。
注:txt3.txt最好放在项目文件夹下,以便后续的读取
1 1 1 4 1 1/2
1 1 2 4 1 1/2
1 1/2 1 5 3 1/2
1/4 1/4 1/5 1 1/3 1/3
1 1 1/3 3 1 1
2 2 2 3 3 1
1 1/4 1/2
4 1 3
2 1/3 1
1 1/4 1/5
4 1 1/2
5 2 1
1 3 1/3
1/3 1 1/7
3 7 1
1 1/3 5
3 1 7
1/5 1/7 1
1 1 7
1 1 7
1/7 1/7 1
1 7 9
1/7 1 1
1/9 1 1
读取数据
fopen()函数可以打开文件或者获得有关打开文件的信息
fid=fopen('txt3.txt', 'r');
读取准则层判断矩阵
fgetl()函数读取文件中的行,并删除换行符,返回值为字符串
str2num()函数将字符串转化成数据
可以看出,str2num(fgetl(fid))语句即读取文件中的第一行数据,添加到a矩阵中,所以a矩阵即为准则层判断矩阵
n1=6; n2=3;a=[];fgetl(fid)for i=1:n1 tmp=str2num(fgetl(fid)); a=[a;tmp];end
读取方案层的判断矩阵
int2str( )函数将字符串转化成整数形式
strcat()函数将字符串进行拼接
eval()函数的功能就是将括号内的字符串视为语句并运行
str1得到的结果为b1=[], b2=[],以此类推
str2得到的结果为b1=[b1,tmp], b2=[b2, tmp],以此类推
tmp=str2num(fgetl(fid))为读取方案层的判断矩阵
for i=1:n1 str1=strcat('b',int2str(i),'=[];'); str2=strcat('b',int2str(i),'=[b',int2str(i),';tmp];'); eval(str1);for j=1:n2 tmp=str2num(fgetl(fid)); eval(str2);endend
一致性检验
[x,y]=eig()函数求解矩阵的特征值,构成对角矩阵y,x为特征向量
diag()函数求解矩阵的对角线元素,组成列向量
max()求解矩阵的最大特征值
find(diag(y)==lamda); % find函数寻找最大特征值的位置
cr0=(lamda-n1)/(n1-1)/ri(n1) %一致性检验公式
ri=[0,0,0.58,0.90,1.12,1.24,1.32,1.41,1.45];[x,y]=eig(a);tmp=diag(y);lamda=max(diag(y));num=find(diag(y)==lamda); w0=x(:,num)/sum(x(:,num)); cr0=(lamda-n1)/(n1-1)/ri(n1) if cr0<0.10disp('因为CR<0.10,所以该判断矩阵A的一致性可以接受!');elsedisp('注意:CR >= 0.10,因此该判断矩阵A需要进行修改!');end
求解权重值
使用特征值法求解权重
w0=x(:,num)/sum(x(:,num)); % w0为特征值法求权重, A层的6*1个权重值
w1(:,i)=x(:,num)/sum(x(:,num)); % w1中每一列为B层的权重
ts=w1*w0 % 总的权重值
寻找权重值最高的结果
res=find(max(ts)) %找到权重值最高的工作
代码分享及注释
clc, clearfid=fopen('txt3.txt', 'r'); % fopen函数打开文件或获得有关打开文件的信息n1=6; n2=3;a=[];% 前6行为准则层判断矩阵,用a来表示for i=1:n1 tmp=str2num(fgetl(fid)); a=[a;tmp]; % 读准则层判断矩阵end % b1-b6分别为方案层的判断矩阵for i=1:n1 str1=strcat('b',int2str(i),'=[];'); str2=strcat('b',int2str(i),'=[b',int2str(i),';tmp];'); eval(str1); % eval()函数的功能就是将括号内的字符串视为语句并运行for j=1:n2 tmp=str2num(fgetl(fid)); eval(str2); %读方案层的判断矩阵endendri=[0,0,0.58,0.90,1.12,1.24,1.32,1.41,1.45]; %一致性指标[x,y]=eig(a); % eig求判断矩阵的特征值,构成对角阵y,并求a的特征向量构成x的列向量tmp=diag(y); % diag(y)求解y矩阵的对角线元素,构成列向量lamda=max(diag(y)); % max求解矩阵的最大特征值num=find(diag(y)==lamda); % find函数寻找最大特征值的位置w0=x(:,num)/sum(x(:,num)); % w0为特征值法求权重, A层的6*1个权重值cr0=(lamda-n1)/(n1-1)/ri(n1) %一致性检验,cr0 = 0.0996 < 0.1,该判断矩阵a的一致性是可以接受的if cr0<0.10disp('因为CR<0.10,所以该判断矩阵A的一致性可以接受!');elsedisp('注意:CR >= 0.10,因此该判断矩阵A需要进行修改!');end% 对方案层的6个判断矩阵进行一致性检验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)); % w1中每一列为B层的权重cr1(i)=(lamda-n2)/(n2-1)/ri(n2); endcr=cr1*w0 % 层次总排序一致性比例if cr<0.10disp('因为CR<0.10,所以该判断矩阵A的一致性可以接受!');elsedisp('注意:CR >= 0.10,因此该判断矩阵A需要进行修改!');endw1 %3*6w0 %6*1ts=w1*w0 % 总的权重值res=find(max(ts)) %找到权重值最高的工作
如果觉得《层次分析法2:Matlab实现层次分析法的代码详解》对你有帮助,请点赞、收藏,并留下你的观点哦!