Graph-tool: поиск Дейкстры с несколькими весовыми ограничениями - PullRequest
0 голосов
/ 25 октября 2018

Я использую библиотеку Graph-Tool для Python, чтобы найти кратчайший путь между двумя вершинами.У меня есть несколько весов для ребер, и на основании определенных условий соответствующие значения весов выбираются для кратчайшего пути.Например: если свойство имени двух соседних ребер одинаково, тогда будет виден второй вес, иначе должен быть виден вес по умолчанию.Из документации графического инструмента я не мог понять, можно ли определить некоторые условия в опции веса или нет.Вот мой код:

from graph_tool.all import *
g = Graph(directed=False)
v1 = g.add_vertex()
v2 = g.add_vertex()
v3 = g.add_vertex()
e = g.add_edge(v1, v2)
e1 = g.add_edge(v2, v3)

epropw = g.new_edge_property("int32_t")
epropw1 = g.new_edge_property("int32_t")
epropn = g.new_edge_property("string")

g.ep.weight = epropw
g.ep.weight1 = epropw1
g.ep['name'] = epropn
g.ep.weight[g.edge(v1, v2)] = 21
g.ep.weight1[g.edge(v1, v2)] = 20
g.ep['name'][g.edge(v1, v2)] = 'UniqueName'
dist, pred = dijkstra_search(g, weight=lambda g.ep.weight1, g.ep.weight: if 'UniqueName' in edge)

Теперь я не понимаю, как я могу определить это условие для веса, при котором уникальное имя существует как свойство между краями, тогда используйте weight1, в противном случае используйте weight.

Раньше я использовал networkX, но это было очень медленно (у меня где-то от 1M до 10M узлов), и я обнаружил, что Graph-Tool работает намного быстрее.в NetworkX было довольно легко определить функцию для весов:

weight=lambda u, v, d: d['weight1'] if 'weight1' in d else d['weight']

Может кто-нибудь помочь мне, как я могу использовать ту же функцию для инструмента графика?

...