社交网络影响力最大化 | RIS
程序员文章站
2024-01-05 11:15:46
...
RIS
# -*- coding:utf8 -*-
import numpy as np
import time
from igraph import *
import random
import copy
import matplotlib.pyplot as plt
from random import uniform, seed
import pandas as pd
import time
from collections import Counter
def generate_p(num):
p = np.random.rand(num)
return p
def get_RRS(G, p):
source = random.choice(np.unique(G['source'])) # 随机选择一个节点
g = G.copy().loc[np.random.uniform(0, 1, G.shape[0]) < p] # 获取子图
new_nodes, RRS0 = [source], [source]
while new_nodes:
temp = g.loc[g['target'].isin(new_nodes)]
print('+'*10, 'temp\n', temp)
temp = temp['source'].tolist()
print('+'*10, 'temp2\n', temp)
RRS = list(set(RRS0 + temp))
new_nodes = list(set(RRS) - set(RRS0))
print('+'*10, 'new_nodes', new_nodes)
RRS0 = RRS[:]
return (RRS)
def RIS(G, k, p=0.5, mc=1000):
start_time = time.time()
R = [get_RRS(G, p) for _ in range(mc)]
print('R\n', R)
SEED = []
timelapse = []
for _ in range(k):
flat_map = [item for subset in R for item in subset]
seed = Counter(flat_map).most_common()[0][0]
print('#'*10, Counter(flat_map).most_common())
print(seed)
SEED.append(seed)
print('RRRR', R)
for i, sub in enumerate(R):
if seed in sub:
sub.remove(seed)
print('RRRR', R)
timelapse.append(time.time() - start_time)
return (sorted(SEED), timelapse)
data = pd.read_csv('../data/facebook1.csv')
print('G', data)
p = generate_p(data.shape[0])
RRS = get_RRS(data, p)
(seed_set, time) = RIS(data, 5, p, mc=5)
print('seed sets',seed_set, '\ntime', time)