层次分析法

题目:评价桂林、苏杭、北戴河的景色

列出判断矩阵:
在这里插入图片描述
在这里插入图片描述

目标层先对方案层构建一致性矩阵,方案层再对准则层构建一致性矩阵
1、判断矩阵是否有一致性
一致矩阵:各行各类成倍数关系
第一步:计算一致性指标CI
第二步:查找对应的平均随机一致性指标RI
第三步:计算一致性比例CR

在这里插入图片描述

2、算权重
%方法一:算数平均法求权重
%一、把构成的矩阵归一化处理
A=[1,2,2;1/2,1,2;1/2,1/2,1];
sum_lie = sum(A);%A的列和构成向量组
A1=repmat(sum_lie,3,1);%重复迭代A列和
A_stand=A./A1;%对判断矩阵归一化处理
%二、对归一化矩阵(各列相加)按行求和
A_hang=sum(A_stand,2);
%三、相加后的向量每个元素除以n得到权重向量 
disp(A_hang/3);

clear;
%方法二:几何平均分求权重
%一、把矩阵行各元素相乘
A=[1,2,2;1/2,1,2;1/2,1/2,1];
A_product=prod(A,2);
%二、新向量每一项开n次方
A_1=A_product.^(1/3);
%三、对该列向量归一化得到权重向量
A_stand=A_1/sum(A_1);

clear;
%方法三:特征值法求权重
A=[1,2,2;1/2,1,2;1/2,1/2,1];
[V,D]=eig(A);
%一、求最大特征值及对应的特征向量
max_eig=max(max(D));
%找到D中与最大特征值对应的行和列
[r,c]=find(D==max_eig,1);
%二、对求出特征向量归一化即可得到权重
disp(V(:,c));%取出对应列的特征向量
s=V(:,c)/sum(V(:,c));
!!!注意这里的V是特征向量只有n个,但是会重复放nxn。
优化代码:
%% 注意:在论文写作中,应该先对判断矩阵进行一致性检验,然后再计算权重,因为只有判断矩阵通过了一致性检验,其权重才是有意义的。
%% 在下面的代码中,我们先计算了权重,然后再进行了一致性检验,这是为了顺应计算过程,事实上在逻辑上是说不过去的。
%% 因此大家自己写论文中如果用到了层次分析法,一定要先对判断矩阵进行一致性检验。
%% 而且要说明的是,只有非一致矩阵的判断矩阵才需要进行一致性检验。
%% 如果你的判断矩阵本身就是一个一致矩阵(各行各列成比例),那么就没有必要进行一致性检验。

disp('请输入判断矩阵A')     
A=input('A=');     
ERROR = 0;  
[r,c]=size(A);//不是方阵
if r ~= c  || r <= 1
    ERROR = 1;
end
if ERROR == 0
    [n,n] = size(A);//返回A的行数列数
    if sum(sum(A <= 0)) > 0//A里面所有值必须大于0
        ERROR = 2;
    end
end
if ERROR == 0
    if n > 15
        ERROR = 3;
    end
end
if ERROR == 0
    if sum(sum(A' .* A ~=  ones(n))) > 0  //两个sum对逻辑矩阵全部求和
        ERROR = 4;
    end
end
!!!A' .* A ~=  ones(n)//A的转置和A乘的结果和全1阵比较,返回一个逻辑矩阵
if ERROR == 0
    % % % % % % % % % % % % %方法1: 算术平均法求权重% % % % % % % % % % % % %
    Sum_A = sum(A);
    SUM_A = repmat(Sum_A,n,1);
    Stand_A = A ./ SUM_A;
    disp('算术平均法求权重的结果为:');
    disp(sum(Stand_A,2)./n)
    % % % % % % % % % % % % %方法2: 几何平均法求权重% % % % % % % % % % % % %
    Prduct_A = prod(A,2);
    Prduct_n_A = Prduct_A .^ (1/n);
    disp('几何平均法求权重的结果为:');
    disp(Prduct_n_A ./ sum(Prduct_n_A))
    % % % % % % % % % % % % %方法3: 特征值法求权重% % % % % % % % % % % % %
    [V,D] = eig(A);
    Max_eig = max(max(D));
    [r,c]=find(D == Max_eig , 1);
    disp('特征值法求权重的结果为:');
    disp( V(:,c) ./ sum(V(:,c)) )
    % % % % % % % % % % % % %下面是计算一致性比例CR的环节% % % % % % % % % % % % %
    CI = (Max_eig - n) / (n-1);
    RI=[0 0.00001 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最多支持 n = 15
    % 这里n=2时,一定是一致矩阵,所以CI = 0,我们为了避免分母为0,将这里的第二个元素改为了很接近0的正数
    CR=CI/RI(n);
    disp('一致性指标CI=');disp(CI);
    disp('一致性比例CR=');disp(CR);
    if CR<0.10
        disp('因为CR<0.10,所以该判断矩阵A的一致性可以接受!');
    else
        disp('注意:CR >= 0.10,因此该判断矩阵A需要进行修改!');
    end
elseif ERROR == 1
    disp('请检查矩阵A的维数是否不大于1或不是方阵')
elseif ERROR == 2
    disp('请检查矩阵A中有元素小于等于0')
elseif ERROR == 3
    disp('A的维数n超过了15,请减少准则层的数量')
elseif ERROR == 4
    disp('请检查矩阵A中存在i、j不满足A_ij * A_ji = 1')
end


版权声明:本文为qq_54017644原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。