Я использую networkx для вычисления расстояния редактирования графа от петринетей, которые я создаю через альфа-майнер PM4PY из журналов событий. Они выглядят так: два процесса, отображаемые как петлине
Теперь при преобразовании моих петринетов в графы networkx (снова с использованием pm4py) и последующем вычислении GED с помощью networkx он выдает «0» как расстояние, потому что он не обрабатывает узлы » А "и" Б "как разные. Я по крайней мере ожидаю какое-то расстояние, так как хочу, чтобы он заметил, что узлы помечены по-другому. Вот где я понял, что приходит аргумент nodematch функции GED, который я пробовал несколькими способами, но, похоже, не могу найти правильный способ.
Это полный код, который я используя на этом этапе:
import numpy as np
#set eventlog import parameters
from pm4py.objects.log.importer.xes import importer as xes_importer
from pm4py.visualization.petrinet import visualizer as pn_visualizer
from pm4py.algo.discovery.alpha import algorithm as alpha_miner
import networkx as nx
from networkx.drawing.nx_agraph import to_agraph
from pm4py.objects.petri import networkx_graph
def return_eq(node1, node2):
return node1 == node2
#import eventlog
log_path1 = os.path.join("Processes/nxtestprocess1.xes")
log1 = xes_importer.apply(log_path1)
log_path2 = os.path.join("Processes/nxtestprocess2.xes")
log2 = xes_importer.apply(log_path2)
#Loop - splits eventlog in two pieces according to slide-window
plotdata = []
gedarray = []
for x in range(0, 1):
testlog1 = [log1[x]]
testlog2 = [log2[x]]
#create nets from eventlogs with alphaminer
net1, im1, fm1 = alpha_miner.apply(testlog1)
net2, im2, fm2 = alpha_miner.apply(testlog2)
#create petrinets from nets
net1viz = pn_visualizer.apply(net1, im1, fm1)
net2viz = pn_visualizer.apply(net2, im2, fm2)
#create nx graph
nx_graph1, inv_dict1 = networkx_graph.create_networkx_directed_graph(net1)
nx_graph2, inv_dict2 = networkx_graph.create_networkx_directed_graph(net2)
#replace original labels with labels from inv_dict
nx.relabel_nodes(nx_graph1, inv_dict1, copy=False)
nx.relabel_nodes(nx_graph2, inv_dict2, copy=False)
#calculate nx GED
print(nx.graph_edit_distance(nx_graph1, nx_graph2, node_match=return_eq))
Я перемаркирую свои узлы (с «0, 1, 2, 3» на любое соответствие из словаря), пытаясь затем использовать аргумент nodematch, просто сравнение двух узлов, как показано в def функции return_eq. Это не так.
Может быть, у кого-нибудь есть опыт решения этой проблемы и может ли он дать мне небольшой намек?