欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

社交网络影响力最大化 | 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)