失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 层次分析法2:Matlab实现层次分析法的代码详解

层次分析法2:Matlab实现层次分析法的代码详解

时间:2022-01-31 09:19:55

相关推荐

层次分析法2:Matlab实现层次分析法的代码详解

目录

读取数据

读取准则层判断矩阵

读取方案层的判断矩阵

一致性检验

求解权重值

寻找权重值最高的结果

代码分享及注释

例题:挑选合适的工作,经双方恳谈,已有三个单位表示愿意录用某毕业生。该生根据已有信息从研究课题、发展前途、待遇、同事情况、地理位置、单位名气六个方面衡量三个工作单位。

层次结构模型为

将准则层和方案层的判断矩阵数据存入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实现层次分析法的代码详解》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。