1. Пример Q-обучения
Допустим есть такая комната
Если помещение представить в виде точки, то связь между помещениями представить в виде линии, как показано на следующем рисунке:
Это соответствующая карта комнаты. Мы сначала размещаем агента (робота) в любой позиции и позволяем ему идти самому, пока он не дойдет до комнаты 5, что означает успех. Чтобы иметь возможность выйти, мы устанавливаем определенный вес между каждым узлом, ребро, которое может напрямую достигать 5, устанавливается равным 100, а другое не может быть установлено равным 0, так что сетевой граф выглядит так:
В Qlearning самое главное — это «состояние» и «действие».Состояние представляет собой какой узел в графе, например 2 узла, 3 узла и т. д., а действие представляет собой операцию от одного узла к другому.
Во-первых, мы генерируем матрицу вознаграждения, В матрице -1 означает, что он не может пройти, 0 означает, что он может пройти, а 100 означает, что он непосредственно достигает конечной точки:
В то же время мы создаем таблицу Q, представляющую полученный опыт, того же порядка, что и таблица R, инициализированную матрицей 0, представляющую дисконтированное значение общего вознаграждения, которое можно получить из одного состояния в другое состояние.
Значения в таблице Q обновляются по следующей формуле:
В приведенной выше формуле S представляет текущее состояние, a представляет текущее действие, а sпредставляет следующее состояние,Указывает на следующее действие, λ — коэффициент жадности, 0
Таким образом, этапы обучения Q-обучения можно резюмировать следующим образом:
После итерации к конвергенции мы можем выбрать свой путь из комнаты на основе Q-обучения. Глядя на практический пример, сначала установите λ = 0,8, а матрицы вознаграждения R и матрицы Q инициализируются как:
Случайным образом выбираем состояние, например 1, смотрим таблицу R, соответствующую состоянию 1, то есть 1 может достигать 3 или 5, случайным образом выбираем 5, согласно уравнению перехода:
Итак, Q-таблица:
Таким образом, цель достигается, и одна попытка заканчивается. Затем выберите случайное состояние. Например, следующим состоянием, соответствующим 3 и 3, является (1, 2 и 4 — все неотрицательные состояния, соответствующие состоянию 3). Случайным образом мы выбираем 1, которое обновляется в соответствии с алгоритм:
Таким образом, таблица Q:
После непрерывной итерации наша окончательная таблица Q выглядит так:
С тем же успехом мы могли бы перенести числа из таблицы Q на схему, с которой начали:
Получив таблицу Q, мы можем выбрать свой путь по следующему алгоритму:
Например, предположим, что наше начальное состояние равно 2, тогда согласно таблице Q мы выбираем действия 2-3, затем, достигнув состояния 3, мы можем выбрать 1, 2, 4. Но, согласно таблице Q, мы получаем 1, чтобы достичь максимального значения, поэтому выбираем действие 3-1, затем в состоянии 1 мы выбираем действие 1-5 по наибольшему выбору значения, поэтому путь 2-3-1 -5.
2. Реализация кода
Приведенный выше пример можно реализовать с помощью следующего кода, который очень прост, просто вставьте полный код:
import numpy as np
import random
r = np.array([[-1, -1, -1, -1, 0, -1], [-1, -1, -1, 0, -1, 100], [-1, -1, -1, 0, -1, -1], [-1, 0, 0, -1, 0, -1],
[0, -1, -1, 0, -1, 100], [-1, 0, -1, -1, 0, 100]])
q = np.zeros([6,6],dtype=np.float32)
gamma = 0.8
step = 0
while step < 1000:
state = random.randint(0,5)
if state != 5:
next_state_list=[]
for i in range(6):
if r[state,i] != -1:
next_state_list.append(i)
next_state = next_state_list[random.randint(0,len(next_state_list)-1)]
qval = r[state,next_state] + gamma * max(q[next_state])
q[state,next_state] = qval
print(q)
print(q)
# 验证
for i in range(10):
print("第{}次验证".format(i + 1))
state = random.randint(0, 5)
print('机器人处于{}'.format(state))
count = 0
while state != 5:
if count > 20:
print('fail')
break
# 选择最大的q_max
q_max = q[state].max()
q_max_action = []
for action in range(6):
if q[state, action] == q_max:
q_max_action.append(action)
next_state = q_max_action[random.randint(0, len(q_max_action) - 1)]
print("the robot goes to " + str(next_state) + '.')
state = next_state
count += 1
Вывод кода:
Использованная литература:
Mn em studio.org/path-find in…
Ууху. Call.com/question/26…
zhuanlan.zhihu.com/p/29213893