python开发ahp算法应用(1024祝各位程序员节日快乐)

python 层次分析(AHP) 传统定性分析方法类似专家打分、专家判断等,仅能将指标简单地划分为几个层级(类似非常重要、比较重要、一般、比较不重要、非常不重要),这样导致部分存在差别但是不大的指标得到了同样的权重,受主观因素影响,无法对最终决策做出更好的帮助。计算权重向量以及一致性检验.(步骤如上文,为了简便文章,本次计算采用python代码,以和积法求解权重,下文将详细介绍)计算权重向量以及一致性检验.(步骤如上文,为了简便文章,本次计算采用python代码,以和积法求解权重,下文将详细介绍)其中,n为矩阵阶数,此处n=4。 阅读详情

开发背景:

ahp 又名层次分析法,是一个多因素多层次的决策算法。为了将层次分析算法的流程简易化,将算法的作用生活化,于是我在一个夜深人静的晚上准备抽空做这个软件。网络上有十分专业的ahp算法分析软件,其结构类似于SPSS,不管是输入还是输出都十分规范,过程中用到的矩阵明明白白,但唯一的缺点就是,想使用这个软件必须得亲手建立矩阵,而生活中没有谁会因为要做一个简单的决策去写枯燥的矩阵,去学习层次分析,因此我用python的tkinter做GUI,以点击的方式,自动为用户生成多个选择框,无需频繁构建矩阵。

开发工具:

编程语言:python,所用模块:tkinter,matplotlib,numpy,PIL,seaborn。操作系统:windows。

算法简介:

层次分析法(Analytic Hierarchy Process,简称AHP)是美国运筹学家、匹兹堡大学T. L. Saaty教授在20世纪70年代初期提出的, AHP是对定性问题进行定量分析的一种简便、灵活而又实用的多准则决策方法。它的特点是把复杂问题中的各种因素通过划分为相互联系的有序层次,使之条理化,根据对一定客观现实的主观判断结构(主要是两两比较)把专家意见和分析者的客观判断结果直接而有效地结合起来,将一层次元素两两比较的重要性进行定量描述。而后,利用数学方法计算反映每一层次元素的相对重要性次序的权值,通过所有层次之间的总排序计算所有元素的相对权重并进行排序。该方法自1982年被介绍到我国以来,以其定性分析与定量分析相结合地处理各种决策因素的特点,以及其系统灵活简洁的优点,迅速地在我国社会经济各个领域内,如能源系统分析、城市规划、经济管理、科研评价等,得到了广泛的重视和应用。

实现方法:

层次分析法(ahp)需要输入两个层次,分别为方案层,准则层。最终返回一个层次,目标层。

为了不麻烦用户去输入矩阵,而是通过简单的选择我们后台帮助用户补全矩阵,仔细观察ahp算法中的方案层和准则层,他们实际上都是对称矩阵,只需要得到‘一半’的矩阵,后续用python实现它的对称即可,而这‘一半’的矩阵,又都是两两因素层的因素,或者准则层的准则的比值,这一点完全可以靠多个选择题来收集数据。

得到数据后,将其加工成准则层和方案层的矩阵,按照ahp算法的流程:建立层次结构模型,构造比较判别矩阵,计算单排序向量和一致性检测,总的排序选优。这部分我写了完整的分析流程。

import numpy as np

