python实现AHP算法的方法实例(层次分析法)


Posted in Python onSeptember 09, 2020

一、层次分析法原理

层次分析法(Analytic Hierarchy Process,AHP)由美国运筹学家托马斯·塞蒂(T. L. Saaty)于20世纪70年代中期提出,用于确定评价模型中各评价因子/准则的权重,进一步选择最优方案。该方法仍具有较强的主观性,判断/比较矩阵的构造在一定程度上是拍脑门决定的,一致性检验只是检验拍脑门有没有自相矛盾得太离谱。

相关的理论参考可见:wiki百科

二、代码实现

需要借助Python的numpy矩阵运算包,代码最后用了一个b1矩阵进行了调试,相关代码如下,具体的实现流程已经用详细的注释标明,各位小伙伴有疑问的欢迎留言和我一起讨论。

import numpy as np
class AHP:
  """
  相关信息的传入和准备
  """

  def __init__(self, array):
    ## 记录矩阵相关信息
    self.array = array
    ## 记录矩阵大小
    self.n = array.shape[0]
    # 初始化RI值,用于一致性检验
    self.RI_list = [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]
    # 矩阵的特征值和特征向量
    self.eig_val, self.eig_vector = np.linalg.eig(self.array)
    # 矩阵的最大特征值
    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_list[self.n - 1])

  """
  一致性判断
  """

  def test_consist(self):
    # 打印矩阵的一致性指标CI和一致性比例CR
    print("判断矩阵的CI值为:" + str(self.CI_val))
    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) + ",通过一致性检验")
        return True
      else: # CR值大于0.1, 一致性检验不通过
        print("判断矩阵的CR值为" + str(self.CR_val) + "未通过一致性检验")
        return False

  """
  算术平均法求权重
  """

  def cal_weight_by_arithmetic_method(self):
    # 求矩阵的每列的和
    col_sum = np.sum(self.array, axis=0)
    # 将判断矩阵按照列归一化
    array_normed = self.array / col_sum
    # 计算权重向量
    array_weight = np.sum(array_normed, axis=1) / self.n
    # 打印权重向量
    print("算术平均法计算得到的权重向量为:\n", array_weight)
    # 返回权重向量的值
    return array_weight

  """
  几何平均法求权重
  """

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

  """
  特征值法求权重
  """

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


if __name__ == "__main__":
  # 给出判断矩阵
  b = np.array([[1, 1 / 3, 1 / 8], [3, 1, 1 / 3], [8, 3, 1]])

  # 算术平均法求权重
  weight1 = AHP(b).cal_weight_by_arithmetic_method()
  # 几何平均法求权重
  weight2 = AHP(b).cal_weight__by_geometric_method()
  # 特征值法求权重
  weight3 = AHP(b).cal_weight__by_eigenvalue_method()

总结

到此这篇关于python实现AHP算法(层次分析法)的文章就介绍到这了,更多相关python AHP算法(层次分析法)内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中获取网页状态码的两个方法
Nov 03 Python
Python导入模块时遇到的错误分析
Aug 30 Python
python中matplotlib的颜色及线条控制的示例
Mar 16 Python
Django发送邮件和itsdangerous模块的配合使用解析
Aug 10 Python
Django文件上传与下载(FileFlid)
Oct 06 Python
在Python中使用MongoEngine操作数据库教程实例
Dec 03 Python
运行tensorflow python程序,限制对GPU和CPU的占用操作
Feb 06 Python
python自动下载图片的方法示例
Mar 25 Python
获取CSDN文章内容并转换为markdown文本的python
Sep 06 Python
Python的Tqdm模块实现进度条配置
Feb 24 Python
详解Python为什么不用设计模式
Jun 24 Python
图文详解matlab原始处理图像几何变换
Jul 09 Python
Pytorch 扩展Tensor维度、压缩Tensor维度的方法
Sep 09 #Python
Python列表推导式实现代码实例
Sep 09 #Python
利用Python中的Xpath实现一个在线汇率转换器
Sep 09 #Python
pytorch使用horovod多gpu训练的实现
Sep 09 #Python
python,Java,JavaScript实现indexOf
Sep 09 #Python
python 5个顶级异步框架推荐
Sep 09 #Python
python PyAUtoGUI库实现自动化控制鼠标键盘
Sep 09 #Python
You might like
PHP支持多种格式图片上传(支持jpg、png、gif)
2011/11/03 PHP
php获取目录所有文件并将结果保存到数组(实例)
2013/10/25 PHP
php实现四舍五入的方法小结
2015/03/03 PHP
PHP实现单条sql执行多个数据的insert语句方法
2019/10/11 PHP
laravel 自定义常量的两种方案
2019/10/14 PHP
php 中self,this的区别和操作方法实例分析
2019/11/04 PHP
FF IE兼容性的修改小结
2009/09/02 Javascript
JavaScript实现班级随机点名小应用需求的具体分析
2014/05/12 Javascript
jQuery简易图片放大特效示例代码
2014/06/09 Javascript
javascript常用代码段搜集
2014/12/04 Javascript
基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标
2016/01/22 Javascript
ajax与json 获取数据并在前台使用简单实例
2017/01/19 Javascript
基于Vue2.X的路由和钩子函数详解
2018/02/09 Javascript
vue项目base64字符串转图片的实现代码
2018/07/13 Javascript
解决webpack dev-server不能匹配post请求的问题
2018/08/24 Javascript
VUE v-for循环中每个item节点动态绑定不同函数的实例
2018/09/26 Javascript
iView框架问题整理小结
2018/10/16 Javascript
vue props 单项数据流实例分享
2020/02/16 Javascript
[56:35]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第二局
2016/02/27 DOTA
Python实现简单的可逆加密程序实例
2015/03/05 Python
python发送邮件功能实现代码
2016/07/15 Python
Python脚本修改阿里云的访问控制列表的方法
2019/03/08 Python
一文了解Python并发编程的工程实现方法
2019/05/31 Python
python绘制评估优化算法性能的测试函数
2019/06/25 Python
python GUI库图形界面开发之PyQt5时间控件QTimer详细使用方法与实例
2020/02/26 Python
python 错误处理 assert详解
2020/04/20 Python
Python学习工具jupyter notebook安装及用法解析
2020/10/23 Python
Lookfantastic挪威官网:英国知名美妆购物网站
2017/07/26 全球购物
学生发电厂实习自我鉴定
2013/09/22 职场文书
医学专业大学生求职的自我评价
2013/11/27 职场文书
创业计划实施的7大步骤
2014/02/05 职场文书
分公司负责人任命书
2014/06/04 职场文书
毕业生实习证明
2014/09/19 职场文书
爱国主义教育主题班会
2015/08/13 职场文书
matplotlib之pyplot模块实现添加子图subplot的使用
2021/04/25 Python
阿里云服务器Ubuntu 20.04上安装Odoo 15
2022/05/20 Servers