综合影响力模型InfG算法

xiaoxiao2021-02-28  189

目标

在有用节点集U 中选择k 个初始节点,使其具有最大的传播影响范围。

方法

任一社区内,首先选择影响传播范围F 值最大的节点为起始点,将其加入集合S,并标记其邻居节点。在未标记的节点中继续选择一点,满足两节点所能影响到达的节点集合的和集最大,即节点数目最多,并标记其邻居节点。依此类推,每次选择的节点均为被标记的节点,遍历每个社区,直到选取完满足条件的k’ 个节点为止。

# 参数:节点关系的文件路径,节点传播范围F值的文件路径 # 输出文件路径,领袖个数 def getLeaders(inputFileName_Node, inputFileName_TKFK, outputFileName, leaderNum): # 打开文件读入节点关系 with open(inputFileName_Node, 'r') as file: # 保存节点关系 node = {} for line in file.readlines(): # 读出文件内容,以制表符分割 line_s = line.strip().split('\t') # 如果发帖者已存在,直接将跟随者添加 if line_s[0] in node: node[line_s[0]].append(line_s[1]) # 不存在则先添加发帖者,并将跟随者添加在发帖者里 else: node.setdefault(line_s[0], []).append(line_s[1]) # 如果跟随者已经在节点里忽略,否则添加 if line_s[1] in node: pass else: node.setdefault(line_s[1], []) # 打开文件读入传播范围F with open(inputFileName_TKFK,'r') as fileF: # 存储节点及对应的F值 value_F = {} # 标记节点是否已使用 value_Flag = {} # 读取文件内容 for line in fileF.readlines(): line_s = line.strip().split('\t') value_F[line_s[0]] = float(line_s[2]) value_Flag[line_s[0]] = False # 降序排序f值 value_F_list = sorted(value_F.items(), key=lambda asb:asb[1], reverse=True) i = 1 # 保存结果 result_list = [] while i <= leaderNum: for l in value_F_list: # 如果该节点没使用则标记该节点并放入结果里 if not value_Flag[l[0]]: value_Flag[l[0]] = True result_list.append(l[0]) # 标记该节点的所有邻居节点 for u in node[l[0]]: value_Flag[u] = True break i = i + 1 # 将结果保存至文件 with open(outputFileName, 'w')as fileLeader: for result in result_list: fileLeader.write(result + '\n') # 使该程序既能单独运行也能作为模块导入 if __name__ == '__main__': getLeaders(r'D:\PycharmProjects\Demo\data\all.txt',r'D:\PycharmProjects\Demo\data\TkFk.txt',r'D:\PycharmProjects\Demo\data\leader_result.txt',20)
转载请注明原文地址: https://www.6miu.com/read-29757.html

最新回复(0)