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

目录

介绍: 

模板:

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

 准则重要性矩阵:

 每个准则的方案矩阵:​

 一致性检验:

 特征值法求权值:

完整代码:

运行结果:

介绍: 

层次分析法(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("即为苏杭")

运行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于ssm新生报到系统论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对新生报到信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差…

containerd源代码分析: 整体架构

本文从代码的大的整体组织上来熟悉containerd项目 containerd项目总的说是一个cs模式的原生控制台程序组。containerd作为服务端来接收处理client的各种请求&#xff0c;如常用的拉取推送镜像&#xff0c;创建查询停止容器&#xff0c;生成快照&#xff0c;发送消息等。client/…

About Online Taxis

About Online Taxis 关于网络预约出租汽车&#xff08;网约车&#xff09; 1&#xff09;网络预约出租汽车 驾驶员证&#xff08;人证&#xff09; 2&#xff09;网络预约出租汽车 运输证&#xff08;车证&#xff09; 民之苦已久......

【PHP】通过PHP安装数据库并使数据初始化

一、前言 有些CMS在部署的时候不用使用数据库工具&#xff0c;而是通过数据库安装页面就能完成数据库创建和数据填充&#xff0c;所以自己就想动手做一个这样的功能&#xff0c;这样在给别人安装系统的时候就不用再那么麻烦了&#xff0c;直接一键安装解决了。 二、效果图 输…

jupyter notebook使用教程

首先是打开jupyter notebook 下载安装好之后&#xff0c;直接在命令行中输入‘jupyter notebook’即可跳转到对应页面 还可以进入想要打开的文件夹&#xff0c;然后再文件夹中打开中断&#xff0c;执行‘jupyter notebook’命令&#xff0c;就能够打开对应文件界面的jupyter …

iOS模拟器 Unable to boot the Simulator —— Ficow笔记

本文首发于 Ficow Shen’s Blog&#xff0c;原文地址&#xff1a; iOS模拟器 Unable to boot the Simulator —— Ficow笔记。 内容概览 前言终结模拟器进程命令行改权限清除模拟器缓存总结 前言 iOS模拟器和Xcode一样不靠谱&#xff0c;问题也不少。&#x1f602; 那就有病治…

时序预测 | Matlab基于BiTCN-LSTM双向时间卷积长短期记忆神经网络时间序列预测

时序预测 | Matlab基于BiTCN-LSTM双向时间卷积长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab基于BiTCN-LSTM双向时间卷积长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab基于BiTCN-LSTM双向时间卷积长短期记忆神经网络时…

PSO-CNN-SVM,基于PSO粒子群优化算法优化卷积神经网络CNN结合支持向量机SVM数据分类(多特征输入多分类)-附代码

PSO-CNN-SVM&#xff0c;基于PSO粒子群优化算法优化卷积神经网络CNN结合支持向量机SVM数据分类 下面是一个大致的步骤&#xff1a; 数据准备&#xff1a; 准备训练集和测试集数据。对数据进行预处理&#xff0c;包括归一化、标准化等。 设计CNN模型&#xff1a; 设计合适的CNN…

vue.config.js配置项

vue.config.js配置项 vue-cli3 脚手架搭建完成后&#xff0c;项目目录中没有 vue.config.js 文件&#xff0c;需要手动创建 创建vue.config.js vue.config.js(相当于之前的webpack.config.js) 是一个可选的配置文件&#xff0c;如果项目的 (和 package.json 同级的) 根目录中存…

基于OrangePi Zero2的智能家居项目(准备阶段)

一、需求及项目准备&#xff08;前期准备&#xff09; 1、各类的需求 以及复习巩固的东西 2、系统框架图 3、硬连接线 3.1硬件准备 USB充电头&#xff08;当前实测可用&#xff1a;5V/2.5A)x1、USB转TYPE-Cx1、SU-03Tx1、烟雾报警模块x1、4路继 电器x1、 OLEDx1、 电磁锁x1&a…

【C语言】多文件编程以及static关键字

1、多文件编程 把函数声明放在头文件xxx.h中&#xff0c;在主函数中包含相应头文件在头文件对应的xxx.c中实现xxx.h声明的函数 a、主文件 #include<stdio.h> #include "MyMain.h"//需要包含头文件&#xff0c;头文件包含我们自定义的函数int main(){int num…

JWT的实现及其适用场景

官方文档 一、什么是JWT JWT&#xff08;全称JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;它定义了一种紧凑且自包含的方式&#xff0c;用于作为JSON对象在各方之间安全地传输信息。此信息是经过数字签名的&#xff0c;因此可以验…

分页多线程处理大批量数据

1.业务场景 因为需要从一个返利明细表中获取大量的数据&#xff0c;生成返利报告&#xff0c;耗时相对较久&#xff0c;作为后台任务执行。但是后台任务如果不用多线程处理&#xff0c;也会要很长时间才能处理完。 另外考虑到数据量大&#xff0c;不能一次查询所有数据在内存…

LaTeX论文汇报ppt模板

在 LaTeX 的 beamer 类中&#xff0c;您可以使用不同的主题和模板来创建适合论文汇报的演示文稿。以下是一个使用了比较正式的 Madrid 主题的模板&#xff0c;您可以基于这个模板进行定制和扩展&#xff0c;以满足您论文汇报的需求。当需要在ppt输入中文的时候需要将第一行中的…

北京中科富海低温科技有限公司确认出席2024第三届中国氢能国际峰会

会议背景 随着全球对清洁能源的迫切需求&#xff0c;氢能能源转型、工业应用、交通运输等方面具有广阔前景&#xff0c;氢能也成为应对气候变化的重要解决方案。根据德勤的报告显示&#xff0c;到2050年&#xff0c;绿色氢能将有1.4万亿美元市场。氢能产业的各环节的关键技术突…

大数据技术在工厂生产数字转型中的应用与价值

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验&#xff01;希望我的分享能帮助到您&#xff01;如需帮助可以评论关注私信我们一起探讨&#xff01;致敬感谢感恩&#xff01; 随着大数据技术的快速发展&#xff0c;越来越多的企业开始关注并应用大数据技术&#x…

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

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

tftp使用

下载 sudo apt-get install tftpd-hpa 创建文件夹 mkdir /home/ljl/work/tftpd mkdir /home/ljl/tftpd chmod 777 tftpd/编辑 sudo vim /etc/default/tftpd-hpa //服务器端 sudo apt-get install tftp-hpa //客户端编辑权限 sudo vi /etc/default/tftpd-hpa 内容&#xff1…

jenkins构建完成后部署到本机,无法读取容器外文件夹

项目背景&#xff1a; Dockerjenkins 构建完成后&#xff0c;要把打包的dist文件夹内容移动到网站目录 /www/wwwroot/xxxxxx 文件夹下&#xff1b;但是获取不到jenkins容器外的文件夹。 解决办法&#xff1a; 在容器中&#xff0c;添加挂载/映射本机目录&#xff0c;把网站…

两直线交点算法 C

求两直线交点算法 有中间交点 则CD在AB异侧 A B A C A B A D \nobreak AB \times AC \newline AB \times AD ABACABAD 异号 叉乘后相乘小于零 等于零的几种情况 A B C与AB共线 D与AB共线 求交点&#xff0c;可由面积比例用叉乘计算 C E C D S A B C S A B C D . \frac…