Интересный вопрос, я никогда не слышал об этой проблеме, возможно потому, что у меня нет большого опыта в этой теме, или большого опыта работы с NetworkX.Тем не менее, у меня есть идея для алгоритма.Это может быть просто самый наивный способ сделать это, и я был бы рад услышать о более умном алгоритме.
Идея состоит в том, что вы можете использовать свои правила ограничения, чтобы преобразовать свой граф в новый граф, где всеребра действительны, используя следующий алгоритм.
Ограничение пути (1,2,3) можно разделить на два правила:
- Если вы прошли (1,2), то удалите (2,3)
- Если вы уйдете над (2,3), то удалите (1,2)
Чтобы поместить это в график, вы можете вставить копии узла 2 для каждого случая.Я назову новые узлы 1_2 и 2_3 после действительного ребра в соответствующем случае.Для обоих узлов вы копируете все входящие и исходящие ребра за вычетом ограниченного ребра.
Например:
Nodes = [1,2,3,4]
Edges = [(1,2),(2,3),(4,2)]
Допустимый путь должен быть только 4-> 2-> 3, а не 1-> 2-> 3.Таким образом, мы расширяем график:
Nodes = [1,1_2,2_3,3,4] # insert the two states of 2
Edges = [ # first case: no (1_2,3) because of the restriction
(1,1_2), (4, 1_2)
# 2nd case, no (1,2_3)
(2_3,3), (4,2_3)]
Единственный допустимый путь на этом графике - 4-> 2_3-> 3.Это просто отображает 4-> 2-> 3 в исходном графике.
Я надеюсь, что этот ответ, по крайней мере, поможет вам, если вы не найдете существующего решения.Более длинные правила ограничения взрывают граф с экспоненциально растущим числом узлов состояний, поэтому либо этот алгоритм слишком прост, либо проблема сложна; -)