class Ahp_method(object):
    def __init__(self,array_rule,list_item):
        if array_rule.shape[0] != array_rule.shape[1]:
            raise Exception('你的准则层矩阵不够方')
        for i in list_item:
            if i.shape[0] != i.shape[1]:
                raise Exception('你的方案层某矩阵不够方')

        self._array_rule = array_rule  # 准则层矩阵
        self._lsit_item = list_item  # 包含多个方案层矩阵的列表
        self._character : float  # 最大特征值
        self._dr : int  = self._array_rule.shape[0]  # 准则层层矩阵的维度
        self._di : int  # 方案层矩阵的维度
        self.CI : float  # 一致性指标
        self.CR : float  # 一致性比率
        self.CR_RULE = [0,0,0,0.58,0.90,1.12,1.26,1.32,1.41,1.45,1.49,1.52,1.54]

    def get_character(self):
        '''计算特征值'''
        self._character = np.round(max(np.linalg.eig(self._array_rule)[0]),3)
        return self._character

    def get_CI(self):
        self.CI = (self._character - self._dr) / (self._dr - 1)
        return  self.CI

    def get_CR(self):
        self.CR = self.get_CI()/self.CR_RULE[self._dr]
        return self.CR

    @staticmethod
    def get_ar(lst):
        '''
        输入一维列表, 返回转换成对称矩阵后的维度
        :param lst:
        :return:n:维度
        '''
        l,v,d = len(lst),1,1
        while True:
            if v == l:
                return d + 1
            if v > l:
                raise Exception('传入的矩阵存在错误')
            v += d + 1
            d += 1

    @staticmethod
    def ret_np(ori, roun:int=3):
        '''
        :param ori:ret value()返回的字典
        :param n: 维度
        :return: array
        '''
        n = Ahp_method.get_ar(ori)
        lst, res = [], []
        for v in ori:
            lst.append(v)
        ind = 0
        for i in range(n):
            inner = []
            for j in range(n):
                if i == j:
                    inner.append(1)
                elif i < j:
                    inner.append(lst[ind])
                    ind += 1
                elif i > j:
                    inner.append(round(1 / res[j][i], roun))
            res.append(inner)
        return np.array(res)

    def get_one(self,array):
        '''得到某个矩阵的标准化特征向量'''
        d = array.shape[0]
        lst_root = []
        for i in range(d):
            lst_root.append(Ahp_method.multi(array[i])**(1/d))  # 每行乘积的d次方根
        lst_sum = sum(lst_root)
        final = np.array([np.round(i/lst_sum,3) for i in lst_root])
        print('final',final)
        return final

    @staticmethod
    def multi(n):
        result = 1
        for i in n:
            result = result * i
        return result

    def check(self):
        '''准则层向量的一致性检验'''
        self.get_character()
        cr = self.get_CR()
        if not cr < 0.1:
            return 0,f'未通过一致性检验,检验结果为{self.CR}>0.1'
        else:
            return 1,f'一致性检验结果为{self.CR},小于0.1'

    '''得到所有矩阵的标准化特征向量'''
    def get_all(self):
        self._array_rule_character = self.get_one(self._array_rule)
        self._list_item_character = []
        for i in range(len(self._lsit_item[0][0])):
            buf = []
            for j in [self.get_one(i) for i in self._lsit_item]:
                buf.append(j[i])
            self._list_item_character.append(np.array(buf[:]))
            buf.clear()


    def get_final(self):
        '''最终排序权值'''
        self.res = [i.dot(self._array_rule_character.T) for i in self._list_item_character]
        return self.res

    def process(self):
        print(self.check())
        self.get_all()
        return self.get_final()

这一部分依靠numpy库可以轻松实现,numpy不只支持数组,它更支持矩阵,求逆,求特征向量,求矩阵运算都有十分强大的api,此处不做赘述。

得到总的排序选优结果后,用matplotlib+seaborn实现柱状图的显示和结果的美化,将输出的结果储存到本地,用tkinter打开,优化用户体验。(其实用户就是我,就我自己用。。。)

细节回顾:

整个流程看起来非常简单,在我第一天做这东西的时候,我预计是一个晚上做完,由于这个原因,我就当他是个小demo,根本没准备维护他,或者想到要解耦,架构什么的更没有想到,所以就是一口气顺着往下写,再加上tkinter不是非常专业的GUI工具,前后端分离性较差,写着写着就有了屎山代码的味儿,尽管我第一天是各种注释各种写class封装。

然后悲剧来了,有时候遇到小麻烦不说,主要变量不好找,才七百行的代码就分了仨文件,硬着头皮给他干完了。

在写这个小软件的过程中也有些珍贵的东西:

1.循环中为容器添加多参数的匿名函数函数名,容易出现bug。见第一篇博

