数学建模(层次分析法 python代码 案例)

目录

介绍: 

模板:

例题:从景色、花费、饮食,男女比例四个方面去选取目的地

 准则重要性矩阵:

 每个准则的方案矩阵:​

 一致性检验:

 特征值法求权值:

完整代码:

运行结果:

介绍: 

层次分析法(Analytic Hierarchy Process, AHP)是一种多准则决策分析方法,它将多个准则组织成一个层次结构,通过对各个层次之间的比较和权重的计算,最终得到准则的相对重要性和最优解决方案。

层次分析法的基本思想是将复杂的决策问题分解为一系列层次,从总体目标到具体准则和方案,建立层次结构模型。在层次结构模型中,各层次之间的关系通过比较矩阵来表示,比较矩阵中的元素表示各个准则或方案之间的相对重要性。

在层次分析法中,通过对比较矩阵进行一系列计算,可以得到各个准则和方案的权重,从而评估它们的相对重要性。最终,通过计算各个方案的综合评价值,可以选择最优解决方案。

层次分析法的特点是能够处理多个准则之间的相对重要性,能够量化主观判断,并且易于理解和应用。它广泛应用于决策分析、资源分配、评估和排序等领域。

模板:

#以下是一个使用Python实现层次分析法的简单模板:```python
import numpy as npdef ahp(criteria_matrix):n = len(criteria_matrix)weights_matrix = np.zeros((n, n))# Step 1: 计算准则矩阵的列向量归一化column_sums = criteria_matrix.sum(axis=0)normalized_matrix = criteria_matrix / column_sums# Step 2: 计算每个准则的权重weights = normalized_matrix.sum(axis=1) / n# Step 3: 计算每个准则之间的相对重要性for i in range(n):for j in range(n):weights_matrix[i, j] = weights[i] / weights[j]# Step 4: 计算最终权重final_weights = weights_matrix.sum(axis=1) / nreturn final_weights# 测试代码
criteria_matrix = np.array([[1, 1/2, 2], [2, 1, 3], [1/2, 1/3, 1]])
weights = ahp(criteria_matrix)
print("准则的权重:", weights)
```在这个模板中,我们首先定义了一个名为`ahp`的函数,它接收一个准则矩阵作为参数。准则矩阵是一个n×n的二维数组,表示准则之间的相对重要性。在函数内部,我们首先计算准则矩阵的列向量归一化,然后计算每个准则的权重。接下来,我们通过两层循环计算每个准则之间的相对重要性,并将结果存储在权重矩阵中。最后,我们计算权重矩阵每一行的平均值作为最终的权重,并返回结果。在测试代码中,我们创建了一个准则矩阵`criteria_matrix`,然后调用`ahp`函数计算准则的权重,并打印出结果。请注意,这只是一个简单的模板,可以根据具体的应用场景进行修改和扩展。

例题:从景色、花费、饮食,男女比例四个方面去选取目的地

 准则重要性矩阵:

# 准则重要性矩阵,即为我们在这里的时候要输入准则性矩阵criteria = np.array([[1,1/2,4,3],[2,1,5,5],[1/4,1/5,1,1/4],[1/3,1/5,4,1]])

 每个准则的方案矩阵:

# 对每个准则,方案优劣排序,即为方案层也会有一个一致矩阵,所以需要判b1 = np.array([[1, 2, 5], [1 / 2, 1, 2], [1 / 5, 1 / 2, 1]])b2 = np.array([[1, 2, 3], [1 / 2, 1, 2], [1 / 3, 1 / 2, 1]])b3 = np.array([[1,1,3],[1,1,2],[1/3,1/2,1]])b4 = np.array([[1,3,5],[1/3,1,4],[1/5,1/4,1]])b = [b1, b2, b3, b4]

 一致性检验:

进行一致性检验是为了确定层次分析法的结果是否可信和可靠。一致性检验是通过计算一致性指标来评估判断矩阵的相对一致性。

在层次分析法中,判断矩阵是用专家主观判断准则之间的相对重要性构成的,因此可能存在主观性的偏差和一致性问题。如果判断矩阵不一致,那么使用该矩阵计算得到的权重可能是不准确的,从而导致决策结果的偏离。

一致性检验通常使用一致性比率(Consistency Ratio,CR)来进行评估。CR是通过计算判断矩阵的最大特征值和一致性指标的比值得到的。如果CR小于某个阈值(通常为0.1),那么判断矩阵被认为是一致的,可以用来计算权重。如果CR大于阈值,那么判断矩阵存在较大的一致性问题,需要重新进行调整或修改。

通过一致性检验,我们可以对层次分析法的结果进行质量控制,确保决策结果的准确性和可信度。

# 一致性检验
def calculate_weight(data):RI = (0, 0.00001, 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)# 转化为array类型的对象in_matrix = np.array(data)n, n2 = in_matrix.shapeeig_values, eig_vectors = np.linalg.eig(in_matrix)  # np.linalg.eig(matri)返回特征值和特征向量# eigvalues为特征向量,eigvectors为特征值构成的对角矩阵(而且其他位置都为0,对角元素为特征值)max_index = np.argmax(eig_values)  # argmax为获取最大特征值的下标,而且这里是获取实部# print(max_index)max_eig = eig_values[max_index].real  # 这里max_eig是最大的特征值# print(max_eig)eig_=calculate_feature_weight(in_matrix,n)if n > 15:#超过十五个特征,相对效果差CR = Nonewarnings.warn(("无法判断一致性"))else:CI = (max_eig - n) / (n - 1)if RI[n - 1] != 0:CR = CI / RI[n - 1]if CR < 0.1:print("一致性可以被接受")else:print("一致性不能被接受")return max_eig, CR, eig_

 特征值法求权值:

# 特征值法求权重
def calculate_feature_weight(matrix, n):# 特征值法主要是通过求出矩阵的最大特征值和对应的特征向量,然后对其特征向量进行归一化,最后获得权重eigValue, eigVectors = np.linalg.eig(matrix)# np.linalg.eig(matri)返回特征值和特征向量max_index = np.argmax(eigValue)# argmax为获取最大特征值的下标,而且这里是获取实部max_eig = eigValue[max_index].real#这里max_eig是最大的特征值eig_ = eigVectors[:, max_index].real#最大特征值对应的特征向量eig_ = eig_ / eig_.sum()return eig_# 这里返回的是特征向量

完整代码:

#coding=gbk
import numpy as np
import pandas as pd
import warnings# 一致性检验
def calculate_weight(data):RI = (0, 0.00001, 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)# 转化为array类型的对象in_matrix = np.array(data)n, n2 = in_matrix.shape# 判断矩阵是否为方阵,而且矩阵的大小为n,n2eig_values, eig_vectors = np.linalg.eig(in_matrix)  # np.linalg.eig(matri)返回特征值和特征向量# eigvalues为特征向量,eigvectors为特征值构成的对角矩阵(而且其他位置都为0,对角元素为特征值)max_index = np.argmax(eig_values)  # argmax为获取最大特征值的下标,而且这里是获取实部# print(max_index)max_eig = eig_values[max_index].real  # 这里max_eig是最大的特征值# print(max_eig)eig_=calculate_feature_weight(in_matrix,n)if n > 15:#超过十五个特征,相对效果差CR = Nonewarnings.warn(("无法判断一致性"))else:CI = (max_eig - n) / (n - 1)if RI[n - 1] != 0:CR = CI / RI[n - 1]if CR < 0.1:print("一致性可以被接受")else:print("一致性不能被接受")return max_eig, CR, eig_# 特征值法求权重
def calculate_feature_weight(matrix, n):# 特征值法主要是通过求出矩阵的最大特征值和对应的特征向量,然后对其特征向量进行归一化,最后获得权重eigValue, eigVectors = np.linalg.eig(matrix)# np.linalg.eig(matri)返回特征值和特征向量max_index = np.argmax(eigValue)# argmax为获取最大特征值的下标,而且这里是获取实部max_eig = eigValue[max_index].real#这里max_eig是最大的特征值eig_ = eigVectors[:, max_index].real#最大特征值对应的特征向量eig_ = eig_ / eig_.sum()return eig_# 这里返回的是特征向量if __name__ == "__main__":# 准则重要性矩阵,即为我们在这里的时候要输入准则性矩阵criteria = np.array([[1,1/2,4,3],[2,1,5,5],[1/4,1/5,1,1/4],[1/3,1/5,4,1]])# 对每个准则,方案优劣排序,即为方案层也会有一个一致矩阵,所以需要判b1 = np.array([[1, 2, 5], [1 / 2, 1, 2], [1 / 5, 1 / 2, 1]])b2 = np.array([[1, 2, 3], [1 / 2, 1, 2], [1 / 3, 1 / 2, 1]])b3 = np.array([[1,1,3],[1,1,2],[1/3,1/2,1]])b4 = np.array([[1,3,5],[1/3,1,4],[1/5,1/4,1]])b = [b1, b2, b3, b4]matrix_in = criteriamax_eigen, CR, criteria_eigen = calculate_weight(matrix_in)print("准则层:最大特征值:{:.5f},CR={:<.5f},检验{}通过".format(max_eigen, CR, '' if CR < 0.1 else "不"))print("准则层权重为{}\n".format(criteria_eigen))max_eigen_list = []CR_list = []eigen_list = []for i in b:max_eigen, CR, eigen = calculate_weight(i)#每个准则max_eigen_list.append(max_eigen)#存最大特征值CR_list.append(CR)#存CReigen_list.append(eigen)#存特征向量pd_print = pd.DataFrame(eigen_list, index=["准则" + str(i) for i in range(0, criteria.shape[0])],columns=["方案" + str(i) for i in range(0, b[0].shape[0])])pd_print.loc[:, '最大特征值'] = max_eigen_listprint("方案层")print(pd_print)print("\n")# 目标层object = np.dot(criteria_eigen.reshape(1, -1), np.array(eigen_list))print("\n目标层", object)print("最优选择方案{}".format(np.argmax(object)))print("即为苏杭")

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/765202.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.6 学Python能干什么,Python的应用领域有哪些

Python能干什么&#xff0c;Python的应用领域 Python 作为一种功能强大的编程语言&#xff0c;因其简单易学而受到很多开发者的青睐。那么&#xff0c;Python 的应用领域有哪些呢&#xff1f; Python 有着非广泛的应用&#xff0c;几乎所有大中型互联网公司都在使用 Python&a…

基于甘特图的资源调度优化策略

资源在项目管理中是一个永恒的话题。无论人力、物力还是财力资源,总是捉襟见肘,都希望用最少的资源完成最大的工作。这就要求我们在资源调度方面果断精准,做到最优化。而甘特图作为项目时间规划的重要工具,恰恰能为资源调度提供绝佳帮助。 甘特图能反映出任务之间的制约关系,有…

Flutter 项目架构技术指南

Flutter 项目架构技术指南 视频 https://www.bilibili.com/video/BV1rx4y127kN/ 前言 原文 https://ducafecat.com/blog/flutter-clean-architecture-guide 探讨Flutter项目代码组织架构的关键方面和建议。了解设计原则SOLID、Clean Architecture&#xff0c;以及架构模式MVC…

(MATLAB)第二十一章 Simulink仿真设计初步

Simulink是MATLAB的重要组成部分&#xff0c;可以非常容易地实现可视化建模&#xff0c;并把理论研究和工程实践有机地结合在一起&#xff0c;不需要书写大量程序&#xff0c;只需要使用鼠标和键盘对已有模块进行简单的操作和设置。 21.1 Simulink简介 Simulink是MATLAB软件的…

linux热键,man手册介绍

目录 热键 tab ctrl c ctrl r man 区段 快捷键 热键 tab 可以看到以输入的内容为开头的指令,但无法选择: 当输入的内容匹配到的内容只有一个时,可以自动补全 可以用于输入路径时,自动补全文件名 ctrl c 让当前的程序停掉,可以在 程序或指令出问题而自己无法停止时 使用…

LeetCode---126双周赛

题目列表 3079. 求出加密整数的和 3080. 执行操作标记数组中的元素 3081. 替换字符串中的问号使分数最小 3082. 求出所有子序列的能量和 一、求出加密整数的和 按照题目要求&#xff0c;直接模拟即可&#xff0c;代码如下 class Solution { public:int sumOfEncryptedInt…

设计模式 适配器模式

1.背景 适配器模式&#xff0c;这个模式也很简单&#xff0c;你笔记本上的那个拖在外面的黑盒子就是个适配器&#xff0c;一般你在中国能用&#xff0c;在日本也能用&#xff0c;虽然两个国家的的电源电压不同&#xff0c;中国是 220V&#xff0c;日本是 110V&#xff0c;但是这…

ES的集群节点发现故障排除指南(2)

本文是ES官方文档关于集群节点发现与互联互通的问题排查指南内容&#xff0c;第二部分。 原文参考及相关内容&#xff1a; 英文原文&#xff08;官网&#xff09; 第一部分-&#xff08;1&#xff09; 已选出主节点但状态不稳定&#xff1f; 当一个节点赢得主节点选举时&…

XR“黑话”

MTP&#xff08;Motion-To-Photon Latency&#xff09;&#xff1a;实际人体发生运动到图像显示到屏幕上的时间延迟。早期一些vr产生晕动症的主要原因。 ATW&#xff08;Asynchronous Timewarp&#xff09;&#xff1a;主要解决两个问题&#xff0c;一是延迟&#xff0c;二是补…

AI大模型学习在当前技术环境下的重要性与发展前景

目录 前言1 学科基础与技能要求1.1 数学基础的深厚性1.2 编程能力的必要性1.3 对特定领域业务场景的了解 2 模型结构与算法的优化2.1 模型结构的不断演进2.2 算法优化的重要性2.3 准确性与效率的提升 3 AI大模型学习的应用场景3.1 自然语言处理3.2 计算机视觉3.3 推荐系统 结语…

YOLO算法改进Backbone系列之:Dfformer

摘要&#xff1a;配备多头自注意&#xff08;MHSA&#xff09;的模型在计算机性能方面取得了显著的性能。它们的计算复杂性与输入特征图中的像素平方成正比&#xff0c;导致处理缓慢&#xff0c;特别是在处理高分辨率图像时。新型的token Mixer 被提出作为MHSA的替代品&#xf…

抖音,剪映,TikTok,竖屏短视频转场pr模板视频素材

120个叠加效果视频转场过渡素材&#xff0c;抖音,剪映,TikTok,短视频转场pr模板项目工程文件。 效果&#xff1a;VHS、光效、胶片、霓虹灯闪光、X射线、信号、老电影等。 适用软件&#xff1a;Adobe Premiere Pro 2018 12.0或更高版本。 视频素材与大多数应用程序兼容&#xff…

学习几个地图组件(基于react)

去年开发时用的公司封装的地图组件&#xff0c;挺方便的&#xff0c;但是拓展性不强&#xff0c;所以看看有哪些优秀的开源地图组件吧 1、React Leaflet 介绍&#xff1a;开源的JavaScript库&#xff0c;用于在web上制作交互式地图&#xff0c;允许你使用React组件的方式在应…

基于Spring Boot技术的幼儿园管理系统

摘 要 随着信息时代的来临&#xff0c;过去的传统管理方式缺点逐渐暴露&#xff0c;对过去的传统管理方式的缺点进行分析&#xff0c;采取计算机方式构建幼儿园管理系统。本文通过课题背景、课题目的及意义相关技术&#xff0c;提出了一种活动信息、课程信息、菜谱信息、通知公…

【Linux】线程的概念{虚拟地址堆区细分/缺页中断/页/初识线程/创建线程/优缺点}

文章目录 1.前导知识1.1 虚拟地址空间的堆区1.2 缺页中断1.3ELF文件格式1.4页/页框/页帧/页表/MMU1.5虚拟地址到物理地址 2.初识Linux线程2.1之前所学的进程2.2线程的引入2.3如何理解线程2.4如何理解轻量级进程 3.创建线程3.1pthread_create()函数3.2程序测试3.3Makefile怎么写…

时序预测 | Matlab实现BiTCN-GRU双向时间卷积神经网络结合门控循环单元时间序列预测

时序预测 | Matlab实现BiTCN-GRU双向时间卷积神经网络结合门控循环单元时间序列预测 目录 时序预测 | Matlab实现BiTCN-GRU双向时间卷积神经网络结合门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现BiTCN-GRU双向时间卷积神经网络结…

计算机专业保研辅导

接计算机专业保研辅导

C语言:自定义类型(结构体)

目录 一、结构的特殊声明二、结构的自引用三、结构体内存对齐1.对齐规则2.为什么存在内存对齐(1)平台原因 (移植原因)&#xff1a;(2)性能原因&#xff1a; 3.修改默认对齐数 四、结构体传参五、结构体实现位段1.什么是位段2.位段的内存分配3.位段的跨平台问题4.位段使用的注意…

Java字符串常量池

引言&#xff1a; 在Java编程中&#xff0c;字符串常量池一直是一个备受关注的话题。本文将从创建对象的思考、字符串常量池、再谈String对象创建等方面深入探讨Java字符串常量池。 一、创建对象的思考 在Java中&#xff0c;我们可以使用new关键字来创建对象&#xff0c;比如&a…

简单函数_素数对

任务描述 两个相差为2的素数称为素数对&#xff0c;如5和7&#xff0c;17和19等&#xff0c;本题目要求找出所有两个数均不大于n的素数对。输入格式: 一个正整数n。1 < n < 10000。输出格式: 所有小于等于n的素数对。每对素数对输出一行&#xff0c;中间用单个空格隔开…