Мне нужно обработать множество подграфов заданного графа G. Для этого графический инструмент выглядит славным подходом с использованием его функций GraphViews и функциональности фильтрации границ/вершин. Чтобы сэкономить время, я хотел бы кэшировать информацию о уже обработанных подграфах. Я думал, что самый быстрый способ - сравнить фильтры вершин и краев. Такая операция будет довольно быстрой, но ... Похоже, что мы можем получить тот же подграф с разными фильтрами.Как сравнить два GraphView в графическом инструменте?
Например первоначальный график выглядит следующим образом:
После запуска такого кода:
vFilter1=g.new_vertex_property("bool", val=True)
eFilter1=g.new_edge_property("bool", val=True)
vFilter1[g.vertex(3)]=False
eFilter1[g.edge(1, 2)]=False
f1=gt.GraphView(g, efilt=eFilter1, vfilt=vFilter1)
print ("VERTEX filter:", f1.get_vertex_filter()[0].get_array())
print ("EDGE filter:", f1.get_edge_filter()[0].get_array())
Мы имеем фильтры, такие как:
VERTEX filter: [1 1 1 0]
EDGE filter: [1 0 1 1 1]
После немного по-другому фильтрация:
vFilter2=g.new_vertex_property("bool", val=True)
eFilter2=g.new_edge_property("bool", val=True)
vFilter2[g.vertex(3)]=False
eFilter2[g.edge(1, 2)]=False
eFilter2[g.edge(0, 3)]=False
eFilter2[g.edge(2, 3)]=False
f2=gt.GraphView(g, efilt=eFilter2, vfilt=vFilter2)
print ("VERTEX filter:", f2.get_vertex_filter()[0].get_array())
print ("EDGE filter:", f2.get_edge_filter()[0].get_array())
Фильтры будут выглядеть следующим образом:
VERTEX filter: [1 1 1 0]
EDGE filter: [1 0 0 0 1]
Обе созданные суб-графики выглядеть следующим образом:
Запуск алгоритма на достаточно больших графов может отфильтровать ребер/вершин другой порядок, и это может привести к тому, что у них будут одни и те же подграфы, но с другой настройкой фильтра. Есть ли какой-нибудь хороший способ сравнения таких представлений? (Надеемся, что C++-слой графического инструмента)
Кажется, что изоморфизм() работает для меня. К сожалению, сходство() дает тот же результат для f1 и f2 из приведенных выше примеров, даже если во второй строке с «vFilter2 [g.vertex (3)] = False» закомментировано, что дает два разных подграфа (поэтому свободная вершина без любые соединения не учитываются при расчете сходства). Я не уверен, что такое сложность изоморфизма(), но по крайней мере пока это достаточно хорошо для малых/тестовых графиков. Благодарю. – Krzysztof