2.pyinstaller打包exe,在其他操作系统运行时,程序中matplotlib用到的字体找不到,这个的解决方法是直接将自己做图表用到的字体复制到根目录,用相对路径的方式导入字体。

3.其他操作系统或电脑打开该GUI布局错乱,解决方法:统一布局方式,不要将pack布局和place混合使用。

4.在其他计算机运行时,tkinter中的字体丢失,目前没找到办法,是个bug。

5.tkinter真滴就自己玩玩好,真想写个让自己心情舒畅的东西,还是用web好。

6.tkinter和matplotlib不大对付,他俩一同时出来好像就要打架,解决方法当然是matplotlib先存储,然后用tkinter打开存储的图片。

软件使用方法:

1.打开抉择.exe。

 2.进入首页,run。

 3.点击箭头选择准则层数量。

 4.填写准则层内容(此处我选择的是对书籍的挑选标准,假如我准备买书关心的是这三个准则),点击NEXT。

5.填写方案层,此处略。

6.按要求填写,按照你的两层输入,系统自动生成一些问题 ,回答后得到结果(此处为准则层的问题),如图,左边为准则层的益处和有趣,你更偏向哪个?就点击哪个,距离中间越远的按钮,表示程度越深,一般不要点击太深,因为这是按照ahp 的标度尺13579做的按钮,一般点蓝色或者淡蓝色即可,除非你梵蒂冈要和美国比GDP,你可点击红色。图中第三行的1/12表示一共有十二个问题,现在是第一个问题。

 7.等待进度条,numpy计算起来有多快肯定不用我说,做这个的意义,懂得都懂,嘿嘿,就是好看。tkinter不能直接展示gif,不过可以用canvas容器,PIL打开图像,将其迭代器打开,放在画布里循环展示图片。

8.结果如下,按图中来说哆啦A梦是这三本里最适合我的图书了,不过摸着良心说话,我偏袒它了。

9.一致性比率:小于0.1即为可信,通过一致性检验,他的意义就是,用户输入的数据并不自相矛盾。上图中未通过一致性比率, 是因为我在输入准则层数据的时候做了一个自相矛盾的选择,比如a>b,b>c,但是当比较a和c的时候,我选择了a<c,这样会导致一定程度的不可信,但结局确实比较符合我的心里预期,如果非给我看着三本书,我首选是看会哆啦A梦,然后是数据挖掘,最后是三国演义。

10.额外功能,换肤。

总结:

这是一个python开发,核心算法为ahp,主要价值为简化用户输入,将算法日常化的exe软件,Windows和Ubuntu的平台都可以使用,缺点是在不同的环境中可能出现字体丢失,布局轻微变形的情况,但不影响功能的使用。目前简易实现ahp算法的sdk以及具体资源准备在优快云上传,过审可能要几天,粗略估计应该只有我一个人会用它,不过我觉得这个东西还是很有意义的。最起码我不用因为选择困难症发愁了。

PS:完整代码就不发了, 因为没有完整解耦的缘故,整个流程看起来会比较枯燥。再简单的项目,都不能想着一口气写完,不然麻烦大大滴。

【数模百科】一文快速讲清楚层次分析法AHP(附python代码和参考美赛论文) 层次分析法AHP的原理、代码和参考论文 阅读详情

相关推荐

AHP层次分析法python实现

AHP矩阵python实现过程

m0_52392182的博客 388

AHP分析法(python代码实现)

层次分析法(Analytic Hierarchy Process (AHP))是的一种主观赋值评价方法以及代码,内附源码。

xiaziqiqi的博客 7728

python实现AHP算法的方法实例(层次分析法)

一、层次分析法原理 层次分析法(Analytic Hierarchy Process,AHP)由美国运筹学家托马斯·塞蒂(T. L. Saaty)于20世纪70年代中期提出,用于确定评价模型中各评价因子/准则的权重,进一步选择最优方案。该方法仍具有较强的主观性,判断/比较矩阵的构造在一定程度上是拍脑门决定的,一致性检验只是检验拍脑门有没有自相矛盾得太离谱。 相关的理论参考可见:wiki百科 二、代码实现 需要借助Python的numpy矩阵运算包,代码最后用了一个b1矩阵进行了调试,相关代码如下,具体的实现流程已经用详细的注释标明,各位小伙伴有疑问的欢迎留言和我一起讨论。 import nu

