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中__init__和__new__的区别详解
Jul 09 Python
Python3基础之基本运算符概述
Aug 13 Python
Python实现的概率分布运算操作示例
Aug 14 Python
用Python写王者荣耀刷金币脚本
Dec 21 Python
python实现剪切功能
Jan 23 Python
python中pytest收集用例规则与运行指定用例详解
Jun 27 Python
简单了解python 邮件模块的使用方法
Jul 24 Python
详解Django3中直接添加Websockets方式
Feb 12 Python
PyCharm GUI界面开发和exe文件生成的实现
Mar 04 Python
Python 实现网课实时监控自动签到、打卡功能
Mar 12 Python
python3.8.1+selenium实现登录滑块验证功能
May 22 Python
手把手教你用Django执行原生SQL的方法
Feb 18 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网站地图生成类示例
2014/01/13 PHP
php-fpm服务启动脚本的方法
2018/04/27 PHP
PHP count_chars()函数讲解
2019/02/14 PHP
js实现权限树的更新权限时的全选全消功能
2009/02/17 Javascript
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
javascript中最常用的继承模式 组合继承
2010/08/12 Javascript
js控制的回到页面顶端goTop的代码实现
2013/03/20 Javascript
jquery ajax 调用失败的原因示例介绍
2013/09/27 Javascript
JavaScript中的undefined学习总结
2013/11/30 Javascript
javascript中interval与setTimeOut的区别示例介绍
2014/03/14 Javascript
nodejs获取本机内网和外网ip地址的实现代码
2014/06/01 NodeJs
将HTML格式的String转化为HTMLElement的实现方法
2014/08/07 Javascript
基于JavaScript实现移动端TAB触屏切换效果
2015/10/20 Javascript
理解javascript中DOM事件
2015/12/25 Javascript
js实现精确到秒的日期选择器完整实例
2016/04/30 Javascript
基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作
2016/05/12 Javascript
AngularJS学习笔记之依赖注入详解
2016/05/16 Javascript
漂亮! js实现颜色渐变效果
2016/08/12 Javascript
jQuery向webApi提交post json数据
2017/01/16 Javascript
node.js(express)中使用Jcrop进行图片剪切上传功能
2017/04/21 Javascript
详解ElementUI之表单验证、数据绑定、路由跳转
2017/06/21 Javascript
vue 数组和对象不能直接赋值情况和解决方法(推荐)
2017/10/25 Javascript
利用QT写一个极简单的图形化Python闹钟程序
2015/04/07 Python
基于scrapy实现的简单蜘蛛采集程序
2015/04/17 Python
Python实现的生成格雷码功能示例
2018/01/24 Python
python线程池threadpool使用篇
2018/04/27 Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
2019/01/17 Python
利用python制作拼图小游戏的全过程
2020/12/04 Python
水污染治理专业毕业生推荐信
2013/11/14 职场文书
金融系毕业生自荐书
2014/07/08 职场文书
地理信息科学专业推荐信
2014/09/08 职场文书
县政府办公室领导班子对照检查材料思想汇报
2014/09/28 职场文书
2016年“12.3”国际残疾人日活动总结
2016/04/01 职场文书
Nginx+Tomcat实现负载均衡、动静分离的原理解析
2021/03/31 Servers
CSS+HTML 实现顶部导航栏功能
2021/08/30 HTML / CSS
Python使用MapReduce进行简单的销售统计
2022/04/22 Python