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读文件逐行处理的示例代码分享
Dec 27 Python
web.py中调用文件夹内模板的方法
Aug 26 Python
Flask入门教程实例:搭建一个静态博客
Mar 27 Python
python同时给两个收件人发送邮件的方法
Apr 30 Python
Python利用operator模块实现对象的多级排序详解
May 09 Python
详解Python list 与 NumPy.ndarry 切片之间的对比
Jul 24 Python
一篇文章快速了解Python的GIL
Jan 12 Python
详解Python进阶之切片的误区与高级用法
Dec 24 Python
Python中的单下划线和双下划线使用场景详解
Sep 09 Python
浅析Python数字类型和字符串类型的内置方法
Dec 22 Python
详解Python 函数参数的拆解
Sep 02 Python
详解Python中Pyyaml模块的使用
Oct 08 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 OPCode缓存 APC详细介绍
2010/10/12 PHP
php获取post中的json数据的实现方法
2011/06/08 PHP
php正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
2013/08/13 PHP
PHP程序员必须清楚的问题汇总
2014/12/18 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
phpStudy配置多站点多域名和多端口的方法
2017/09/01 PHP
php根据地址获取百度地图经纬度的实例方法
2019/09/03 PHP
解决laravel中日志权限莫名变成了root的问题
2019/10/17 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
2020/06/24 PHP
利用jq让你的div居中的好方法分享
2013/11/21 Javascript
jquery插件uploadify实现带进度条的文件批量上传
2015/12/13 Javascript
Angular 理解module和injector,即依赖注入
2016/09/07 Javascript
jquery获取easyui日期控件的值实现方法
2016/11/09 Javascript
完美解决浏览器跨域的几种方法(汇总)
2017/05/08 Javascript
关于Angular2 + node接口调试的解决方案
2017/05/28 Javascript
BACKBONE.JS 简单入门范例
2017/10/17 Javascript
利用Javascript开发一个二维周视图日历
2017/12/14 Javascript
微信小程序左右滑动的实现代码
2017/12/15 Javascript
微信小程序websocket实现即时聊天功能
2019/05/21 Javascript
[05:48]DOTA2英雄梦之声vol21 屠夫
2014/06/20 DOTA
查找python项目依赖并生成requirements.txt的方法
2018/07/10 Python
pycharm+PyQt5+python最新开发环境配置(踩坑)
2019/02/11 Python
在python里协程使用同步锁Lock的实例
2019/02/19 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
2019/09/25 Python
PyCharm2019安装教程及其使用(图文教程)
2019/09/29 Python
美国迪克体育用品商店:DICK’S Sporting Goods
2018/07/24 全球购物
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
linux面试题参考答案(10)
2016/10/26 面试题
如何利用XMLHTTP检测URL及探测服务器信息
2013/11/10 面试题
物理教育专业毕业生推荐信
2013/11/03 职场文书
二手书店创业计划书
2014/01/16 职场文书
仓库管理制度
2014/01/21 职场文书
幼儿园中秋节活动方案2013
2014/01/29 职场文书
质量主管工作职责
2014/09/26 职场文书
医院领导班子整改方案
2014/10/01 职场文书
 Redis 串行生成顺序编码的方法实现
2022/04/03 Redis