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

如何在代码中表示组合电路 适配Python电路处理需求

组合电路Python实现优化方案

现有实现存在的核心问题

  • Gate类的__eq__方法存在属性名拼写错误:方法内引用的incoming/outgoing属性实际定义为incoming_gates/outgoing_gates,会直接触发属性不存在报错
  • 相等性校验逻辑仅检查出入边数量,未校验实际连接的门是否匹配,容易出现误判
  • 电路相等性强绑定门编号,两个结构完全一致但门编号不同的电路会被判定为不相等
  • 出入边需要手动维护,新增/删除连接时要同时修改两个门的对应属性,操作繁琐易出错

优化实现方案

1. 基础类定义优化

使用Python标准库的dataclass简化类定义,新增内置方法自动维护连接关系,避免手动操作出入边列表:

from dataclasses import dataclass, field
from typing import List, Dict

# 提前定义允许的门类型集合,避免非法值传入
GATE_TYPES = {"and", "or", "nand", "nor", "xor", "xnor", "input", "output"}

@dataclass(frozen=False, eq=False)
class Gate:
    gate_type: str
    number: int
    incoming_gates: List["Gate"] = field(default_factory=list, repr=False)
    outgoing_gates: List["Gate"] = field(default_factory=list, repr=False)

    def __post_init__(self):
        if self.gate_type not in GATE_TYPES:
            raise ValueError(f"不支持的门类型: {self.gate_type}")

    # 快速获取扇出数
    @property
    def fan_out(self) -> int:
        return len(self.outgoing_gates)

    # 快速获取扇入数
    @property
    def fan_in(self) -> int:
        return len(self.incoming_gates)

    def __eq__(self, other: object) -> bool:
        if not isinstance(other, Gate):
            return False
        # 若需要结构相等而非编号相等,可去掉number校验,补充拓扑层级校验
        return (
            self.gate_type == other.gate_type
            and self.number == other.number
            and self.fan_in == other.fan_in
            and self.fan_out == other.fan_out
            # 若需要完全匹配连接关系,可补充下面两行(注意避免循环引用导致的递归死循环,建议结合电路拓扑排序做校验)
            # and [g.number for g in self.incoming_gates] == [g.number for g in other.incoming_gates]
            # and [g.number for g in self.outgoing_gates] == [g.number for g in other.outgoing_gates]
        )

@dataclass
class Circuit:
    gates: Dict[int, Gate] = field(default_factory=dict)

    # 内置添加门方法,自动校验编号重复
    def add_gate(self, gate: Gate) -> None:
        if gate.number in self.gates:
            raise ValueError(f"门编号{gate.number}已存在")
        self.gates[gate.number] = gate

    # 内置添加连接方法,自动维护双向出入边
    def add_connection(self, source_gate_num: int, target_gate_num: int) -> None:
        source = self.gates[source_gate_num]
        target = self.gates[target_gate_num]
        source.outgoing_gates.append(target)
        target.incoming_gates.append(source)

    # 内置门数量统计
    @property
    def gate_count(self) -> int:
        return len(self.gates)

    # 内置连接数统计
    @property
    def connection_count(self) -> int:
        return sum(g.fan_out for g in self.gates.values())

    def __eq__(self, other: object) -> bool:
        if not isinstance(other, Circuit):
            return False
        if self.gate_count != other.gate_count or self.connection_count != other.connection_count:
            return False
        # 编号匹配场景的相等校验,若需要结构同构校验,可替换为拓扑排序后的节点序列对比
        for num, gate in self.gates.items():
            if num not in other.gates or gate != other.gates[num]:
                return False
        return True

2. 常用功能实现说明

  • 门电路合并:可新增merge_gate方法,将冗余门的出入边转移到保留门后删除冗余门即可,方法内自动维护连接关系无需手动修改
  • 扇出门查找:直接访问gate.outgoing_gates属性即可获取该门驱动的所有下游门
  • 结构相等性校验(无需匹配编号):可对两个电路做拓扑排序后,逐层对比节点类型、扇入扇出对应关系即可实现同构判断

3. 进阶优化方向

如果需要处理大规模电路,可新增拓扑排序缓存,每次电路修改后仅增量更新拓扑序列,大幅提升相等性校验、路径查找等操作的性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:57:03