数学建模--层次分析法(AHP)的Python实现

目录

1.算法流程简介

2.算法核心代码

3.算法效果展示

1.算法流程简介

"""
AHP:层次分析法,层次分析法还是比较偏向于主观的判断的,所以在建模的时候尽可能不要去使用层次分析法
不过在某些创新的评价方法上,也是能够运用层次分析使得评价变得全面一些,有可能险中求胜,获得评委的青睐的
"""
具体流程如下:
#1.首先进行预备信息的求解便于一致性检验
#2.进行一致性检验,判断是否可以使用层次分析法
#3.求解权重的三种方法(算术平均值法,几何平均值法,特征向量法)

2.算法核心代码

"""
AHP:层次分析法,层次分析法还是比较偏向于主观的判断的,所以在建模的时候尽可能不要去使用层次分析法
不过在某些创新的评价方法上,也是能够运用层次分析使得评价变得全面一些,有可能险中求胜,获得评委的青睐的
"""
import numpy as np
class AHP:
#1.首先进行预备信息的求解便于一致性检验
 def __init__(self,cmatrix):
    self.arr=cmatrix#导入比较矩阵
    #获取比较矩阵的相关数据
    self.n=cmatrix.shape[0]#比较矩阵的大小
    #设置RI便于一致性检验
    self.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]
    #求解特征值和特征向量np.linalg.eig()会一起返回
    self.eig_val, self.eig_vector = np.linalg.eig(self.arr)
    #求解矩阵的最大特征值
    self.max_eig_val = np.max(self.eig_val)
    #矩阵最大特征值对应的特征向量
    self.max_eig_vector = self.eig_vector[:, np.argmax(self.eig_val)].real
    #矩阵的一致性指标CI
    self.CI_val = (self.max_eig_val - self.n) / (self.n - 1)
    #矩阵的一致性比例CR
    self.CR_val = self.CI_val / (self.RI[self.n - 1])
#2.进行一致性检验,判断是否可以使用层次分析法
 def consist_test(self):
    #一致性指标CI
    print("比较矩阵的CI值为:",str(self.CI_val))
    #一致性指标CR
    print("比较矩阵的CR值为:",str(self.CR_val))
    if self.n==2:
        print("仅有两个子因素,不存在一致性冲突问题")
    else:
        if self.CR_val<0.1:#CR<0.1,一致性问题通过
            print("比较矩阵CR值为:",str(self.CR_val),"<0.1,通过一致性检验!")
            return True
        else:
            print("比较矩阵CR值为:",str(self.CR_val),">0.1,未通过一致性检验,不能使用层次分析法!")
            return False
#3.求解权重的三种方法:
#1.算术平均法
 def Arithmetic_averaging_method(self):
    #求每一列的和
    sum_col=np.sum(self.arr,axis=0)
    #归一化处理
    array_std=self.arr/sum_col
    #计算权重向量
    weight_Arithmetic_averaging=np.sum(array_std,axis=1)/self.n
    print("算术平均法求得的权重为:",weight_Arithmetic_averaging)
    return weight_Arithmetic_averaging

#2.几何平均法
 def Geometric_averaging_method(self):
    # 求矩阵的每列的积
    col_plus = np.product(self.arr, axis=0)
    # 将得到的积向量的每个分量进行开n次方
    array_power = np.power(col_plus, 1 / self.n)
    # 将列向量归一化
    weight_Geometric_averaging = array_power / np.sum(array_power)
    # 打印权重向量
    print("几何平均法求得的权重为:", weight_Geometric_averaging)
    # 返回权重向量的值
    return weight_Geometric_averaging

#3.特征值权重法
 def Eigenvalue_weighting_method(self):
    # 将矩阵最大特征值对应的特征向量进行归一化处理就得到了权重
    weight_Eigenvalue_weighting = self.max_eig_vector / np.sum(self.max_eig_vector)
    # 打印权重向量
    print("特征值权重法法求得的权重为:", weight_Eigenvalue_weighting)
    # 返回权重向量的值
    return weight_Eigenvalue_weighting

def test_run_demo():
 #comparsion_matrix可以随意修改
 comparsion_matrix=np.array([[1,1/4,1/9],
                            [4,1,1/2],
                            [9, 2, 1]])
 weight1 = AHP(comparsion_matrix).Arithmetic_averaging_method()
 weight2 = AHP(comparsion_matrix).Geometric_averaging_method()
 weight3 = AHP(comparsion_matrix).Eigenvalue_weighting_method()

#运行区域:
test_run_demo()
    

3.算法效果展示

算术平均法求得的权重为: [0.07243906 0.30125047 0.62631047]
几何平均法求得的权重为: [0.7374984  0.17727613 0.08522547]
特征值权重法法求得的权重为: [0.07239208 0.30116321 0.62644471]

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