Может ли NetworkX на самом деле обрабатывать веса None как скрытые ребра в алгоритме Дейкстры?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Может ли NetworkX на самом деле обрабатывать веса None как скрытые ребра в алгоритме Дейкстры?

Сообщение Anonymous »


Основываясь на скудной и непрозрачной документации 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»?
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»