matlab实现层次分析法

层次分析法步骤:

  1.列出目标层,准则层,措施层
  2.完成相邻两层间判断矩阵
  3.对每个判断矩阵使用AHP进行一致性检验
  (记录AHP结果Q为权值,同时在对上中两层时记录CI)
  4.全部通过AHP对结果使用AHP1进行检验
  5.列出表格给出权值排序表

AHP代码如下:

%本程序使用了特征值法,其余方法还有几何平均法、算数平均法
%最后可输出权值矩阵,多决策对一准则
function [Q]=AHP(B)
%Q 为权值,B 为对比矩阵
%导入判别矩阵 B
[n,m]=size(B);
%判别矩阵具有完全一致性
for i=1:n
    for j=1:n
        if B(i,j)*B(j,i)~=1
            fprintf('i=%d,j=%d,B(i,j)=%d,B(j,i)=%d\n',i,j,B(i,j),B(j,i))    
        end
    end
end
%求特征值特征向量,找到最大特征值对应的特征向量
[V,D]=eig(B); %特征值组成对角阵 DV 是特征向量()
max_eig_hang=max(D); %max_eig_hang 代表最大特征值所在行向量
max_eig_value=max(max_eig_hang); %max_eig_value 代表最大特征值
c1=find(D(1,:)==max(max_eig_hang));%c1 代表最大特征值对应的列向量编号
tzx=V(:,c1); %特征向量
%权
quan=zeros(n,1);
for i=1:n
    quan(i,1)=tzx(i,1)/sum(tzx);
end
Q=quan;
%一致性检验
CI=(max_eig_value-n)/(n-1)
RI=[0,0,0.58,0.9,1.12,1.24,1.32,1.41,1.45,1.49,1.52,1.54,1.56,1.58,1.59];%RI 的值是固定的有表可查
size(RI);
%判断是否通过一致性检验
CR=CI/RI(1,n);
if CR>=0.1
    fprintf('没有通过一致性检验\n');
else
    fprintf('通过一致性检验\n');
end
end

AHP1代码如下:

 
%A 代表 A (目标-决策)形成的权重,是对A层每次运行AHP后得到的结果,单次作为列向量
%B 的列向量是 B 层(决策-方案)各个权重,同A
% CI是之前通过AHP在中上两层记录的CI,是一个行向量
% n是方案层的个数
function AHP1(A,B,CI,n)
    %ending即为方案层相较于目标层的权重
    ending = ones(n,1);
    a_size = size(A);
    a_row = a_size(1);
    % A的列数等于目标层个数,此处默认为1
    for i=1:n
        for j=1:a_row
            ending(i)=B(i,j)*A(j,1);
        end
    end
    fprintf("结果权重为:");
    ending
    RI=[0,0,0.58,0.9,1.12,1.24,1.32,1.41,1.45,1.49,1.52,1.54,1.56,1.58,1.59];
    CR1 = 0;
    CR2 = 0;
    size(A)
    for i=1:size(A)
        CR1 = CR1 + CI(i)* A(i);
        CR2 = CR2 + RI(1,n)* A(i);
    end
    CR = CR1/CR2;
    if CR>=0.1
        fprintf('未通过一致性检验\n');
    else
        fprintf('通过一致性检验\n');
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值