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批量下载图片的三种方法
Apr 22 Python
Python标准库inspect的具体使用方法
Dec 06 Python
python监控进程脚本
Apr 12 Python
删除python pandas.DataFrame 的多重index实例
Jun 08 Python
解决python ogr shp字段写入中文乱码的问题
Dec 31 Python
python paramiko利用sftp上传目录到远程的实例
Jan 03 Python
Python中类的创建和实例化操作示例
Feb 27 Python
Python多线程模块Threading用法示例小结
Nov 09 Python
如何安装并在pycharm使用selenium的方法
Apr 30 Python
Keras使用ImageNet上预训练的模型方式
May 23 Python
Python调用shell cmd方法代码示例解析
Jun 18 Python
OpenCV-Python模板匹配人眼的实例
Jun 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
消息持续发送的完整例子
2006/10/09 PHP
PHP生成sitemap.xml地图函数
2013/11/13 PHP
PHP的Yii框架中Model模型的学习教程
2016/03/29 PHP
利用js正则表达式验证手机号,email地址,邮政编码
2014/01/23 Javascript
什么是 AngularJS?AngularJS简介
2014/12/06 Javascript
jQuery实现鼠标经过时出现隐藏层文字链接的方法
2015/10/12 Javascript
封装好的javascript前端分页插件pagination
2016/01/04 Javascript
深入探秘jquery瀑布流的实现
2016/01/30 Javascript
如何利用JQuery实现从底部回到顶部的功能
2016/12/27 Javascript
vue如何引用其他组件(css和js)
2017/04/13 Javascript
jQuery 实现图片的依次加载图片功能
2017/07/06 jQuery
防止页面url缓存中ajax中post请求的处理方法
2017/10/10 Javascript
vue页面离开后执行函数的实例
2018/03/13 Javascript
初探Vue3.0 中的一大亮点Proxy的使用
2018/12/06 Javascript
基于JS实现简单滑块拼图游戏
2019/10/12 Javascript
vue element-ui中table合计指定列求和实例
2020/11/02 Javascript
[57:16]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第二场
2014/05/26 DOTA
python获取多线程及子线程的返回值
2017/11/15 Python
python书籍信息爬虫实例
2018/03/19 Python
python设置代理和添加镜像源的方法
2020/02/14 Python
Python的PIL库中getpixel方法的使用
2020/04/09 Python
向全球直邮输送天然健康产品:iHerb.com
2020/05/03 全球购物
一套C++笔试题面试题
2012/06/06 面试题
几个Shell Script面试题
2012/08/31 面试题
晚会邀请函范文
2014/01/24 职场文书
高二生物教学反思
2014/01/27 职场文书
《油菜花开了》教学反思
2014/02/22 职场文书
2014春晚主持词
2014/03/25 职场文书
法学自荐信
2014/06/20 职场文书
个人授权委托书
2014/09/15 职场文书
2014年国庆节庆祝建国65周年比赛演讲稿
2014/09/21 职场文书
工作失职检讨书(精华篇)
2014/10/15 职场文书
2015年公司保安年终工作总结
2015/05/14 职场文书
2016年春季运动会通讯稿
2015/11/25 职场文书
毕业生自我鉴定范文
2019/05/13 职场文书
pytorch损失反向传播后梯度为none的问题
2021/05/12 Python