层次分析法运用python完成

在Python中,你可以使用NumPy库进行矩阵操作和线性代数计算,使用SciPy库来计算特征值和一致性比率等指标。3. 进行一致性检验:计算对比矩阵的一致性,以确保所输入的判断是合理且一致的。可以使用AHP中的一致性指标,如一致性比率(Consistency Ratio),来进行检验。4. 计算权重向量:使用特征值法或其他相关方法,通过对比矩阵的特征向量计算各个准则和选择的权重。5. 进行一致性检验(可选):对计算得到的权重向量进行一致性检验,以确保权重计算的结果是合理的。# 进行决策或排序等操作。

2301_78007437的博客 681

移动端UI自动化测试新框架Maestro:声明式语法与实战指南

UI自动化测试是保障移动应用质量的关键环节,其核心原理是通过脚本模拟用户操作,对应用界面进行自动验证。传统命令式框架(如基于Selenium WebDriver的Appium)虽然控制粒度细,但脚本编写和维护成本较高。声明式测试框架则通过描述“做什么”而非“怎么做”,显著降低了技术门槛和维护复杂度,其技术价值在于提升测试脚本的可读性、编写效率与跨团队协作能力。在移动端测试领域,这尤其适用于需要快速验证核心业务流程、进行冒烟测试和回归测试的场景。本文聚焦的**Maestro框架**,正是这一理念的杰出实践。它

weixin_32921023的博客 712

Simulink/Requirements Toolbox 学习(一):概述

编写、导入、导出需求并使需求正式化;两种创建需求的模块:需求编辑器、需求透视;描述需求的方式:文本、图像和关键字;通过导入和导出需求文件,与第三方需求管理工具(例如 Microsoft Word、Microsoft Excel®、IBM DOORS和 IBM DOORS Next)集成。涉及模块:Requirements Eidtor、Requirements Table等;

854

层次分析法(AHP)Python实现

