主函数部分
A=input("请输入准则层矩阵:\n");%A为因素层的成对比较矩阵
yizhi=YiZhiXingJianYan(A)%%判断是否是一致性矩阵,CI存放了每个矩阵的CI值
weight=TeZhengZhiWeight(A)%%求出来准则层各个因素的权重 存放在weight中
[n,l]=size(A);
B=cell(1,n); %用来存储每个因素下的成对比较矩阵
RIAll = [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];%%存放RI
%%下面的for循环为输入比较矩阵 并对每个矩阵进行一致性检验 一共n个因素因此i从1 到 n
for i=1:n
B{i}=input(sprintf("第%d个因素的比较矩阵:\n",i)); %%格式化控制输入变量
fprintf("第%d个因素输入完成\n",i);
if(YiZhiXingJianYan(B{i})==false)
fprintf("第%d个因素的成对比较矩阵未通过一致性检验\n",i); %%如果某个决策未参与某个因素的比较 则除了对角线以外填0
break;
end
end
%%T{i}存放的是每个矩阵的特征列向量
[h,l1]=size(B{1}); %h和l1为 方案层的个数 每个因素的比较矩阵阶数即为方案个数
T=zeros(h,n);%用来存储每个成对比较矩阵的特征向量//T矩阵的每一列对应 每个因素的比较矩阵的特征向量 列数即为因素的个数
%求每个比较矩阵的特征向量
for i=1:n
T(:,i)=TeZhengZhiWeight(B{i})' %TeZhengZhiWeight求出来的行向量需要转置一下
end;
score=zeros(h,1);%%score[i]表示第i个方案的得分 一共有h个方案
for i=1:h
for j=1:n
score(i)=score(i)+T(i,j)*weight(j);
end;
end;
%%进行层次总排序检验
s=0;
for i=1:n %计算方案的得分 h个方案
s=s+QiuCI(B{i})*weight(i);
end
CRALL=s/RIAll(h)
if(CRALL>0.1)
disp("层次总排序检验不成立");
else
disp(score);
end
函数部分
1.验证是正互反矩阵
function logi=Yanzhengzhengfan(A)
%验证是否是正反矩阵
i=0;
j=0;
[n,l]=size(A);%A矩阵的行列数保存在 n l中 用size不是用sizeof
zhengfan=true;
for i=1:n;
for j=1:n;
if A(i,j)*A(j,i)~= 1&& ~(A(i,j)==A(j,i) && A(i,j)==0) %A(i,j)表示矩阵第i行第j列的元素 不等于号与c语言不一样~=
zhengfan=false;
end
end
end;
if ((any(any(A)))) && (zhengfan==true) %A不为全0矩阵
% disp("是正互反矩阵");
logi=true;
else
%disp("不是正互反矩阵");
logi=false;
end
2.一致性检验
function logic=YiZhiXingJianYan(A)
logic=false;
if(Yanzhengzhengfan(A))
RIAll = [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];
[v,d]=eig(A);%v的每一列为特征向量,d为特征值构成的对角矩阵
[n,l]=size(A);
if(rank(A)~=1) %判断矩阵是不是一致性矩阵(1.为正互反矩阵 2.矩阵rank为1),不是的时候才用一致性检验
disp("将进行一致性检验:\n");
CI=(max(max(d))-n)/(n-1);
RI=RIAll(n);
CR=CI/RI;
if(CR<0.1)
%disp("CR<0.10,通过一致性检验");
logic=true;
else
%disp("不通过一致性检验");
logic=false;
end
else
logic=true;
% disp("矩阵为一致性矩阵")
end
end
end
3.特征值法求权重
function weight=TeZhengZhiWeight(A)
%%特征值法求权重
if(YiZhiXingJianYan(A))
[n,l]=size(A);
[v,d]=eig(A); %v的列向量为特征向量 d为特征值构成的对角矩阵
[M,I]=max(max(d)); %M中存放的是d中的最大值元素 I为该元素该元素的行下表
weight=zeros(1,n); %%一行n列的行向量,用于存储权重
for i=1:n
weight(i)=v(i,I)/sum(v(:,I));
end
end
end