Читать книгу Искусственный интеллект. Машинное обучение онлайн

5. Обновление функции ценности: Агент рекурсивно вычисляет оптимальные значения функции ценности для каждого состояния, применяя операцию оптимальности Беллмана, и использует их для выбора оптимальных действий.

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

Для решения этой задачи давайте реализуем простую симуляцию движения робота в лабиринте с использованием динамического программирования. Мы будем использовать простой лабиринт в виде сетки, где некоторые ячейки будут представлять препятствия, а одна ячейка будет выходом из лабиринта.

Давайте определим лабиринт, где:

– 0 обозначает свободную ячейку,

– 1 обозначает препятствие,

– 2 обозначает выход из лабиринта.

Предположим, что размер лабиринта составляет 5x5:

```

[0, 0, 1, 1, 0]

[0, 1, 1, 0, 1]

[0, 0, 0, 0, 1]

[1, 1, 1, 0, 0]

[0, 0, 1, 0, 2]

```

Теперь давайте напишем код для решения этой задачи:

```python

import numpy as np

# Определяем лабиринт

maze = np.array([

[0, 0, 1, 1, 0],

[0, 1, 1, 0, 1],

[0, 0, 0, 0, 1],

[1, 1, 1, 0, 0],

[0, 0, 1, 0, 2]

])

# Функция для вывода лабиринта

def print_maze():

for row in maze:

print(' '.join(str(cell) for cell in row))

# Находим стартовую позицию робота

start_position = np.where(maze == 0)

start_position = (start_position[0][0], start_position[1][0])

# Функция для нахождения оптимального пути через динамическое программирование

def find_optimal_path(maze):

# Инициализация функции ценности

value_function = np.zeros_like(maze, dtype=float)

# Перебираем каждую ячейку лабиринта

for i in range(len(maze)):

for j in range(len(maze[0])):

# Если ячейка – выход, присваиваем ей максимальное значение функции ценности

if maze[i][j] == 2:

value_function[i][j] = 100

# Если ячейка – препятствие, присваиваем ей минимальное значение функции ценности

elif maze[i][j] == 1:

value_function[i][j] = -float('inf')

else:

# Для остальных ячеек присваиваем среднее значение функции ценности соседей

neighbors = []