案例参考[https://zhuanlan.zhihu.com/p/448412538]根据CI和RI值求解CR值,判断其一致性是否通过。的一致性程度被认为在容忍范围内,此时可用。6.2 按照上述操作,计算各个方案的权重。越大,判断矩阵的不一致性程度越严重。6.3 进行层次总排序一致性判断。的特征向量开展权向量计算;最终得到方案到指标的权重矩阵。构建判断(成对比较)矩阵。计算方案层到指标层的权重。层次单排序与一致性检验。表示判断矩阵完全一致,,则应考虑对判断矩阵。

北屯的家 2922

金蝶云星空API实战:从零到一,用Postman打通业务数据流

本文详细介绍了如何使用Postman调试金蝶云星空API,从创建第三方应用到实战调试技巧,帮助开发者快速打通业务数据流。文章重点讲解了API配置的关键细节、常见问题排查方法以及自动化测试方案,提升开发效率与准确性。

weixin_33712987的博客 516

层次分析法(AHP)(案例+Python实现)

利用Pyhon实现层次分析法(AHP)算法

2301_77056280的博客 2801

YOLOv9改进策略 | Conv篇 | 2024最新ECCV最新大感受野的小波卷积WTConv助力YOLOv9有效涨点

本文给大家带来的改进机制是一种新的卷积层,称为WTConv(小波卷积层),它利用小波变换(WT)来解决卷积神经网络(CNN)在实现大感受野时遇到的过度参数化问题。WTConv的主要目的是通过对输入数据的不同频率带进行处理,使CNN能够更有效地捕捉局部和全局特征,WTConv成功解决了CNN在感受野扩展中的参数膨胀问题,提供了一种更为高效、鲁棒且易于集成的卷积层解决方案,我将其用于二次创新YOLOv9中的RepNCSPELAN4机制可以减少一定的参数量和计算量,达到一个可观的轻量化作用。

Snu77的博客 1541

鲁棒优化 (Robust Optimization) 算法详解及案例分析

鲁棒优化是一种用于处理不确定性优化问题的方法。其目标是在不确定性参数的可能取值范围内,找到一个对不确定性具有鲁棒性的解。

闲人编程的博客 4326

分析层次过程求解器——pyAHP

分析层次过程求解器——pyAHP 在复杂决策的海洋中导航可能是一项艰巨的任务,但有了pyAHP,这项任务变得易如反掌。pyAHP是一个基于Python的开源库,用于构建和解决分析层次过程(Analytic Hierarchy Process)模型。该库结合了数学和心理学原理,为多因素决策提供了一种结构化的解决方案。 项目介绍 pyAHP由Thomas L. Saaty教授于1970年代创立,并经过...

gitblog_00099的博客 577

linux安装配置Mysql详细步骤

下载Mysql rpm包 官网下载:https://dev.mysql.com/downloads/mysql/ 如果你到了这里,本地应该有了如下四个rpm包: mysql-community-client-5.7.26-1.el6.x86_64.rpm mysql-community-common-5.7.26-1.el6.x86_64.rpm mysql-community-libs-5...

🏆 前端领域优质创作者 7万+

探索决策的艺术:pyAHP——您的分析层次过程解决方案

探索决策的艺术:pyAHP——您的分析层次过程解决方案 在复杂多变的决策环境中,如何做出明智的选择往往是一项挑战。幸运的是,有一种经过时间考验的方法可以帮助我们——分析层次过程(Analytic Hierarchy Process, AHP)。今天,我们将介绍一个强大的开源工具——pyAHP,它为AHP提供了一个灵活且易于使用的接口,帮助您在各种决策场景中找到最佳解决方案。 项目介绍 pyAHP是...

gitblog_00366的博客 497

DA14531之如何Debug(在线调试、Jlink仿真、串口打印)

在线调试和串口打印调试。在线调试是Keil软件配合Jlink编译、烧录、仿真为一体的,其操作包括:运行、停止、打断点,单步运行等。而串口打印调试,只需打开相关配置,让arch_printf()函数正常输出串口数据。若想在初始化完成后打印arch_printf(“goto Loop\r\n”);波特率为115200,接收到串口消息goto Loop。连好线后,点击仿真按钮,在线Jlink调试。

hejinwu1314的博客 1792

数字电路逻辑与设计实验三 译码器和数据选择器

1. 译码器功能测试 将 74LS139 按图 3.1 接线,按表 3.2 输入电平分别置位,填输出状态表。 2. 译码器转换 将双 2-4 线译码器转换为 3-8 线译码器。 (1)画出转换电路图。 (2)在实验箱上接线并验证设计是否正确。 (3)设计并填表写该 3-8 线译码器功能表,画出输入、输出波形。 3. 数据选择器的测试及应用 (1) 将双 4 选 1 数据选择器 74LS153 参照图 3.2 接线,测试其功能并填写功能表 3.3。 (2)将实验箱脉冲信号源中固定连续脉冲 4 个不

欢迎交流学习心得 3085

AHP层次分析法与python代码讲解(处理论文、建模)

学习本文后,你将会对AHP有个大致了解,然后你会掌握Python代码计算AHP模型

knighthood2001 2万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

python中ahp的代码_python实现AHP算法的方法实例(层次分析法)

一、层次分析法原理层次分析法(Analytic Hierarchy Process,AHP)由美国运筹学家托马斯·塞蒂(T. L. Saaty)于20世纪70年代中期提出,用于确定评价模型中各评价因子/准则的权重,进一步选择最优方案。该方法仍具有较强的主观性,判断/比较矩阵的构造在一定程度上是拍脑门决定的,一致性检验只是检验拍脑门有没有自相矛盾得太离谱。相关的理论参考可见:wiki百科二、代码实现...

weixin_39585035的博客 1749

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

项目实战系列——使用python实现AHP层次分析法

0 前言 最近在做一个集群的项目,涉及到负载均衡问题,其中节点的综合负载评价部分采用经典的层次分析法,项目需要用C++复现。鉴于Python成熟、方便的矩阵操作,先用Python简单复现一下该算法。 1 理论基础 关于AHP层次分析法的材料很多,可以自行查阅,推荐参考文献《高可用集群系统关键技术的研究与实现》第4.2和4.3节关于层次分析法的理论介绍和实例说明。 概括来说,AHP层次分析法主要分为三大步骤: 求判断矩阵的特征值和特征向量; 证明判断矩阵的一致性; 将判断矩阵的特征向量归一化,得到各指标权重

高自强的博客 2124

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

本文主要讲解层次分析法(AHP)的python实现,后续会跟进实例分析

一只数模菜鸡的博客 3414

【层次分析法】AHP不完全关系层次结构模型的python实现

​我们在编写大学生“搭子”式社交原因评价体系结构模型结构实现算法时发现,目前网络中对于AHP的实现局限在完全层次关系结构,即仅适用于各层之间元素完全连接的情况,当面对这种不完全连接出现时束手无策。(如AHP分析法(python代码实现)、AHP(层次分析法)学习笔记及多层权重Python实践)对于AHP方法的基本原理与完全关系的层次结构模型的实现在上述两篇已有较为详细的描述,因此在这里,我们只阐述针对于不完全关系层次结构模型的AHP算法的实现思路(附完整python代码)。

w2627917962的博客 1742

python实现AHP算法(层次分析法)

一、层次分析法原理 层次分析法(Analytic Hierarchy Process,AHP)由美国运筹学家托马斯·塞蒂(T. L. Saaty)于20世纪70年代中期提出,用于确定评价模型中各评价因子/准则的权重,进一步选择最优方案。该方法仍具有较强的主观性,判断/比较矩阵的构造在一定程度上是拍脑门决定的,一致性检验只是检验拍脑门有没有自相矛盾得太离谱。 相关的理论参考可见:wiki百科 二、代码实现 需要借助Python的numpy矩阵运算包,代码最后用了一个b1矩阵进行了调试,相关代码如下,具体的

weixin_45096408的博客 1万+

AHP(层次分析法)的全面讲解及python实现

一、层次分析法的使用流程: 1. 建立层次结构模型 首先绘出层次结构图,正常三层是比较常见的:决策的目标、考虑的决策准则因素和决策对象。按它们之间的相互关系分为最高层、中间层和最低层(如下图是四层结构的) 2. 分层构造判断矩阵。多层次的评价指标体系结构一般比较复杂,各种评价指标的权重难以确定,通过两两比较评价因子的重要性来确定权重要比一次性确定所有因子的权重容易把握。该方法叫一致矩阵法,即:不把所有因素放在一起比较,而是两两相互比较。对比时采用相对尺度,以尽可能减少性质不同因素相互比较的困难,以

Trisyp的博客 2万+

Python 层次分析法 AHP

import logging import time import numpy as np import pandas as pd logging.basicConfig(format='%(message)s', level=logging.INFO) LOGGER = logging.getLogger(__name__) 成对比较矩阵 该函数用于将下三角矩阵转化为成对比较矩阵 def pair_comp_array(tril): ''' tril: 下三角矩阵 (以列为单.

荷碧TongZJ 的水文 2349

python中ahp的代码_AHP | 层次分析法原理及Python实现

AHP | 层次分析法原理及Python实现层次分析法(Analytic Hierarchy Process,AHP)由美国运筹学家托马斯·塞蒂(T. L. Saaty)于20世纪70年代中期提出,用于确定评价模型中各评价因子/准则的权重,进一步选择最优方案。该方法仍具有较强的主观性,判断/比较矩阵的构造在一定程度上是拍脑门决定的,一致性检验只是检验拍脑门有没有自相矛盾得太离谱。目录1. AHP模...

weixin_36335903的博客 2165
上一篇: python如何在循环中为容器添加多个带不同实参的函数?
下一篇: redis复习笔记(一)
general_user01
博客等级 码龄6年 7粉丝 4原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值