一种将层次分析法(AHP)运用于大数据量的解决方案(附Python源码)(即2024华数杯C题一种解决思路)

目录

目录

目录

摘要

一、灵感来源以及应用背景(一些废话)

二、思想和解决过程

三、举例说明

四、伪代码

这里

五、实战以及数据集效果

六、程序源码

七、评价


摘要

      一种基于层次分析法的大数据排序方法。层次分析法(AHP)是分析决策中常用的方法,但是其使用数据量有所限制,在我们想将大量数据进行排序处理的时候,层次分析法往往显得无力。本文主要介绍了将层次分析法推广的大量数据的方法,使得层次分析法可以在大量数据中,进行排序。


一、灵感来源以及应用背景(一些废话)

     各位大佬早上中午晚上好。  

     这个是我在做今年华数杯的时候,突然想到了一个解决方案,方案可能不完整,可能有些我没有发现的小的逻辑漏洞。但我感觉大体上是没有问题的,欢迎各路大佬批评指正!

      简单说一下华数杯第二问的背景吧,就是给了我们346个城市(题目原本要求比较的城市是比346要多的,但是官方给的数据集也不完整,我自己去网上买的数据集剔除了几个城市,就只剩下346个城市),然后要我们给这346个城市按照城市规模、环境保护、人文底蕴、交通便利、气候、美食这6个因素来给城市排序。讲道理这个应该是可以用层次分析法来解决,但是由于这个数据量太大了,层次分析法没法比较346个城市,所以就有了这篇文章。

      关于层次分析法在我前面的文章有提到,大家不太熟悉的可以去看一下。层次分析法(AHP)(案例+Python实现)_层次分析法ahp矩阵文件-优快云博客

二、思想和解决过程

      其实我的做法(或者思想)很简单,就是“两两比较、好的留下”。但是具体实现还是没有这么简单。下面直接放流程图,后面会解释。

      按照上述流程图,首先导入346个城市数据,然后每5个为一组(向上取整),这样我们就可以得到70组,70组每为5个城市,构建这5个城市的判断矩阵,然后对这5个城市进行层次分析法,就可以筛选出每组最好的城市,这样我们就可以筛选出70个最好的城市(因为有70组)。我们把这70组放到一个集合里,我们就把这个集合叫做最好城市集合,剩下的276个城市放到另一个城市集合中,我们就把这个集合叫做次好城市集合。接下来我们判断次好城市集合中的城市数量是否大于5个,如果大于5个,那么就在重复分组、建立判断矩阵、层次分析、筛选每组最好城市的操作。直到次好城市集合里的集合数量小于5个,这个时候我们对这些城市(小于5个)进行层次分析法,得到他们的排名顺序,放入栈中,此时栈更新,我们让最好城市集合里的数据再重复分组、建立判断矩阵、层次分析、筛选每组最好城市的操作。最好城市集合里的城市数量小于5,此时我们再对这些城市进行层次分析法,进行排序,最后放入栈中,此时所有的城市数据处理完毕,且排好了序,此时栈为城市排名降序排序。即最好的在栈顶(最上面)。

有几点需要说明:

  1. 上述流程图中的清空xx集合只是清空集合,为后续操作腾出空间,并不是删除数据!!!数据还是正常在流程中运行!!!
  2. 栈是一种先进后出的数据结构,如果你不了解可以去简单学一下,这东西很简单。
  3. 如果你还是看不明白的话可以看看接下来的伪代码和举例说明

