一、实验内容简介
该实验主要利用基于度的排序和基于投票策略的排序分别挖掘出一组重要节点作为种子节点,然后在给定的网络中传播,一直到稳态,然后统计感染的规模NR。最后通过比较两种方法的感染规模给出相应的评价,给出不同感染率和不同种子节点条件下的实验结果。
二、算法说明
-
首先是数据结构的选取,根据数据是稀疏图和有向图的特点,这里选择十字链表来存储。
-
然后是两种排序策略。第一种是基于度的排序,思想很简单,就是根据度的大小来对节点进行排序,选取前n个节点作为种子节点。第二种是基于投票策略的排序。比上一个要复杂一点,每一个节点有投票能力和投票分数。每次选出得票数最高的节点,当选出一个节点后,该节点的投票能力和投票分数变为0,其相邻节点的投票能力和投票分数会相应地下降。这样的话选取的节点就会相对分散,避免度数高的节点扎堆的情况。
为什么需要排序?因为每个节点的重要程度不一样。直觉是位于中心的节点比位于位于边缘的节点更重要,~~直接比就完事!~~我们当然不能仅凭直觉,需要相应的算法证明这一点。

- 最后就是应用著名的信息传播模型–SIR模型,在给定初始种子节点和感染率的情况下(康复率默认为1),统计最后的感染规模。
三、算法分析与设计
学习完算法的基本原理后,现在开始真正实现该算法。首先需要建图。要建图就要先找数据,我这里直接直接从网上找了现成的数据(bing搜索“重要节点组挖掘”的第一个搜索结果),有四个文件,正好拿来对比结果。每个数据第一行都是两个数字,点的数量和边的数量。读取后按点的数量建图,依次建立十字链表。
class Node:
# 节点的关键代码
def __init__(self, value):
self.value = value
self.parents = []
self.children = []
图建好后,就具体实现两种排序。按度排序很简单,值得一提的是,因为是有向图,又要代表传播能力,这里统一使用出度来代表度。Python代码很简单:
temp=sorted(self.graph1,key=lambda l: l.chudu, reverse=True)[:self.num]
接着实现基于投票策略的排序。其实投票策略有很多种,这里选取比较简单的一种,即投票能力按比例降低,降低比例为60%,并且是二阶降低。代码实现略微复杂一些:
temp = []
for i in range(self.num):
a = max(self.graph2, key=lambda l: l.score)
temp.append(a)
for j in a.children:
for k in self.graph2[j].parents:
self.graph2[k].score -= self.graph2[j].ability * 0.6
self.graph2[j].score -= a.ability
self.graph2[j].ability *= 0.4
a.ability = 0
a.score = 0
最后实现SIR模型。核心实现过程就是构建一个队列,先让种子节点进入这个队列。然后队列每出来一个节点,就遍历这个节点的子孙节点,以感染率作为概率把感染的节点加入队列。不断重复,直到队列为空。把康复者的数量作为总的数量来作为感染规模。下面是队列核心的操作:
while sir_list[1]:
for i in queue[0].children:
if graph[i].sir == 0 and np.random.binomial(1, self.alpha, 1)[0]:
graph
关键节点组挖掘算法及Python实现

最低0.47元/天 解锁文章
8143

被折叠的 条评论
为什么被折叠?



