目录
目录
摘要
一种基于层次分析法的大数据排序方法。层次分析法(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,此时我们再对这些城市进行层次分析法,进行排序,最后放入栈中,此时所有的城市数据处理完毕,且排好了序,此时栈为城市排名降序排序。即最好的在栈顶(最上面)。
有几点需要说明:
- 上述流程图中的清空xx集合只是清空集合,为后续操作腾出空间,并不是删除数据!!!数据还是正常在流程中运行!!!
- 栈是一种先进后出的数据结构,如果你不了解可以去简单学一下,这东西很简单。
- 如果你还是看不明白的话可以看看接下来的伪代码和举例说明
三、举例说明
由于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 |