2013-06-28 3 views
2

Предположим, у меня есть функция euc_2d(graph, n1, n2), которая вычисляет эвклидовое расстояние между двумя узлами того же графа. Каждый узел имеет заданный pos=(x,y), который присваивается при создании графика.Networkx: Используйте общую функцию вычисления веса края

NetworkX предоставляет функцию для получения общего веса всех ребер графа, а именно: graph.size(weight='weight'). Проблема с этим методом заключается в том, что он предполагает, что всякий раз, когда я добавляю ребро, я должен явно назначить соответствующий вес края, например, graph.add_edge(u,v,weight=?), используя, например, функцию лямбда.

Однако это очень неудобно (и многословно), так как я постоянно добавляю и удаляю ребра в графике все время.

Итак, есть ли способ pythonic, который я могу сказать NetworkX, чтобы прозрачно использовать euc_2d() всякий раз, когда я спрашиваю общий вес графика?

ответ

2

Ни graph.size, ни graph.add_edge не используют функцию для оценки веса, они просто хранят значения с заданным ключом. Чтобы упростить работу, просто определите функцию для добавления кромки с соответствующим весом:

def add_euc2d_edge(graph, u, v): 
    graph.add_edge(u, v, weight=euc_2d(graph, u, v))