поиск кратчайшего графика в параметрах - PullRequest
0 голосов
/ 07 мая 2011
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.

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

1 Ответ

1 голос
/ 17 июня 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...