Причина, по которой он дает ответ как 0
, заключается в том, что он считает узлы равными. Если вы видите документацию, там упоминается, что
node_match (callable) - функция, которая возвращает True, если узел n1 в G1
и n2 в G2 следует считать равным во время сопоставления.
Функция будет вызываться как
node_match(G1.nodes[n1], G2.nodes[n2]).
То есть функция получит словари атрибутов узла для
n1 и n2 в качестве входов.
Теперь, поскольку вы не объявили никаких атрибутов, тогда в этом случае
G.nodes['A'] will return {}
и
H.nodes['Z'] will return {}
Теперь, поскольку оба являются пустыми словарями, они будут считаться равными.
Вот модифицированная версия вашего кода, где я добавил атрибут метки для вашего узла.
import networkx as nx
G=nx.Graph()
G.add_nodes_from([("A", {'label':'a'}), ("B", {'label':'b'}),
("C", {'label':'c'})])
G.add_edges_from([("A","B"),("A","C")])
H=nx.Graph()
H.add_nodes_from([("X", {'label':'x'}), ("Y", {'label':'y'}),
("Z", {'label':'z'})])
H.add_edges_from([("X","Y"),("X","Z")])
# This is the function which checks for equality of labels
def return_eq(node1, node2):
return node1['label']==node2['label']
print(nx.graph_edit_distance(G, H, node_match=return_eq))
# Output: 3