数学建模常用模型03 :层次分析法(AHP)

层次分析分为两个方面:一个是有数据的情况下使用层次分析,一个是无数据的情况下是使用层次分析:

 

(1)无数据的情况下使用层次分析

参考姜启源《数学模型》第四版,因为没有数据,比如景色、舒适度,这些没有具体数据的,使用层次分析的时候,不仅需要做准则层对于目标层的成对比较矩阵,也要做方案层对于准则层的成对比较矩阵。并且只要有成对比较矩阵就一定要做一个一致性检验。

准则层对于目标层的成对比较矩阵:目的是为了确定各个评价指标的权重

方案层对于准则层的成对比较矩阵:目的是为了让没有数据的指标转化为有数据的。

(2)有数据的情况下使用层次分析

有数据一般不使用层次,往往需要结合其他算法,比如模糊综合评价,TOPSIS法、灰色关联等等。这个时候层次分析的作用就是确定指标的权重。

因为有了数据就不需要做方案层对于准则层的成对比较矩阵了,因为即使做了成对比较矩阵,由数据确定的成对比一致性检验一定会通过。并且一次性指标CI=0,即成对比矩阵一定是一致阵。也就是层次分析结合灰色关联,TOPSIS法什么类的只需要确定一下准则层的成对比较矩阵的一致性就行了

(3)两者相互结合怎么办?

我们直达无数据的时候,使用成对比较矩阵,最终得到“权向量”加起来恰好是1,对于有数据可以做一个转化,就是把有数据全部转化为加起来恰好是1的。

 

下面是例子

---------------------------------------------------------------------

如下例:选择旅游地的时候,加入只考虑景色、费用、居住三个,并且有3个旅游景点P1   P2   P3,其中3个景点费用是1200,980,1350.

第一步:层次结构

目标层:选择旅游地

准则层:景色、费用、居住

方案层:去P1,去P2或者去P3

第二步:构建成对比较矩阵

为了方便,我们用表格代替

1

3

3

0.33

1

1

0.33

1

1

第三步:一致性检验及计算权向量

经过一致性检验,一致性检验CI=0通过【关于一致性检验,可以不需要理解】

计算权向量:0.143、0.4285、0.4285

【第三步的过程直接通过给出的程序就能算出来了】

第四步:计算组合权向量并做组合一致性检验

P1   P2   P3对于准则层中“景色”的成对比较矩阵

1

3

3

0.33

1

1

0.33

1

1

计算出各项得分:0.143、0.4285、0.4285

 

P1    P2    P3对于准则层中“居住”的成对比较矩阵

1

3

3

0.33

1

1

0.33

1

1

计算出各项得分:0.143、0.4285、0.4285

 

P1    P2    P3对于准则层中“费用”的成对比较矩阵不需要建立。

各项得分是:1200/(1200+980+1350)=0.34

            980/(1200+980+1350=0.28

1350/(1200+980+1350=0.38

最后:综合计算得出最佳的旅游目的地就行了。

下面是层次分析的代码:

代码一
clc 
clear all;
  A=[1 1/2 1 1/2 1/3;
    2 1 2 1 1;
    1 1/2 1 1 1/2;
    2 1 1 1 1/2;
    3 1 2 2 1]; %评价矩阵
[n,n]=size(A);
[v,d]=eig(A);
r=d(1,1); 
CI=(r-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];
CR=CI/RI(n); 
if CR<0.1 CR_Result='yes';
else CR_Result='no';
end
w=v(:,1)/sum(v(:,1));
w=w';
disp('the result is')
disp(['coincidence indicator:',num2str(CI)])%一致性指标
disp(['consistency ratio:',num2str(CR)])%一致性比例
disp(['Consistency test results:',CR_Result])%一致性检验
disp(['eigenvalue:',num2str(r)])%特征值
disp(['weight vector:',num2str(w)])%权向量

代码二--------------------------------------------

clc;
clear;
A=[1 1.2 1.5 1.5;
0.833  1 1.2 1.2;
0.667  0.833  1 1.2;
0.667  0.833  0.833  1];                            
                                   %因素对比矩阵A,只需要改变矩阵A
[m,n]=size(A);                     %获取指标个数
RI=[0 0 0.58 0.90 1.12 1.24 1.32 1.41 1.45 1.49 1.51];
R=rank(A);                         %求判断矩阵的秩
[V,D]=eig(A);                      %求判断矩阵的特征值和特征向量,V特征值,D特征向量;
tz=max(D);
B=max(tz);                         %最大特征值
[row, col]=find(D==B);             %最大特征值所在位置
C=V(:,col);                        %对应特征向量
CI=(B-n)/(n-1);                    %计算一致性检验指标CI
CR=CI/RI(1,n);   
if CR<0.10
    disp('CI=');disp(CI);
    disp('CR=');disp(CR);
    disp('对比矩阵A通过一致性检验,各向量权重向量Q为:');
    Q=zeros(n,1);
    for i=1:n
        Q(i,1)=C(i,1)/sum(C(:,1)); %特征向量标准化
    end
    Q                              %输出权重向量
else
    disp('对比矩阵A未通过一致性检验,需对对比矩阵A重新构造');
end

 

你可能感兴趣的:(算法,数学建模)