2016-06-06 4 views
0

Мне нужно обработать множество подграфов заданного графа G. Для этого графический инструмент выглядит славным подходом с использованием его функций GraphViews и функциональности фильтрации границ/вершин. Чтобы сэкономить время, я хотел бы кэшировать информацию о уже обработанных подграфах. Я думал, что самый быстрый способ - сравнить фильтры вершин и краев. Такая операция будет довольно быстрой, но ... Похоже, что мы можем получить тот же подграф с разными фильтрами.Как сравнить два GraphView в графическом инструменте?

Например первоначальный график выглядит следующим образом:

Initial graph

После запуска такого кода:

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] 

Обе созданные суб-графики выглядеть следующим образом:

enter image description here

Запуск алгоритма на достаточно больших графов может отфильтровать ребер/вершин другой порядок, и это может привести к тому, что у них будут одни и те же подграфы, но с другой настройкой фильтра. Есть ли какой-нибудь хороший способ сравнения таких представлений? (Надеемся, что C++-слой графического инструмента)

ответ

1

Если вершины подграфов выровнены, вы можете использовать функцию similarity(). В противном случае вам необходимо обратиться к isomorphism().

+0

Кажется, что изоморфизм() работает для меня. К сожалению, сходство() дает тот же результат для f1 и f2 из приведенных выше примеров, даже если во второй строке с «vFilter2 [g.vertex (3)] = False» закомментировано, что дает два разных подграфа (поэтому свободная вершина без любые соединения не учитываются при расчете сходства). Я не уверен, что такое сложность изоморфизма(), но по крайней мере пока это достаточно хорошо для малых/тестовых графиков. Благодарю. – Krzysztof

 Смежные вопросы

  • Нет связанных вопросов^_^