Библиотека для поиска оптимального пути в лабиринте задаваемом клетками и стоимостью переходов между ними.
Это простейшая реализация алгоритма ValueIteration в основе которого лежат уравнения Белмана.
Конфигурация лабиринта задается в файле bellman/config
, ввиде весов переходов между позициями. Веса должны быть
отрицательными если по смыслу перехо затруднён (стена):
class Config:
...
edges = {
('a1', 'a2'): -46.,
('a4', 'b4'): -100.,
('a3', 'b3'): -100.,
('a2', 'b2'): -100.,
('b4', 'b5'): -100.,
('c4', 'c5'): -100.,
('d4', 'd5'): -100.,
('e4', 'e5'): -100.,
('f4', 'f5'): -100.,
('g3', 'g4'): -100.,
('f3', 'f4'): -100.,
('e3', 'e4'): -100.,
('d3', 'd4'): -100.,
('c3', 'c4'): -100.,
('b2', 'b3'): -100.,
('c2', 'c3'): -100.,
('d2', 'd3'): -100.,
('e2', 'e3'): -100.,
('f2', 'f3'): -100.,
('e1', 'f1'): -100.,
('f2', 'g2'): -100.,
('d2', 'e2'): -100.,
('c1', 'd1'): -100.,
}
...
Задав конфигурацию, можно вычислить путь:
from bellman.path_finder import find_path
# вычислим путь из позиции 'a3' в позицию 'f2' при том что
# начальная ориентация робота есть 'f':
path = find_path('a3f', 'f2', debug=True)
print('План действий:')
print(path)
вывод в терминал будет следующим:
a b c d e f g
# # # # # # # #
1 | | . .
# - # # # # # # #
2 | | . | .
# # - # - # - # - # - # #
3---> . | . . . . . .
# # # - # - # - # - # - #
4 . | . . . . . .
# # - # - # - # - # - # #
5 . . . . . . .
# # # # # # # #
['a3f', 'r', 'a3r', 'f', 'a4r', 'f', 'a5r', 'l', 'a5f', 'f', 'b5f', 'f', 'c5f', 'f', 'd5f', 'f', 'e5f', 'f', 'f5f', 'f', 'g5f', 'l', 'g5l', 'f', 'g4l', 'l', 'g4b', 'f', 'f4b', 'f', 'e4b', 'f', 'd4b', 'f', 'c4b', 'f', 'b4b', 'r', 'b4l', 'f', 'b3l', 'r', 'b3f', 'f', 'c3f', 'f', 'd3f', 'f', 'e3f', 'f', 'f3f', 'f', 'g3f', 'l', 'g3l', 'f', 'g2l', 'f', 'g1l', 'l', 'g1b', 'f', 'f1b', 'l', 'f1r', 'f', 'f2r']
План действий:
['r', 'f', 'f', 'l', 'f', 'f', 'f', 'f', 'f', 'f', 'l', 'f', 'l', 'f', 'f', 'f', 'f', 'f', 'r', 'f', 'r', 'f', 'f', 'f', 'f', 'f', 'l', 'f', 'f', 'l', 'f', 'l', 'f']