层次分析法(matlab实现)

来源:互联网 发布:4630端口 编辑:程序博客网 时间:2024/06/03 14:31
  • 层次分析:

    层次分析法的基本思路与人对一个复杂的决策问题的思维、判断过程大体上是一样的。不妨用假期旅游为例:假如有3个旅游胜地A、B、C供你选择,你会根据诸如景色、费用和居住、饮食、旅途条件等一些准则去反复比较这3个候选地点.首先,你会确定这些准则在你的心目中各占多大比重,如果你经济宽绰、醉心旅游,自然分别看重景色条件,而平素俭朴或手头拮据的人则会优先考虑费用,中老年旅游者还会对居住、饮食等条件寄以较大关注。其次,你会就每一个准则将3个地点进行对比,譬如A景色最好,B次之;B费用最低,C次之;C居住等条件较好等等。最后,你要将这两个层次的比较判断进行综合,在A、B、C中确定哪个作为最佳地点。

  • 模型建立的基本步骤:
    1、建立层次结构模型。在深入分析实际问题的基础上,将有关的各个因素按照不同属性自上而下地分解成若干层次,同一层的诸因素从属于上一层的因素或对上层因素有影响,同时又支配下一层的因素或受到下层因素的作用。最上层为目标层,通常只有1个因素,最下层通常为方案或对象层,中间可以有一个或几个层次,通常为准则或指标层。当准则过多时(譬如多于9个)应进一步分解出子准则层。

      2、构造成对比较阵。从层次结构模型的第2层开始,对于从属于(或影响)上一层每个因素的同一层诸因素,用成对比较法和1—9比较尺度构造成对比较阵,直到最下层。

      3、计算权向量并做一致性检验。对于每一个成对比较阵计算最大特征根及对应特征向量,利用一致性指标、随机一致性指标和一致性比率做一致性检验。若检验通过,特征向量(归一化后)即为权向量:若不通过,需重新构造成对比较阵。

      4、计算组合权向量并做组合一致性检验。计算最下层对目标的组合权向量,并根据公式做组合一致性检验,若检验通过,则可按照组合权向量表示的结果进行决策,否则需要重新考虑模型或重新构造那些一致性比率较大的成对比较阵。

    -构造对比矩阵
    层次结构反映了因素之间的关系,但准则层中的各准则在目标衡量中所占的比重 并不一定相同,在决策者的心目中,它们各占有一定的比例。 在确定影响某因素的诸因子在该因素中所占的比重时,遇到的主要困难是这些比 重常常不易定量化。此外,当影响某因素的因子较多时,直接考虑各因子对该因素有 多大程度的影响时,常常会因考虑不周全、顾此失彼而使决策者提出与他实际认为的 重要性程度不相一致的数据,甚至有可能提出一组隐含矛盾的数据。为看清这一点, 可作如下假设:将一块重为 1 千克的石块砸成n小块,你可以精确称出它们的重量, 设为 n ww ,,1 L ,现在,请人估计这n小块的重量占总重量的比例(不能让他知道各 小石块的重量),此人不仅很难给出精确的比值,而且完全可能因顾此失彼而提供彼 此矛盾的数据。
    (这里会发现构造矩阵时,会显示出层次分析的弊端,具有主观性,其客观性较弱)

这里设Ymax为矩阵的特征根, 然后对模型进行一致性检验:
(对模型的一致性检验时一般用计算机的软件,进行语言的编写

-当矩阵非一致性较为严重时, 对矩阵进行修正
详细修正方法见论文:层次分析法中整体一致性判别及校正
层次分析法判断矩阵一致性检验及偏差自动修正程序

  • 对于多层的检验
    上面我们得到的是一组元素对其上一层中某元素的权重向量。我们最终要得到各 元素,特别是最低层中各方案对于目标的排序权重,从而进行方案选择。总排序权重 要自上而下地将单准则下的权重进行合成

    一致性检验的方程式为:
  • matlab对算法的实现
clc,clear fid=fopen('txt3.txt','r');  a=[]; for i=1:n1    tmp=str2num(fgetl(fid));      end for i=1:n1     str1=char(['b',int2str(i),'=[];']);     str2=char(['b',int2str(i),'=[b',int2str(i),';tmp];']);     eval(str1);     for j=1:n2         tmp=str2num(fgetl(fid));         eval(str2); %读方案层的判断矩阵     end end ri=[0,0,0.58,0.90,1.12,1.24,1.32,1.41,1.45]; %一致性指标 [x,y]=eig(a); lamda=max(diag(y)); num=find(diag(y)==lamda); w0=x(:,num)/sum(x(:,num)); cr0=(lamda-n1)/(n1-1)/ri(n1) for i=1:n1     [x,y]=eig(eval(char(['b',int2str(i)])));      cr1, ts=w1*w0, cr=cr1*w0 

纯文本数据如下:
1 1 1 4 1 1/2
1 1 2 4 1 1/2 1
1/2 1 5 3 1/2 1/4
1/4 1/5 1 1/3 1/3 1
1 1/3 3 1 1 2
2 2 3 3 1 1
1/4 1/2 4
1 3 2
1/3 1 1
1/4 1/5 4
1 1/2 5
2 1 1
3 1/3 1/3
1 1/7 3
7  1 1
1/3 5 3
1 7 1/5
1/7 1 1
1 7 1
1 7 1/7
1/7 1 1
7 9 1/7
1 1 1/9
1 1   3

原创粉丝点击