Нахождение оптимального пути - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь найти оптимальный путь для автомобиля из заданного
initial_state (из списка формы [строка, столбец, ориентация]) до заданной цели (вида список [строка, столбец]) .

Автомобиль может свободно двигаться вперед в разных направлениях (вверх, влево, вниз, вправо).

Может выполнять 3 действия:
Повернуть направо и двигаться вперед (2), Продвинуться вперед (1), Повернуть влево и двигаться вперед (20)
Примечание: цифры в скобках - это затраты, связанные с выполнением соответствующих действий

Поворот происходит в той же ячейке.
2D-список (называемый grid ), который состоит из 0 и 1, задается как вход (2D нециклический мир).
0 --- навигационная ячейка
1 --- неходовая ячейка

Задача состоит в том, чтобы найти путь (с наименьшей стоимостью) из более чем одного из возможных путей.

Вот мой код.

forward = [[-1,0],[0,-1],[1,0],[0,1]]
forward_name = ['up','left','down','right']
action = [-1,0,1]  ## turnRight, noTurn, turnLeft
action_name = ['R','#','L']
grid = [[1,1,1,0,0,0],
        [1,1,1,0,1,0],
        [0,0,0,0,0,0],
        [1,1,1,0,1,1],
        [1,1,1,0,1,1]]
init = [4,3,0]  ## for init[2]-- 0-up, 1-left, 2-down, 3-right 
goal = [2,0]
cost = [2,1,20]  ## turnRight, noTurn, turnLeft

def optimum_policy2D(grid, init, goal, cost):
    value = [[999*i for i in row] for row in grid]
    #print(value)
    r,c,orientation = init
    Routes = []   ##list of routes
    Routes.append([0,[init[:2]],orientation]) 
                   ## [cost,list of cell in the route,orientation]

    while [r,c]!=goal:
        presentRoute = Routes[0]
        for i in range(len(action)):
            dr, dc = forward[(presentRoute[2]+action[i])%4]
            if r+dr in range(len(grid)) and c+dc in range(len(grid[0])) and 
            value[r+dr][c+dc]!=999:
                thisRoute = presentRoute[:]
                thisRoute[1].append([r+dr,c+dc])
                thisRoute[0] += cost[i]
                thisRoute[2] = (thisRoute[2]+action[i])%4
                Routes.append(thisRoute[:])
        Routes = Routes[1:]
        Routes.sort()
        r,c = Routes[0][1][-1]
    print(Routes[0])

optimum_policy2D(grid, init, goal, cost)   

Я создаю список-значение 2D с произвольно высоким значением 999 (выше, чем максимальная вовлеченная стоимость) в ячейках, которые не предназначены для навигации.

Далее я создаю пустой список (называемый Routes), в котором будут храниться разные маршруты. Каждый маршрут будет иметь вид - [стоимость, список ячеек в маршруте, конечная ориентация автомобиля] . Перед входом в маршрут while-Loop инициализируется начальное состояние (так как оно будет частью любого маршрута).

Проверки for-Loop для действительного соседа (Validity of Neighbor - должен быть в сетке, должен быть навигационным).

Для действительного nieghbour-
создайте копию presentRoute в thisRoute.
добавьте новые координаты ячейки в список ячеек в маршруте.
обновление стоимости в соответствии с выполненным действием.
обновление окончательной ориентации в соответствии с действием.
* Наконец, добавьте этот новый маршрут к Маршрутам.
(с каждым действительным соседом новый маршрут добавляется к Маршрутам)

Маршруты [0] теперь удалены. При сортировке маршрута первым маршрутом в списке будет маршрут с минимальной стоимостью. Переменные 'r' и 'c' обновляются последней ячейкой маршрута минимальной стоимости.

Как только [r, c] равен цели, мы нашли маршрут с минимальной стоимостью.

Вывод отличается от моего убеждения. Я ищу ошибки в этом коде.

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