当前位置: 首页 > news >正文

数学建模--层次分析法(AHP)的Python实现

目录

1.算法流程简介

2.算法核心代码

3.算法效果展示

1.算法流程简介

"""
AHP:层次分析法,层次分析法还是比较偏向于主观的判断的,所以在建模的时候尽可能不要去使用层次分析法
不过在某些创新的评价方法上,也是能够运用层次分析使得评价变得全面一些,有可能险中求胜,获得评委的青睐的
"""
具体流程如下:
#1.首先进行预备信息的求解便于一致性检验
#2.进行一致性检验,判断是否可以使用层次分析法
#3.求解权重的三种方法(算术平均值法,几何平均值法,特征向量法)

2.算法核心代码

"""
AHP:层次分析法,层次分析法还是比较偏向于主观的判断的,所以在建模的时候尽可能不要去使用层次分析法
不过在某些创新的评价方法上,也是能够运用层次分析使得评价变得全面一些,有可能险中求胜,获得评委的青睐的
"""
import numpy as np
class AHP:
#1.首先进行预备信息的求解便于一致性检验def __init__(self,cmatrix):self.arr=cmatrix#导入比较矩阵#获取比较矩阵的相关数据self.n=cmatrix.shape[0]#比较矩阵的大小#设置RI便于一致性检验self.RI= [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]#求解特征值和特征向量np.linalg.eig()会一起返回self.eig_val, self.eig_vector = np.linalg.eig(self.arr)#求解矩阵的最大特征值self.max_eig_val = np.max(self.eig_val)#矩阵最大特征值对应的特征向量self.max_eig_vector = self.eig_vector[:, np.argmax(self.eig_val)].real#矩阵的一致性指标CIself.CI_val = (self.max_eig_val - self.n) / (self.n - 1)#矩阵的一致性比例CRself.CR_val = self.CI_val / (self.RI[self.n - 1])
#2.进行一致性检验,判断是否可以使用层次分析法def consist_test(self):#一致性指标CIprint("比较矩阵的CI值为:",str(self.CI_val))#一致性指标CRprint("比较矩阵的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),"<0.1,通过一致性检验!")return Trueelse:print("比较矩阵CR值为:",str(self.CR_val),">0.1,未通过一致性检验,不能使用层次分析法!")return False
#3.求解权重的三种方法:
#1.算术平均法def Arithmetic_averaging_method(self):#求每一列的和sum_col=np.sum(self.arr,axis=0)#归一化处理array_std=self.arr/sum_col#计算权重向量weight_Arithmetic_averaging=np.sum(array_std,axis=1)/self.nprint("算术平均法求得的权重为:",weight_Arithmetic_averaging)return weight_Arithmetic_averaging#2.几何平均法def Geometric_averaging_method(self):# 求矩阵的每列的积col_plus = np.product(self.arr, axis=0)# 将得到的积向量的每个分量进行开n次方array_power = np.power(col_plus, 1 / self.n)# 将列向量归一化weight_Geometric_averaging = array_power / np.sum(array_power)# 打印权重向量print("几何平均法求得的权重为:", weight_Geometric_averaging)# 返回权重向量的值return weight_Geometric_averaging#3.特征值权重法def Eigenvalue_weighting_method(self):# 将矩阵最大特征值对应的特征向量进行归一化处理就得到了权重weight_Eigenvalue_weighting = self.max_eig_vector / np.sum(self.max_eig_vector)# 打印权重向量print("特征值权重法法求得的权重为:", weight_Eigenvalue_weighting)# 返回权重向量的值return weight_Eigenvalue_weightingdef test_run_demo():#comparsion_matrix可以随意修改comparsion_matrix=np.array([[1,1/4,1/9],[4,1,1/2],[9, 2, 1]])weight1 = AHP(comparsion_matrix).Arithmetic_averaging_method()weight2 = AHP(comparsion_matrix).Geometric_averaging_method()weight3 = AHP(comparsion_matrix).Eigenvalue_weighting_method()#运行区域:
test_run_demo()

3.算法效果展示

算术平均法求得的权重为: [0.07243906 0.30125047 0.62631047]
几何平均法求得的权重为: [0.7374984  0.17727613 0.08522547]
特征值权重法法求得的权重为: [0.07239208 0.30116321 0.62644471]
http://www.lryc.cn/news/153361.html

相关文章:

  • 机器学习笔记之最优化理论与方法(三)凸集的简单认识(下)
  • Apipost:API文档、调试、Mock与测试的一体化协作平台
  • Homebrew下载安装及使用教程
  • 【Codeforces】CF193D Two Segments
  • 内存管理概述
  • Spring的重试机制-SpringRetry
  • 水稻叶病害数据集(目标检测,yolo使用)
  • 鸿蒙系列-如何使用好 ArkUI 的 @Reusable?
  • 展锐平台音频框架
  • webpack loader和plugins的区别
  • 适配器模式:接口的平滑过渡
  • vscode搭建springboot开发环境
  • SpringMVC-学习笔记
  • 【STM32】学习笔记(TIM定时器)
  • Jdk8 动态编译 Java 源码为 Class 文件(三)
  • Shell自动化日志维护脚本
  • 设计模式入门笔记
  • 存储成本降低85%,携程历史库场景的降本实践
  • 如何精确掌握函数防抖和函数节流的使用?
  • 【Linux系列】离线安装openjdk17的rpm包
  • Python 没有 pip 包问题解决
  • 并发-Java中的锁(二)--- 重入锁ReentrantLock,公平锁,非公平锁笔记
  • LeetCode每日一题:1921. 消灭怪物的最大数量(2023.9.3 C++)
  • SpringBoot连接MySQL数据库,使用Mybatis框架(入门)
  • 滑动窗口实例6(找到字符串中所有字母异位词)
  • 武林新秀(一)`git init` 初始化一个新的Git仓库
  • gRPC之Interceptor
  • 计算机竞赛 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉
  • ELK安装、部署、调试 (七)kibana的安装与配置
  • 【Npm】的安装和使用教程