当前位置:   article > 正文

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

ahp层次分析 pyhton

目录

1.算法流程简介

2.算法核心代码

3.算法效果展示

1.算法流程简介

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

2.算法核心代码

  1. """
  2. AHP:层次分析法,层次分析法还是比较偏向于主观的判断的,所以在建模的时候尽可能不要去使用层次分析法
  3. 不过在某些创新的评价方法上,也是能够运用层次分析使得评价变得全面一些,有可能险中求胜,获得评委的青睐的
  4. """
  5. import numpy as np
  6. class AHP:
  7. #1.首先进行预备信息的求解便于一致性检验
  8. def __init__(self,cmatrix):
  9. self.arr=cmatrix#导入比较矩阵
  10. #获取比较矩阵的相关数据
  11. self.n=cmatrix.shape[0]#比较矩阵的大小
  12. #设置RI便于一致性检验
  13. 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]
  14. #求解特征值和特征向量np.linalg.eig()会一起返回
  15. self.eig_val, self.eig_vector = np.linalg.eig(self.arr)
  16. #求解矩阵的最大特征值
  17. self.max_eig_val = np.max(self.eig_val)
  18. #矩阵最大特征值对应的特征向量
  19. self.max_eig_vector = self.eig_vector[:, np.argmax(self.eig_val)].real
  20. #矩阵的一致性指标CI
  21. self.CI_val = (self.max_eig_val - self.n) / (self.n - 1)
  22. #矩阵的一致性比例CR
  23. self.CR_val = self.CI_val / (self.RI[self.n - 1])
  24. #2.进行一致性检验,判断是否可以使用层次分析法
  25. def consist_test(self):
  26. #一致性指标CI
  27. print("比较矩阵的CI值为:",str(self.CI_val))
  28. #一致性指标CR
  29. print("比较矩阵的CR值为:",str(self.CR_val))
  30. if self.n==2:
  31. print("仅有两个子因素,不存在一致性冲突问题")
  32. else:
  33. if self.CR_val<0.1:#CR<0.1,一致性问题通过
  34. print("比较矩阵CR值为:",str(self.CR_val),"<0.1,通过一致性检验!")
  35. return True
  36. else:
  37. print("比较矩阵CR值为:",str(self.CR_val),">0.1,未通过一致性检验,不能使用层次分析法!")
  38. return False
  39. #3.求解权重的三种方法:
  40. #1.算术平均法
  41. def Arithmetic_averaging_method(self):
  42. #求每一列的和
  43. sum_col=np.sum(self.arr,axis=0)
  44. #归一化处理
  45. array_std=self.arr/sum_col
  46. #计算权重向量
  47. weight_Arithmetic_averaging=np.sum(array_std,axis=1)/self.n
  48. print("算术平均法求得的权重为:",weight_Arithmetic_averaging)
  49. return weight_Arithmetic_averaging
  50. #2.几何平均法
  51. def Geometric_averaging_method(self):
  52. # 求矩阵的每列的积
  53. col_plus = np.product(self.arr, axis=0)
  54. # 将得到的积向量的每个分量进行开n次方
  55. array_power = np.power(col_plus, 1 / self.n)
  56. # 将列向量归一化
  57. weight_Geometric_averaging = array_power / np.sum(array_power)
  58. # 打印权重向量
  59. print("几何平均法求得的权重为:", weight_Geometric_averaging)
  60. # 返回权重向量的值
  61. return weight_Geometric_averaging
  62. #3.特征值权重法
  63. def Eigenvalue_weighting_method(self):
  64. # 将矩阵最大特征值对应的特征向量进行归一化处理就得到了权重
  65. weight_Eigenvalue_weighting = self.max_eig_vector / np.sum(self.max_eig_vector)
  66. # 打印权重向量
  67. print("特征值权重法法求得的权重为:", weight_Eigenvalue_weighting)
  68. # 返回权重向量的值
  69. return weight_Eigenvalue_weighting
  70. def test_run_demo():
  71. #comparsion_matrix可以随意修改
  72. comparsion_matrix=np.array([[1,1/4,1/9],
  73. [4,1,1/2],
  74. [9, 2, 1]])
  75. weight1 = AHP(comparsion_matrix).Arithmetic_averaging_method()
  76. weight2 = AHP(comparsion_matrix).Geometric_averaging_method()
  77. weight3 = AHP(comparsion_matrix).Eigenvalue_weighting_method()
  78. #运行区域:
  79. test_run_demo()

3.算法效果展示

算术平均法求得的权重为: [0.07243906 0.30125047 0.62631047]
几何平均法求得的权重为: [0.7374984  0.17727613 0.08522547]
特征值权重法法求得的权重为: [0.07239208 0.30116321 0.62644471]
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/958230
推荐阅读
相关标签
  

闽ICP备14008679号