У меня есть одна ситуация, и я хотел бы подойти к этой проблеме с Python, но, к сожалению, мне не хватает знаний о графиках. Я нашел одну библиотеку, которая кажется очень подходящей для этой относительно простой задачи: networkx
, но у меня возникают проблемы с выполнением точных вещей, которые я хочу, что должно быть довольно простым.Решение проблемы с графами с Python
У меня есть список узлов, которые могут иметь разные типы и два «класса» соседей, вверх и вниз. Задача состоит в том, чтобы найти пути между двумя целевыми узлами, с некоторыми ограничениями в виде:
- только узлы определенного типа может быть пройдены, то есть, если исходные узлы имеют тип х, любой узел на пути должен быть от другой набор путей, у или г
- если узел имеет тип у, он может быть передан только через один раз
- если узел имеет тип г, он может быть пропущен через два раза
- в случае, когда узел тип z посещается, выход должен быть из другого класса соседа, то есть, если его посещать сверху, выход должен быть от
Итак, я попробовал несколько экспериментов, но я, как сказал, боролся. Во-первых, я не уверен, какой тип графика действительно представляет? Он не направлен, так как не имеет значения, переходите ли вы от узла 1 к узлу 2 или от узла 2 к узлу 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
Выход довольно хорошо, но мне нужны эти ограничения. Итак, есть ли у вас предложения о том, как я могу их реализовать, или дать мне несколько рекомендаций относительно понимания этого типа проблем или предложить другой подход или библиотеку для этой проблемы? Может быть, простой алгоритм на основе словаря соответствовал бы этой потребности?
Спасибо!
Трудно понять, чего вы хотите. Можете ли вы дать некоторый контекст проблемы? Что представляют собой различные типы узлов? Вы хотите, чтобы все пути между двумя узлами или были самыми короткими? Как быстро это должно быть? («все пути», вероятно, собираются вывести его в экспоненциальное время только при печати вывода) –
Давайте будем говорить, что узлы представляют города или станции, какое-то местоположение, которое имеет определенный «тип», который обозначает его размер или какой-либо другой ограничивающий фактор , Существует три типа этих узлов. Все пути должны быть там, а не только самые короткие. Скорость не имеет значения, но мне нужно подождать несколько часов, чтобы разобрать некоторые узлы :) Я проведу это с довольно маленькими данными, под 100 узлами, поэтому скорость не должна быть проблемой. –
Я не совсем понимаю ограничения. Могут ли узлы типа * x * проходить один раз или произвольно много раз? Являются ли связи между узлами полностью основанными на трех классах, или есть ли дополнительная структура, о которой нужно беспокоиться? –