层次分析法改进代码

题目:
在这里插入图片描述

在这里插入图片描述
代码:

% 鏂规牴娉曡绠椢�
function [r,W] = Q(A)
d = size(A);
n = d(1);
if n == 5
    W = [1;1;1;1;1];% 鍒濆鍖栨潈閲嶇煩闃�
    S = [0 0 0 0 0];
else 
    W = [1;1;1];% 鍒濆鍖栨潈閲嶇煩闃�
    S = [0 0 0];
end

for i = 1:n
    for j = 1:n
        W(i) = W(i)*A(i,j);
    end
    W(i) = W(i)^(1/n);% 鏂规牴娉曟眰鍑烘潈閲�
end
s1 = sum(W);
W = W./s1;% 鏉冮噸褰掍竴鍖�
% disp(W)
m = 0;
for i = 1:n
    S(i) = (A(i,:)*W)/W(i);
    m = m + S(i);
end
% disp(m)
r = m/n;
% 此代码的内容是对矩阵进行一致性检验,并利用算术平均法和几何平均法求出权重,以及最大特征根和CI,RI的值。
A=[1 1/4 4 3 3;
    4 1 6 5 5;
    1/4 1/6 1 1/2 1/3;
    1/3 1/5 2 1 1;
    1/3 1/5 3 1 1];
%disp('请输入准则层判断矩阵A(n阶)');
%A=input('A=');

% A=[1 1/4 1/8;
%     4 1 1/3;
%     8 3 1];
% 
% A=[1 4 6;
%    1/4 1 3;
%    1/6 1/3 1];
% 
% A=[1 3 4;
%    1/3 1 1;
%    1/4 1 1];
% 
% A=[1 1 1/4;
%    1 1 1/4;
%    4 4 1];

% A=[1 5 7;
%    1/5 1 1/5;
%    1/7 1/5 1];


[n,n]=size(A);

Sum_A=sum(A);
SUM_A=repmat(Sum_A,n,1);
Stand_A=A./SUM_A;
disp('算术平均法求权重的结果为:')
disp(sum(Stand_A,2)./n);

Prduct_A=prod(A,2);
Prduct_n_A=Prduct_A.^(1/n);
disp('几何平均法求权重的结果为:')
disp(Prduct_n_A./sum(Prduct_n_A));


[V,D]=eig(A);%求得特征向量和特征值
            %求出最大特征值和它所对应的特征向量
tempNum=D(1,1);
pos=1;
for h=1:n
    if D(h,h)>tempNum
        tempNum=D(h,h);
        pos=h;
    end
end    
w=abs(V(:,pos));
w=w/sum(w);
t=D(pos,pos);
disp('准则层特征向量w=');disp(w);disp('准则层最大特征根t=');disp(t);
         %以下是一致性检验
CI=(t-n)/(n-1);RI=[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 1.60 1.61 1.615 1.62 1.63];
CR=CI/RI(n);
if CR<0.10
    disp('此矩阵的一致性可以接受!');
    disp('CI=');disp(CI);
    disp('CR=');disp(CR);
else disp('此矩阵的一致性验证失败,请重新进行评分!');
end



% 改进的AHP法
%由于A的一致性检验不通过,因此通过此改进的AHP法:求出和A的对数距离最短的一致矩阵A*,并且A*的最大特征根就近似为A的最大特征
%A为一致性检验不通过的矩阵
A=[1   5   7;
   1/5 1   5;
   1/7 1/5 1];
k = size(A);%使用size函数求矩阵每个维度的长度
n = k(1);%n求出的是矩阵的行数,但这里矩阵的行数和列数都是相等的

% 使用循环对矩阵A的每一个元素都取对数:
for i=1:n
    for j = 1:n
        B(i,j) = log10(A(i,j));%B=lg(A)
    end
end
disp('B矩阵为:')
disp(B)


for i = 1:n
    for j = 1:n
        t = 0;
        for k = 1:n
             t = t + B(i,k) - B(j,k);
        end
        C(i,j) = t/n;%CB的最优传递阵
    end
end
disp('C矩阵为:')
disp(C)

for i=1:n
    for j = 1:n
        A(i,j) = 10^(C(i,j));%A*=10^C
    end
end
disp('和A对数距离最短的一致矩阵A*为:')
disp(A)
disp('最大特征根:')
[r,~] = Q(A);
disp(r)
CI = (r - n)/(n-1);
disp('一致性指标CI:')
disp(CI)
RI=[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 1.60 1.61 1.615 1.62 1.63];
disp('平均随机一致性指标RI:')
disp(RI(n))
CR = CI/RI(n);
disp('一致性比例CR:')
disp(CR)
if CR < 0.1
    disp('一致性检验通过')
end



B5矩阵一致性检验不一致,因此使用B5*当做一致性矩阵代入计算:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

温欣2030

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值