Я пытаюсь найти путь с минимальной стоимостью от точки (0, 0) до точки {(u, v) | u + v <= 100} в 2-й матрице данных, которые я сгенерировал.

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

# each cell of path_arr contains a tuple of (i,j) of the next cell in path.
# data contains the "cost" of stepping on its cell
# total_cost_arr is used to assist reconstructing the path.
def min_path(data, m=100, n=100):
    total_cost_arr = np.array([np.array([0 for x in range(0, m)]).astype(float) for x in range(0, n)])
    path_arr = np.array([np.array([(0, 0) for x in range(0, m)], dtype='i,i') for x in range(0, n)])
    total_cost_arr[0, 0] = data[0][0]

    for i in range(0, m):
        total_cost_arr[i, 0] = total_cost_arr[i - 1, 0] + data[i][0]

    for j in range(0, n):
        total_cost_arr[0, j] = total_cost_arr[0, j - 1] + data[0][j]

    for i in range(1, m):
        for j in range(1, n):
            total_cost_arr[i, j] = min(total_cost_arr[i - 1, j - 1], total_cost_arr[i - 1, j], total_cost_arr[i, j - 1]) + data[i][j]
            if total_cost_arr[i, j] == total_cost_arr[i - 1, j - 1] + data[i][j]:
                path_arr[i - 1, j - 1] = (i, j)
            elif total_cost_arr[i, j] == total_cost_arr[i - 1, j] + data[i][j]:
                path_arr[i - 1, j] = (i, j)
            else:
                path_arr[i, j - 1] = (i, j)

Каждая ячейка path_arr содержит кортеж из (i, j) следующей ячейки в пути. data содержит "стоимость" наступления на его ячейку, а total_cost_arr используется для помощи в восстановлении пути.

Я думаю, что размещение (i, j) в предыдущей ячейке вызывает некоторые конфликты, которые приводят к такому поведению.

0
O.B. 4 Сен 2020 в 16:01

1 ответ

Лучший ответ

Я не думаю, что массив - лучшая структура для вашей проблемы.

Вы должны использовать некоторую структуру данных графа (например, networkx) и использовать алгоритм например, Dijkstra или A * (производный от первого).

Алгоритм Дейкстры реализован в netwokrkx (функция кратчайшего пути).

1
ndclt 6 Сен 2020 в 13:47