Я создал код для реализации в политике контроля Монте-Карло по проблеме БлэкДжек из openAIgym в записной книжке Python.
import gym
import random
from matplotlib import pyplot
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from collections import defaultdict
from functools import partial
import numpy as np
%matplotlib inline
plt.style.use('ggplot')
env = gym.make('Blackjack-v0')
q = defaultdict(lambda:1)
def epsilon_greedy_policy(state, epsilon):
if random.uniform(0,1) < epsilon:
return env.action_space.sample()
else:
return max(list(range(env.action_space.n)), key = lambda x: q[state,x])
def generate_episode(epsilon): #if we add policy and environment as args: flexible
states, actions, rewards = [], [], [] #create storages
observation = env.reset() #initiate environment
while True:
states.append(observation)
action = epsilon_greedy_policy(observation, epsilon)
actions.append(action)
observation, reward, done, info = env.step(action)
rewards.append(reward)
if done:
break
return states, actions, rewards
def mc_control (n_episodes):
q = defaultdict(lambda:1)
N = defaultdict(int)
for episode in range(n_episodes):
states, actions, rewards = generate_episode(0.2*(n_episodes-episode)/n_episodes) #start exploiting more and more over time
returns = 0
for t in range(len(states)-1, -1, -1):
R = rewards[t] #reward
S = states[t] #state
A = actions[t]
returns += R
N[S,A] += 1
q[S,A] = (returns + q[S,A]*(N[S,A]-1)) / N[S,A]
return q
q_short = mc_control(50000)
q_medium = mc_control(500000)
q_long = mc_control(5000000)
def value_creation(q):
value_function = defaultdict(list)
for s, a in q:
value_function[s].append(q[s,a])
for s in value_function:
value_function[s] = max(value_function[s])
return value_function
value1 = value_creation(q_short)
value2 = value_creation(q_medium)
value3 = value_creation(q_long)
Код, кажется, работает очень хорошо, однако, если я пытаюсь получить оценкуэффективность политики путем суммирования различных V (s) в пространстве состояний (sum (value.values ())), я вижу, что это уменьшается вместе с увеличением количества сгенерированных эпизодов (50 000, 500 000, 5000 000): 18.02691323585902 -2.3781486288952207 -3.541695462098351
Обычно это не должно быть проблемой, и это просто указывает на то, что первый элемент управления MC был чрезмерно оптимистичным в своей оценке функции значения.Однако, когда я вычисляю тот же показатель для программы, которая использует следующую эвристику:
Хит, если сумма игрока меньше 15.
Чем сумма значений -0,2527627229724029.
Есть идеи, как это возможно, учитывая тот факт, что контроль по политике должен возвращать оптимальную политику, которая должна превосходить любую другую модель?Просто мой политический контроль еще не сошелся?Использую ли я неправильную оценку производительности, потому что я не принимаю во внимание частоту возникновения состояний?Мой код неверен?
Заранее спасибо.