поиск кратчайшего графа по параметрам

def shortestPath(digraph, start, end, maxTotalDist, maxDistOutdoors, visited=[]):
    if not (digraph.hasNode(start) and digraph.hasNode(end)):
        raise ValueError('Start or end not in graph.')
    path = [str(start)]
    if start == end:
        return path
    shortest = None
    MinimumTotalDist = 0
    for node in digraph.childrenOf(start):
        if (str(node) not in visited): #avoid cycles
            visited = visited + [str(node)] #new list
            FirstStepDist = digraph.childrenOf(start)[node][0]
            FirstStepOutdoors = digraph.childrenOf(start)[node][1]
            newPath = shortestPath(digraph, node, end, maxTotalDist, maxDistOutdoors, visited)
            if newPath == None:
                continue
            TotalDist = int(FirstStepDist) + TotalDistance(digraph,newPath)
            TotalOutdoorDist = int(FirstStepOutdoors) + TotalOutdoorDistance(digraph,newPath)
            **if TotalOutdoorDist > maxDistOutdoors:
                continue**
            if (shortest == None or TotalDist < MinimumTotalDist):
                shortest = newPath
                MinimumTotalDist = TotalDist
    if shortest != None:
        path = path + shortest
    else:
        path = None

    if TotalDistance(digraph,path) <= maxDistOutdoors:
        return path

Это не дает мне правильный ответ. Он возвращает правильный путь, да. Однако путь, который он возвращает, не является кратчайшим путем. Проблема заключается в жирной строке, где я пропускаю путь, если его общее расстояние на открытом воздухе больше, чем ограничение maxDistOutdoors, но я не знаю, как это изменить. Когда я удаляю эту жирную линию, я получаю правильные минимальные пути, но если мне нужна такая проверка, потому что я хочу найти минимальные пути с общим расстоянием снаружи меньше, чем maxDistOutdoors.

Я уже пробовал печатать заявления, и я собираюсь сдаться. Я просто не понимаю, почему это неправильно сейчас.


person Glassjawed    schedule 07.05.2011    source источник
comment
Я не уверен, почему ваш код оказывается неверным. Однако знаете ли вы, что это невероятно неэффективно? Мне кажется, что вы ищете все возможные нециклические пути, начинающиеся в начальном узле, чтобы найти кратчайший. Есть гораздо более быстрые способы сделать что-то.   -  person Walter Mundt    schedule 07.05.2011
comment
Я знаю, но я не знаю, как кодировать такой метод. Но да, меня бесконечно сбивает с толку, почему мой оператор if дает какие-то результаты.   -  person Glassjawed    schedule 07.05.2011
comment
Для простой функции кратчайшего пути взгляните на python.org/doc/essays/graphs< /а>. Может помочь.   -  person Rob Cowie    schedule 07.05.2011


Ответы (1)


Ваш код не возвращает кратчайший путь, поскольку используемый вами алгоритм (DFS ) не возвращает кратчайший путь. Вместо этого попробуйте BFS!

Однако, поскольку у вас есть некоторые ограничения по весу (расстояние на улице), вам следует проверить алгоритм кратчайшего пути Дейкстры. Вам должно быть довольно легко интегрировать ваши ограничения.

person Ian Bishop    schedule 17.06.2011