У меня есть одна ситуация, и я хотел бы подойти к этой проблеме с Python, но, к сожалению, мне не хватает знаний о графиках. Я нашел одну библиотеку, которая кажется очень подходящей для этой относительно простой задачи, networkx
, но у меня возникают проблемы с выполнением точных вещей, которые я хочу, что должно быть довольно простым.
У меня есть список узлов, которые могут иметь разные типы и два "класса" соседей, вверх и вниз. Задача состоит в том, чтобы найти пути между двумя целевыми узлами с некоторыми ограничениями:
- могут быть пройдены только узлы определенного типа, т.е. если начальные узлы имеют тип x, любой node в пути должен быть из другого набора путей, y или z
- если node имеет тип y, его можно передать только один раз
- если node имеет тип z, его можно передать дважды
- в случае посещения a node типа z, выход должен быть из другого класса соседа, то есть если его посетили сверху, выход должен быть от нисходящего
Итак, я попробовал несколько экспериментов, но я, как сказал, боролся. Во-первых, я не уверен, какой тип графика действительно представляет? Он не направлен, так как не имеет значения, если вы переходите от node 1 до node 2 или от node 2 до node 1 ( кроме в этом последнем сценарии, поэтому что немного усложняет ситуацию...). Это означает, что я не могу просто создать граф, который просто многонаправлен, поскольку я должен иметь это ограничение. Во-вторых, мне нужно пройти через эти узлы, но указать, что для пути должны быть доступны только узлы определенного типа. Кроме того, в случае возникновения последнего сценария, я должен иметь в виду класс и направление ввода и выхода, что ставит его в несколько направленное состояние.
Вот пример кода макета:
import networkx as nx
G=nx.DiGraph()
G.add_node(1, type=1)
G.add_node(2, type=2)
G.add_node(3, type=3)
G.add_edge(1,2, side="up")
G.add_edge(1,3, side="up")
G.add_edge(2,1, side="down")
G.add_edge(2,3, side="down")
for path in nx.all_simple_paths(G,1,3):
print path
Результат довольно приятный, но мне нужны эти ограничения. Итак, есть ли у вас предложения о том, как я могу их реализовать, или дать мне несколько рекомендаций относительно понимания этого типа проблем или предложить другой подход или библиотеку для этой проблемы? Может быть, простой алгоритм на основе словаря соответствовал бы этой потребности?
Спасибо!