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

news2024/11/16 11:35:56

目录

介绍: 

模板:

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

 准则重要性矩阵:

 每个准则的方案矩阵:​

 一致性检验:

 特征值法求权值:

完整代码:

运行结果:

介绍: 

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

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

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

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

模板:

#以下是一个使用Python实现层次分析法的简单模板:

```python
import numpy as np

def 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) / n
    
    return 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.shape

    eig_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 = None
        warnings.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,n2

    eig_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 = None
        warnings.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 = criteria
    max_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)#存CR
        eigen_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_list
    print("方案层")
    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.coloradmin.cn/o/1538633.html

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

相关文章

2024最新版pycharm激活码【资源共享】一键复制

好用的话 家人们记得点个赞喔 VPXI6TDKOQ-eyJsaWNlbnNlSWQiOiJWUFhJNlRES09RIiwibGljZW5zZWVOYW1lIjoi5rC45LmF5rA5rS7IHd3d8K3YWppaHVvwrdjb20iLCJsaWNlbnNlZVR5cGUiOiJQRVJTT05BTCIsImFzc2lnbmVlTmFtZSI6IiIsImFzc2lnbmVlRW1haWwiOiIiLCJsaWNlbnNlUmVzdHJpY3Rpb24iOiIiLCJjaG…

STM32不使用中断实现定时器微秒级精确延时

我们在写代码的时候避免不了要使用延时函数&#xff0c;很多延时函数都是使用中断或者tick来实现的&#xff0c;tick的方式最大到毫秒ms级别&#xff0c;通过中断方式的通用定时器来实现&#xff0c;如果实现1us的延时那么每1us就来一次中断&#xff0c;很影响cpu的效率。 本文…

haproxy 高可用

一 haproxy HAProxy简介 HAProxy提供高可用、负载均衡以及基于TCP和HTTP的应用代理&#xff0c;适合处理高负载站点的七层数据请求。类似的代理服务可以屏蔽内部真实服务器&#xff0c;防止内部服务器遭受攻击。 HAProxy特点和优点&#xff1a; 1.支持原声SSL,同时支持客户端和…

【Android 源码】Android源码下载指南

文章目录 前言安装Repo初始化Repo选择分支没有梯子替换为清华源 有梯子 下载源码下载开始参考 前言 这是关于Android源码下载的过程记录。 环境&#xff1a;Windows上通过VMware安装的Ubuntu系统 安装Repo 创建Repo文件目录 mkdir ~/bin PATH~/bin:$PATH下载Repo工具&#…

火哥Windows内核第五期

主要讲解windows的保护模式&#xff0c;系统调试&#xff0c;异常发现及处理等等。事件等待、异常、软件调试、内存管理、消息机制、调试器开发项目、内核工具开发项目&#xff0c;发展方向:CC驱动开发&#xff0c;软件逆向&#xff0c;破解&#xff0c;游戏保护&#xff0c;反…

huggingface的transformers训练bert

目录 理论 实践 理论 https://arxiv.org/abs/1810.04805 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一种自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;由Google在2018年提出。它是基于Transformer模型的预训练方法…

力扣HOT100 - 128. 最长连续序列

解题思路&#xff1a; 注意&#xff1a; 1.Set不能直接排序&#xff0c;必须要转换成ArrayList或者LinkedList后用Collections.sort()方法进行排序。 &#xff08;Queue也不能直接排序&#xff0c;排序方法同Set&#xff09; 2.连续的序列不能只找第一个&#xff0c;因为不…

dbscan算法实现鸢尾花聚类(python实现)

DBscan算法原理 : dbscan算法-CSDN博客 法一(调库) : 直接调库 : import numpy as np import matplotlib.pyplot as plt from sklearn import datasets from sklearn.cluster import DBSCAN from sklearn.decomposition import PCA from sklearn.discriminant_analysis …

【数据结构刷题专题】——二分查找

二分查找 二分查找模板题&#xff1a;704. 二分查找 二分查找前提&#xff1a; 有序数组数组中无重复元素 左闭右闭&#xff1a; class Solution { public:int search(vector<int>& nums, int target) {int left 0;int right nums.size() - 1;while (left <…

重新配置node.js,npm,环境变量

起因是检查最近收到的一些朋友分享给我的各种资料&#xff0c;什么前端&#xff0c;后端&#xff0c;java,go,python等语言&#xff0c;想着将一个模拟QQ音乐的一个源代码进行跑通&#xff0c;看看有什么特别之处。如下图 出现了node环境路径问题&#xff0c;参考链接 https:/…

回收站的数据删了可以找回来吗?方法已备好

在数字化时代&#xff0c;数据的安全性与恢复问题逐渐受到大家的关注。回收站&#xff0c;作为电脑中存储已删除文件的地方&#xff0c;常常被视为数据恢复的“救命稻草”。然而&#xff0c;当回收站中的数据也被删除时&#xff0c;许多人可能会感到无助和困惑。本文旨在探讨回…

nuclei使用方法

nuclei使用方法 查看帮助 nuclei -h 列出所有模板 nuclei -tl 查找某种cms的相关漏洞模板&#xff0c;wordpress为例 nuclei -tl -tc "contains(name,wordpress)"便会列出内容里含有wordpress关键字的漏洞检测模板 使用与某cms相关的所有漏洞模板进行扫描&#…

每日一题 --- 209. 长度最小的子数组[力扣][Go]

长度最小子数组 题目&#xff1a; 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续 子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度**。**如果不存在符合条件的子数组&#xff0c…

web学习笔记(四十三)ajax

目录 1.相关基础概念 1.1客户端与服务器 1.2URL地址 1.3 客户端和服务器端通信的过程 1.4 一个URL地址放入浏览器&#xff0c;到页面渲染发生了什么事情 1.5 数据 1.6资源的请求方式 2.Ajax 2.1什么是Ajax 2.2 jQuery 中的Ajax 2.2.1 $.get()的语法 2.2.2$.post()…

Linux:http协议初步认识

文章目录 OSI七层模型http协议域名路径信息请求和响应 编写一个httpserver OSI七层模型 在结束了前面对于序列化反序列化等内容的学习后&#xff0c;重新回到对于OSI模型的部分 如上所示的是对于OSI接口的示意图&#xff0c;在这当中可以看到会话层的概念&#xff0c;会话层的…

简介:KMeans聚类算法

在机器学习中&#xff0c;无监督学习一直是我们追求的方向&#xff0c;而其中的聚类算法更是发现隐藏数据结构与知识的有效手段。聚类是一种包括数据点分组的机器学习技术。给定一组数据点&#xff0c;我们可以用聚类算法将每个数据点分到特定的组中。 理论上&#xff0c;属于同…

SQL Server 2008R2 日志文件大小设置及查询

SQL Server 2008R2 建立数据库存在日志无限增长问题&#xff0c;造成磁盘内存不足。本文解决这个问题&#xff0c;如下&#xff1a; 1.设置日志文件的最大大小 USE master; GO ALTER DATABASE [D_total] MODIFY FILE (NAME D_total_log, -- 日志文件的逻辑名称MAXSIZE 200…

LeetCode Python - 69. x 的平方根

目录 题目描述解法运行结果 题目描述 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 注意&#xff1a;不允许使用任何内置指数函数和算符&#xff0c;例如 pow(x, 0.…

稀碎从零算法笔记Day21-LeetCode:单词规律

题型&#xff1a;哈希表、字符串 链接&#xff1a;290. 单词规律 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配&#xff0c;例如&am…

先进电机技术 —— 何为轴电压?

一、特定场景举例 长线驱动指的是在电动机与变频器之间存在较长的连接电缆&#xff0c;尤其是在大型工业应用中&#xff0c;电机可能远离变频器几十米甚至上百米。这种情况下&#xff0c;变频器通过长线向电动机传输功率时&#xff0c;可能会加剧电机轴电压和轴电流的产生&…