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 Sleep休眠函数使用简单实例
Feb 02 Python
Windows下使Python2.x版本的解释器与3.x共存的方法
Oct 25 Python
python 显示数组全部元素的方法
Apr 19 Python
python实现定时提取实时日志程序
Jun 22 Python
django 环境变量配置过程详解
Aug 06 Python
python Popen 获取输出,等待运行完成示例
Dec 30 Python
Python内置数据类型list各方法的性能测试过程解析
Jan 07 Python
Python栈的实现方法示例【列表、单链表】
Feb 22 Python
Python MySQL 日期时间格式化作为参数的操作
Mar 02 Python
大数据分析用java还是Python
Jul 06 Python
python切片作为占位符使用实例讲解
Feb 17 Python
Python编程中Python与GIL互斥锁关系作用分析
Sep 15 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
一台收音机,让一家人都笑逐颜开!
2020/08/21 无线电
探讨:array2xml和xml2array以及xml与array的互相转化
2013/06/24 PHP
解析php下载远程图片函数 可伪造来路
2013/06/25 PHP
php把session写入数据库示例
2014/02/26 PHP
Zend Framework常用校验器详解
2016/12/09 PHP
php中Redis的应用--消息传递
2017/03/28 PHP
PHP封装的PDO数据库操作类实例
2017/06/21 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
Javascript自定义排序 node运行 实例
2013/06/05 Javascript
原生js事件的添加和删除的封装
2014/07/01 Javascript
JavaScript中最简洁的编码html字符串的方法
2014/10/11 Javascript
jQuery中attr()与prop()函数用法实例详解(附用法区别)
2015/12/29 Javascript
js中用cssText设置css样式的简单方法
2016/09/19 Javascript
JS实现的驼峰式和连字符式转换功能分析
2016/12/21 Javascript
React快速入门教程
2017/01/17 Javascript
浅谈node模块与npm包管理工具
2018/01/03 Javascript
js传递数组参数到后台controller的方法
2018/03/29 Javascript
promise和co搭配生成器函数方式解决js代码异步流程的比较
2018/05/25 Javascript
Vue作用域插槽slot-scope实例代码
2018/09/05 Javascript
JavaScript中的回调函数实例讲解
2019/01/27 Javascript
解决VueCil代理本地proxytable无效报错404的问题
2020/11/07 Javascript
Python写入数据到MP3文件中的方法
2015/07/10 Python
Python分治法定义与应用实例详解
2017/07/28 Python
python之cv2与图像的载入、显示和保存实例
2018/12/05 Python
使用Django搭建web服务器的例子(最最正确的方式)
2019/08/29 Python
python3中numpy函数tile的用法详解
2019/12/04 Python
Python:type、object、class与内置类型实例
2019/12/25 Python
解决python对齐错误的方法
2020/07/16 Python
基于 HTML5 Canvas实现 的交互式地铁线路图
2018/03/05 HTML / CSS
Vision Direct比利时:在线订购隐形眼镜
2019/08/27 全球购物
我的求职计划书
2014/01/10 职场文书
2014年煤矿安全工作总结
2014/12/04 职场文书
2015新员工试用期工作总结
2014/12/12 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书
2015初中教导处工作总结
2015/07/21 职场文书
2022年四月新番
2022/03/15 日漫