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 中文乱码问题深入分析
Mar 13 Python
Python生成随机数的方法
Jan 14 Python
从Python的源码来解析Python下的freeblock
May 11 Python
python 简单的多线程链接实现代码
Aug 28 Python
Python中turtle作图示例
Nov 15 Python
Python发送http请求解析返回json的实例
Mar 26 Python
pyqt5移动鼠标显示坐标的方法
Jun 21 Python
详解如何用TensorFlow训练和识别/分类自定义图片
Aug 05 Python
树莓派极简安装OpenCv的方法步骤
Oct 10 Python
Python+Tensorflow+CNN实现车牌识别的示例代码
Oct 11 Python
基于Python爬取fofa网页端数据过程解析
Jul 13 Python
Python3 用matplotlib绘制sigmoid函数的案例
Dec 11 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
浅析application/x-www-form-urlencoded和multipart/form-data的区别
2014/06/22 PHP
WordPress中获取所使用的模板的页面ID的简单方法
2015/12/31 PHP
CodeIgniter配置之autoload.php自动加载用法分析
2016/01/20 PHP
采用CSS和JS,刚好我最近有个站点要用到下拉菜单!
2006/06/26 Javascript
再谈IE中Flash控件的自动激活 ObjectWrap
2007/03/09 Javascript
两种WEB下的模态对话框 (asp.net或js的分别实现)
2009/12/02 Javascript
在javascript中对于DOM的加强
2013/04/11 Javascript
jquery制作居中遮罩层效果分享
2014/02/21 Javascript
使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)
2014/05/06 Javascript
Javascript中3个需要注意的运算符
2015/04/02 Javascript
基于jQuery实现的扇形定时器附源码下载
2015/10/20 Javascript
深入浅析JavaScript系列(13):This? Yes,this!
2016/01/05 Javascript
Angularjs整合微信UI(weui)
2016/03/15 Javascript
Vue 2.x教程之基础API
2017/03/06 Javascript
vue的Virtual Dom实现snabbdom解密
2017/05/03 Javascript
详解基于node的前端项目编译时内存溢出问题
2017/08/01 Javascript
mui back 返回刷新页面的实例
2017/12/06 Javascript
vue element table 表格请求后台排序的方法
2018/09/28 Javascript
vue elementUI table 自定义表头和行合并的实例代码
2019/05/22 Javascript
[44:39]2014 DOTA2国际邀请赛中国区预选赛 NE VS CNB
2014/05/21 DOTA
[01:03]PWL开团时刻DAY6——别打我
2020/11/05 DOTA
基于Python代码编辑器的选用(详解)
2017/09/13 Python
TensorFlow saver指定变量的存取
2018/03/10 Python
python3 selenium 切换窗口的几种方法小结
2018/05/21 Python
python中多个装饰器的执行顺序详解
2018/10/08 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
2018/11/30 Python
python 遍历列表提取下标和值的实例
2018/12/25 Python
python使用selenium实现批量文件下载
2019/03/11 Python
opencv python 对指针仪表读数识别的两种方式
2021/01/14 Python
HTML5中的nav标签学习笔记
2016/06/24 HTML / CSS
Omio俄罗斯:一次搜索公共汽车、火车和飞机的机票
2018/11/17 全球购物
Ooni英国官网:披萨烤箱
2020/05/31 全球购物
校园达人秀策划书
2014/01/12 职场文书
通信研究生自荐信
2014/02/01 职场文书
2014年学校党建工作总结
2014/11/11 职场文书
资产移交协议书
2016/03/24 职场文书