三、举例说明

      由于346个城市数据量还是太大了点,所以我以简单的20个城市作为例子进行说明。

      假设我们有20个城市需要进行比较:

  • step1:对这20个城市进行分组,每5个为一组,分为4组。
  • step2:每组内进行层次分析法,选出每组最好的城市,这样就筛选出最好的4个城市。
  • step3:把这4个城市放到一个集合里,就叫最好城市集合,剩下的16个城市放到另一个集合里,就叫次好城市集合。
  • step4:对剩下的16个城市再进行分组,5个为一组,分4组。
  • step5:每组内部进行层次分析比较,得到最好的城市,此时筛选出4个最好城市。
  • step6:将这3个城市加入到最好城市集合里,也就是4+4=8个城市,此时次好城市集合还剩下16-4=12个城市。
  • step7:对这12个城市进行分组,5个为一组,分3组(向上取整)。
  • step8:重复step5、step6,此时,次好城市集合里还剩下12-3=9个城市。最好城市集合有8+3=11个城市。
  • step9:对这9个城市分组,5个为一组,分为2组。
  • step10:重复step5、step6,此时,次好城市集合里还剩下9-2=7个城市。最好城市集合有11+2=13个城市。
  • step11:对这7个城市分组,5个为一组,分为2组。
  • step12:重复step5、step6,此时,次好城市集合里还剩下7-2=5个城市。最好城市集合有13+2=15个城市。
  • step13:此时次好城市集合里的城市数量已经小于5,我们对这5个城市利用层次分析法进行排序。
  • step14:将排好序的5个城市放入栈中,此时栈中有5个排好序的数据。
  • step15:对最好城市集合了的15个城市分组,5个为一组,分3组。
  • step16:重复step2,选出最好的3个城市,将着3个城市放入一个新的最好城市集合,此时最好城市集合里有3个城市,剩下15-3=12个城市仿佛一个新的次好城市集合,此时有12个城市。(接下是重复,过程会些简略,我会算完,如过你已经懂了可以不用看了)
  • step17:12个分组,分3组。层次分析法后,最好城市集合里有3+3=6个城市,次好城市集合里有12-3=9个城市。
  • step18:重复step17,9分两组,层次分析法后,最好城市集合里有6+2=8个城市,次好城市集合里有9-2=7个城市。
  • step19:重复step17,7分两组,层次分析法后,最好城市集合里有8+2=10个城市,次好城市集合里有7-2=5个城市。
  • step20:5个城市进行层次分析排序,放入栈中,此时栈中有10个降序排列的城市。
  • step21:剩下10个城市未排序,10分2组,层次分析后,最好城市集合有2个,次好城市集合里有10-2=8个城市。
  • step22:8分2组,层次分析后,最好城市集合有2+2=4个,次好城市集合里有8-2=6个城市。
  • step23:6分2组,层次分析后,最好城市集合有4+2=6个,次好城市集合里有6-2=4个城市。
  • step24:4小于5,对这4个城市进行层次分析,放入栈中,此时栈有14个城市。
  • step25:剩下6个城市未排序,6分2组,最好城市集合有2个,次好城市集合里有6-2=4个城市。
  • step26:4小于5,对这4个城市进行层次分析,放入栈中,此时栈有18个城市。
  • step27:剩下2个城市未排序,2小于5,对这两个城市进行层次分析,放入栈中,此时栈20个城市,所有城市处理完毕。

四、伪代码

      伪代码是我实现该算法的思路,大家可以参考着看一下,总的来说我并没有创建这么多个集合,我采用的是删除的方式,就是如果你是最好城市,你就剔除掉次好城市中,然后一次筛选完毕后,我们得到小于5的坏城市,在把这5个坏城市从最好城市列表中剔除。这就是我代码的大体思路,可能不是很清楚,但是代码这个东西,每个人的思路不一样,你也可以自己去实现这个算法,我表达能力有限,没法很好的讲代码,就放了段伪代码共大家观赏。欢迎大佬给出更好的解法。

     需要注意的是,当只有一个城市的时候,不适合层次分析法,需要单独讨论,大家编写程序的时候需要注意。

"""
伪代码
"""

best_citys = all_data
second_best_citys = best_city
Stack = None

while len(best_citys) > 5:
    while len(second_best_citys) > 5:
        city_groups = second_best_citys divide into groups
        for group in city_groups:
            group by AHP
            find best city in group
            second_best_city delete best city
    city_list = second_best_citys by AHP
    city_list push Stack
    best_citys delete city_list
    second_best_citys = best_citys
city_list = best_citys by AHP
city_list push Stack

这里

五、实战以及数据集效果

      接下来看看这个算法在华数杯C题数据集上的表现。

      首先就是这个数据集,比较长,我就放一部分。大家看看就好。这个数据集是用来确定我们的决策矩阵用的。

来源城市 AQI 绿化覆盖率 (%) 废水处理率 (%) 废气处理率 (%) 垃圾分类处理率 (%) 历史遗迹数量 博物馆数量 文化活动频次 文化设施数量 公共交通覆盖率 (%) 线路密度 (km/km²) 高速公路里程 (km) 机场航班数量 年平均气温 (℃) 年降水量 (mm) 适宜旅游天数 空气湿度 (%) 餐馆数量 特色美食数量 美食活动频次
阿坝 50 36 88 85 73
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值