Может ли NetworkX на самом деле обрабатывать веса None как скрытые ребра в алгоритме Дейкстры? ⇐ Python
Может ли NetworkX на самом деле обрабатывать веса None как скрытые ребра в алгоритме Дейкстры?
Основываясь на скудной и непрозрачной документации NetworkX, при вычислении кратчайших путей я попытался назначить веса с помощью функции, чтобы ограничить обходы определенными способами передвижения. Эта весовая функция присваивает правильный вес, если ребро принадлежит к числу проходимых типов, и None, если ребро относится к любому другому типу.
Согласно документации, использование веса None делает края скрытыми, поэтому при обходе они будут игнорироваться. Но у меня возникают странные проблемы при попытке сделать это. В частности, хотя путь существует с указанным весом ребра (и has_path подтверждает это), когда я запускаю single_source_dijkstra с этими весами, он не может найти путь.
Итак, как для моей интегрированной мультимодальной сети, так и для моей изолированной дорожной сети код
nx.has_path(fullNetwork,orig,dest) nx.has_path(roadNetwork,origin,dest) возвращает True. Затем запустите его без взвешивания, используя
roadTime,roadPath = nx.single_source_dijkstra(roadNetwork, source=orig, target=dest) возвращает правильное время и путь, и более того
roadTime,roadPath = nx.single_source_dijkstra(roadNetwork, source=orig, target=dest, Weight='walkTime') также возвращает время и путь. Все так и должно быть.
Я подтвердил, что у каждого края дороги есть положительное значение float для WalkTime, но у некоторых других видов транспорта его нет. Поэтому я хотел использовать следующую весовую функцию для прокладки кратчайших путей, которые используют вес «walkTime» и игнорируют недорожные края:
def roadWalkTime(u,v,attr): if attr.get('modality','poo') == 'дорога': return attr.get('walkTime', None) еще: возврат Нет roadTime,roadPath = nx.single_source_dijkstra(fullNetwork, source=orig, target=dest, Weight=roadWalkTime) но вместо этого я получаю
Файл C:\miniforge3\envs\GAT\lib\site-packages\networkx\algorithms\shortest_paths\weighted.py:747 в multi_source_dijkstra поднять nx.NetworkXNoPath(f"Нет пути к {target}.") из ошибки NetworkXNoPath: нет пути к destin_0. Я делаю это со случайными парами отправителей и получателей, и результат не зависит от каких-либо конкретных узлов... так происходит всегда. Я подумал, что делаю что-то не так с вызовом функции веса, поэтому определил статический вес и попробовал еще раз.
для u,v,attr в fullNetwork.edges(data=True): coreNetwork[v]['roadWalkTime'] = attr['walkTime'] if attr.get('modality','blah')=='road' else None Теперь, когда я попробую
roadTime,roadPath = nx.single_source_dijkstra(fullNetwork, source=orig, target=destinNode, Weight='roadWalkTime') Я по-прежнему получаю ту же ошибку, и даже если я изолирую дорожную сеть и подтвержу, что путь ДЕЙСТВИТЕЛЬНО существует, и все ребра имеют положительные плавающие веса, называемые «walkTime», вызов
roadTime,roadPath = nx.single_source_dijkstra(roadNetwork, source=orig, target=destinNode, Weight='roadWalkTime') хотя
roadTime,roadPath = nx.single_source_dijkstra(roadNetwork, source=orig, target=destinNode, Weight='walkTime') нет.
Итак, что-то я делаю неправильно, указывая или используя эту весовую функцию? Или, поскольку он не работает даже в статическом режиме, что-то не так с моим определением «roadWalkTime»?
Основываясь на скудной и непрозрачной документации NetworkX, при вычислении кратчайших путей я попытался назначить веса с помощью функции, чтобы ограничить обходы определенными способами передвижения. Эта весовая функция присваивает правильный вес, если ребро принадлежит к числу проходимых типов, и None, если ребро относится к любому другому типу.
Согласно документации, использование веса None делает края скрытыми, поэтому при обходе они будут игнорироваться. Но у меня возникают странные проблемы при попытке сделать это. В частности, хотя путь существует с указанным весом ребра (и has_path подтверждает это), когда я запускаю single_source_dijkstra с этими весами, он не может найти путь.
Итак, как для моей интегрированной мультимодальной сети, так и для моей изолированной дорожной сети код
nx.has_path(fullNetwork,orig,dest) nx.has_path(roadNetwork,origin,dest) возвращает True. Затем запустите его без взвешивания, используя
roadTime,roadPath = nx.single_source_dijkstra(roadNetwork, source=orig, target=dest) возвращает правильное время и путь, и более того
roadTime,roadPath = nx.single_source_dijkstra(roadNetwork, source=orig, target=dest, Weight='walkTime') также возвращает время и путь. Все так и должно быть.
Я подтвердил, что у каждого края дороги есть положительное значение float для WalkTime, но у некоторых других видов транспорта его нет. Поэтому я хотел использовать следующую весовую функцию для прокладки кратчайших путей, которые используют вес «walkTime» и игнорируют недорожные края:
def roadWalkTime(u,v,attr): if attr.get('modality','poo') == 'дорога': return attr.get('walkTime', None) еще: возврат Нет roadTime,roadPath = nx.single_source_dijkstra(fullNetwork, source=orig, target=dest, Weight=roadWalkTime) но вместо этого я получаю
Файл C:\miniforge3\envs\GAT\lib\site-packages\networkx\algorithms\shortest_paths\weighted.py:747 в multi_source_dijkstra поднять nx.NetworkXNoPath(f"Нет пути к {target}.") из ошибки NetworkXNoPath: нет пути к destin_0. Я делаю это со случайными парами отправителей и получателей, и результат не зависит от каких-либо конкретных узлов... так происходит всегда. Я подумал, что делаю что-то не так с вызовом функции веса, поэтому определил статический вес и попробовал еще раз.
для u,v,attr в fullNetwork.edges(data=True): coreNetwork[v]['roadWalkTime'] = attr['walkTime'] if attr.get('modality','blah')=='road' else None Теперь, когда я попробую
roadTime,roadPath = nx.single_source_dijkstra(fullNetwork, source=orig, target=destinNode, Weight='roadWalkTime') Я по-прежнему получаю ту же ошибку, и даже если я изолирую дорожную сеть и подтвержу, что путь ДЕЙСТВИТЕЛЬНО существует, и все ребра имеют положительные плавающие веса, называемые «walkTime», вызов
roadTime,roadPath = nx.single_source_dijkstra(roadNetwork, source=orig, target=destinNode, Weight='roadWalkTime') хотя
roadTime,roadPath = nx.single_source_dijkstra(roadNetwork, source=orig, target=destinNode, Weight='walkTime') нет.
Итак, что-то я делаю неправильно, указывая или используя эту весовую функцию? Или, поскольку он не работает даже в статическом режиме, что-то не так с моим определением «roadWalkTime»?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как реализовать пропуск соседних узлов в модифицированном алгоритме Дейкстры
Anonymous » » в форуме Python - 0 Ответы
- 47 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как рассчитать количество пар в дереве на основе максимального веса ребра?
Anonymous » » в форуме Python - 0 Ответы
- 17 Просмотры
-
Последнее сообщение Anonymous
-