【影响力最大化】——影响力扩展度计算(蒙特卡洛模拟近似)

算法3.1 影响力扩展度的蒙特卡洛模拟

1. 介绍

计算影响力拓展度的一个简单的方法是反复模拟在某个种子结点集合SSS之下影响力的传播过程,统计这些模拟过程中被激活结点个数的平均值,用这个平均值作为种子集合SSS的影响力扩展度σ(S)σ (S)σ(S)的估计值。这种模拟估计的方法通常被称为蒙特卡洛模拟(Monte Carlo Simulation)。

2.伪代码:

在这里插入图片描述

流程图

在这里插入图片描述

3. 示例代码

import random
import networkx as nx
import matplotlib.pyplot as plt

# 模拟影响力传播
def simulate_influence_spread(G, seed_set, propagation_prob):
    activated = set(seed_set)  # 初始化激活节点
    newly_activated = set(seed_set)  # 当前轮次刚刚被激活的节点

    while newly_activated:
        next_round = set()
        for node in newly_activated:
            for neighbor in G.neighbors(node):
                if neighbor not in activated and random.random() < propagation_prob:
                    next_round.add(neighbor)  # 以传播概率激活邻居节点
        newly_activated = next_round
        activated.update(newly_activated)  # 更新已激活的节点
    
    return activated  # 返回最终被激活的节点集合

# 蒙特卡洛模拟影响力扩展度
def monte_carlo_influence_spread(G, seed_set, T, propagation_prob):
    total_spread = 0  # 用于累计传播的节点数量

    for _ in range(T):
        activated_nodes = simulate_influence_spread(G, seed_set, propagation_prob)
        total_spread += len(activated_nodes)  # 累加每次传播的影响节点数量

    # 计算影响力扩展度的平均值
    average_spread = total_spread / T
    return average_spread

# 可视化函数
def visualize_influence_spread(G, seed_set, activated_nodes):
    pos = nx.spring_layout(G)  # 使用 Spring 布局
    plt.figure(figsize=(8, 6))

    # 绘制所有节点
    nx.draw_networkx_nodes(G, pos, node_color='lightgrey', node_size=50)
    
    # 绘制种子节点
    nx.draw_networkx_nodes(G, pos, nodelist=seed_set, node_color='red', node_size=300, label='Seeds')
    
    # 绘制被激活的节点
    nx.draw_networkx_nodes(G, pos, nodelist=activated_nodes, node_color='green', node_size=300, label='Activated')
    
    # 绘制未被激活的节点
    non_activated_nodes = set(G.nodes()) - activated_nodes - set(seed_set)
    nx.draw_networkx_nodes(G, pos, nodelist=non_activated_nodes, node_color='lightblue', node_size=50, label='Non-activated')
    
    # 绘制节点之间的边
    nx.draw_networkx_edges(G, pos, alpha=0.3)
    
    # 绘制节点标签
    nx.draw_networkx_labels(G, pos, font_size=8)

    # 图例
    plt.legend(scatterpoints=1)
    
    plt.title("Influence Spread Visualization")
    plt.show()

# 示例使用:生成一个小图
G = nx.erdos_renyi_graph(100, 0.05)  # 生成一个包含100个节点和边的随机图
seed_set = [0, 1, 2]  # 假设选择节点 0, 1, 2 作为种子节点
T = 100  # 模拟次数
propagation_prob = 0.3  # 传播概率

# 进行蒙特卡洛模拟
average_spread = monte_carlo_influence_spread(G, seed_set, T, propagation_prob)
print(f"平均影响力扩展度: {average_spread}")

# 可视化种子节点和影响力传播结果
activated_nodes = simulate_influence_spread(G, seed_set, propagation_prob)
visualize_influence_spread(G, seed_set, activated_nodes)


4. 结果展示

平均影响力扩展度: 65.44

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花间相见

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值