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

如何在base_graph基类中调用子类以修改图数据集?

图数据集节点增删的实现方案

针对你的需求,我们可以通过组合模式让base_graph类调用节点增删工具类的方法,核心思路是让修改类直接操作base_graph的实例状态,同时在基类中控制操作的触发逻辑。以下是调整后的代码实现:

调整后的完整代码

from torch.utils.data import Dataset  # 假设你基于PyTorch Dataset实现
import random

class base_graph(Dataset):
    def __init__(self, nodes, edges):
        self.nodes = set(nodes)  # 用集合存储节点,提升增删查询效率
        self.edges = set(edges)  # 用集合存储边,自动去重

    def random_graph(self):
        # 生成随机图示例逻辑:重置为随机节点和边
        self.nodes = set(random.sample(range(10), 5))
        self.edges = set()
        for node in self.nodes:
            neighbor = random.choice(list(self.nodes - {node}))
            self.edges.add((node, neighbor))

    def __len__(self):
        return len(self.nodes)

    def __repr__(self):
        return f"base_graph(nodes={sorted(self.nodes)}, edges={sorted(self.edges)})"

    def __getitem__(self, idx):
        # 随机选择执行添加/删除操作(可根据需求改为固定顺序或其他逻辑)
        operation = "add" if not self.nodes else random.choice(["add", "delete"])
        
        if operation == "add":
            new_node = max(self.nodes) + 1 if self.nodes else 0
            add_modifier = Modifygraph_byAdding(new_node)
            add_modifier.add_sample_to_A(self)
        else:
            del_node = random.choice(list(self.nodes))
            del_modifier = Modifygraph_byDeleting(del_node)
            del_modifier.delete_node_from_A(self)
        
        # 返回处理后的节点和边(可根据需求调整返回格式)
        return sorted(self.nodes), sorted(self.edges)


class Modifygraph_byAdding:
    def __init__(self, node):
        self.node_to_add = node

    def add_sample_to_A(self, graph):
        # 修改传入的graph实例的节点集合
        if self.node_to_add not in graph.nodes:
            graph.nodes.add(self.node_to_add)
            # 可选:自动为新节点添加一条随机边(按需调整)
            if len(graph.nodes) > 1:
                random_neighbor = random.choice(list(graph.nodes - {self.node_to_add}))
                graph.edges.add((self.node_to_add, random_neighbor))


class Modifygraph_byDeleting:
    def __init__(self, node):
        self.node_to_delete = node

    def delete_node_from_A(self, graph):
        # 删除节点及所有关联边
        if self.node_to_delete in graph.nodes:
            graph.nodes.remove(self.node_to_delete)
            # 过滤掉包含待删除节点的所有边
            graph.edges = {edge for edge in graph.edges if self.node_to_delete not in edge}

核心设计思路

  1. 状态内聚:base_graph自身维护nodes和edges的状态,用集合存储以提升增删操作效率。
  2. 组合调用:在__getitem__方法中,根据需求(示例为随机选择)实例化增删工具类,并将当前base_graph实例传入工具类方法,让工具类直接修改其状态。
  3. 职责分离:base_graph专注于数据集核心逻辑(如生成随机图、实现Dataset接口),增删操作由独立工具类负责,符合单一职责原则。

注意事项

  • 操作节点时必须同步处理边:删除节点时要移除所有包含该节点的边,避免出现无效边。
  • 可按需调整操作触发逻辑:比如固定先执行添加再执行删除,或者根据索引判断操作类型。
  • 如果需要更复杂的修改策略,可扩展工具类方法或新增其他操作类。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:20:28