数学建模-层次分析法

层次分析法

1.1作用

评价模型
数据由相关文献确定评价指标满意度,求各层次的权重。
对于已经给出具体数字的数据并不适用。

1.2基本思想

层次分析法根据问题的性质和要达到的总目标,将问题分解为不同的组成因素,并按照因素间的相互关联影响以及隶属关系将因素按不同的层次聚集组合,形成一个多层次的分析结构模型,从而最终使问题归结为最低层(供决策的方案、措施等)相对于最高层(总目标)的相对重要权值的确定或相对优劣次序的排定。

2 层次分析的基本步骤

image

准则层例子:
通过资料给各项对比打分
参照:

因素i比因素j 量化值
同等重要 1
稍微重要 3
较强重要 5
强烈重要 7
极端重要 9
两相邻判断的中间值 2,4,6,8

表:

景色 花费 居住 饮食 交通
景色 1 1/2 4 3 3
花费 2 1 7 5 5
居住 1/4 1/7 1 1/2 1/3
饮食 1/3 1/5 2 1 1
交通 1/3 1/5 3 1 1

2.1一致性检验

指标公式:
image
λ:最大特征根;n:唯一非零特征根
求λ:
对表格进行列归一化:

景色 花费 居住 饮食 交通
景色 0.26 0.25 0.24 0.29 0.29
花费 0.51 0.49 0.41 0.48 0.48
居住 0.06 0.07 0.06 0.05 0.03
饮食 0.08 0.10 0.12 0.10 0.10
交通 0.08 0.10 0.18 0.10 0.10

各行求和:
ni

0.68 1.18 0.13 0.27 0.33

求出各项的比重:=ni÷i=ni
算术平均法求出w=(0.2627,0.4747,0.0542,0.0984,0.1102)
还有几何平均法和特征值法
λ=(0.68/0.2627+1.18/0.4747+0.13/0.054+0.27/0.0984+0.33/0.1102)/5=5
CI = λ-n/n-1=0
CR对应指标:image
CR = CI/RI = 0 < 0.1 所以符合一致性

3.要求第三层对第二层每一个元素(准则)的权向量

如:

景色 杭州 北戴河 桂林
杭州 1 2 5
北戴河 1/2 1 2
桂林 1/5 1/2 1

使用和层二相同的方法来计算得出权向量。
算术平均法求出w=(0.5949,0.2766,0.1285)

指标权重 苏州 北戴河 桂林
景色 0.2627 0.5949 0.2766 0.1285

表格完成后,通过权重加权计算可得答案
image

相关代码

matble

clear;clc
A =[1 1 4 1/3 3;
 1 1 4 1/3 3;
 1/4 1/4 1 1/3 1/2;
 3 3 3 1 3;
 1/3 1/3 2 1/3 1]
 % 第一步:将判断矩阵按照列归一化(每一个元素除以其所在列的和)
 Sum_A = sum(A)
 SUM_A = repmat(Sum_A,n,1) 
 SUM_A = [];
    for i = 1:n   
        SUM_A = [SUM_A; Sum_A]
    end
clc;A
SUM_A
Stand_A = A ./ SUM_A
% 第二步:将归一化的各列相加(按行求和)
sum(Stand_A,2)
% 第三步:将相加后得到的向量中每个元素除以n即可得到权重向量
disp(sum(Stand_A,2) / n)
%% 计算一致性比例CR
clc
CI = (Max_eig - 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];  %注意哦,这里的RI最多支持 n = 15
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

python

#%%
import pandas as pd
import numpy as np

df=pd.read_excel("./例题.xlsx")
df=df.iloc[:,[1,2,3,4,5]]
#%%
"""
    层次分析法
    :param df:符号
    :param 1:返回列归一化表格
    :param 2:返回W值
    :param 3:返回λ值
    """
def rescaling_column(df,mode):#列归一化
    fields = [column for column in df]#列名
    for i in range(len(fields)):
        sum_a=df.apply(lambda x:sum(x),axis=0)
        df.loc[:,fields[i]]=df[[fields[i]]]/sum_a[i]
    if (mode==1):
        return round(df,2)
    sum_b=df.apply(lambda x:sum(x),axis=1)#
    list=[]
    for i in range(len(sum_b)):
        list.append(round(sum_b[i]/sum(sum_b),4))
    if (mode==2):
        return list
    λ=0
    for i in range(len(list)):
        λ=λ+(sum_b[i]/list[i])
    if (mode==3):
       return round(λ/len(list),2)
    pass

#%%
λ=rescaling_column(df,3)
CI = (λ-df.shape[1])/(df.shape[1]-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]
CR=CI/RI[df.shape[1]]
print(f"一致性指标CI={CI}")
print(f"一致性比例CR={CR}",)
if (CR<0.10):
    print('因为CR < 0.10,所以该判断矩阵A的一致性可以接受!')
else:
    print('注意:CR >= 0.10,因此该判断矩阵A需要进行修改!')

posted @ 2022-05-24 15:57  玥瑕  阅读(334)  评论(0)    收藏  举报