You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Networkx:在新变量中删节点不影响原图,批量生成子图

基于初始Watts-Strogatz图生成子图的完整实现

看起来你想要基于一个初始的环形Watts-Strogatz图(当p=0时,这个图本质就是100个节点的环形图),生成40个节点数更少的子图,每次迭代指定要删除的节点数量和对应索引。我来给你补全并优化这段代码,确保它能稳定运行:

import networkx as nx
import numpy as np

# 生成初始原图(p=0时为100节点的环形无向图)
original_G = nx.watts_strogatz_graph(100, 2, 0)
number_examples = 40

# 用于存储所有生成的子图
subgraph_collection = []

for i in range(number_examples):
    # 示例:随机指定本次要删除的节点数量(范围1-10,可根据需求调整)
    # 如果你有预先定义的删除数量列表,直接替换成你的自定义数据即可
    num_remove = np.random.randint(1, 11)
    
    # 从原图节点中随机挑选对应数量的节点索引(无重复)
    # NetworkX默认节点为0开始的整数,直接选索引即可
    nodes_to_remove = np.random.choice(original_G.nodes, size=num_remove, replace=False)
    
    # 必须创建原图副本!避免修改原始图影响后续迭代
    current_subgraph = original_G.copy()
    
    # 删除指定节点,关联的边会被自动移除
    current_subgraph.remove_nodes_from(nodes_to_remove)
    
    # 将生成的子图存入集合
    subgraph_collection.append(current_subgraph)
    
    # 可选:打印验证信息
    print(f"生成第{i+1}个子图,剩余节点数:{current_subgraph.number_of_nodes()}")

关键细节说明

  • 保护原始图:每次生成子图前一定要用copy()创建副本,否则删除节点会直接修改原始图,导致后续所有迭代都基于已修改的图执行,结果完全错误。
  • 自定义删除规则:如果你的需求不是随机删除,而是有预先指定的删除数量和节点索引,只需要替换随机生成的部分:
    # 假设你有预先定义好的参数列表
    predefined_remove_counts = [5, 3, 7, ...]  # 共40个元素
    predefined_node_lists = [[1,3,5,7,9], [2,4,6], [10,12,14,16,18,20,22], ...]  # 共40个列表
    
    for i in range(number_examples):
        num_remove = predefined_remove_counts[i]
        nodes_to_remove = predefined_node_lists[i]
        # 后续步骤与上述代码一致
    
  • 子图有效性验证:可以通过current_subgraph.number_of_edges()、nx.is_connected(current_subgraph)等方法,验证子图的边数、连通性是否符合预期。

如果你的需求还有特殊约束(比如删除后必须保证子图连通,或者有特定的节点选择逻辑),可以随时补充说明,我再帮你调整代码~

内容的提问来源于stack exchange,提问作者eric lardon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:24:26