Пример #1
0
def decaying_epsilon_and_run(agent,
                             env,
                             decaying_factor: float,
                             n_runs: int = 5000):

    agent.decaying_epsilon(decaying_factor)
    agent.reset_statistics()

    print("epsilon : {}".format(agent.epsilon))

    for _ in range(n_runs):
        run_episode(env, agent)

    agent.improve_policy()

    fig, ax = plt.subplots(1, 2, figsize=(12, 6))
    visualize_value_function(ax[0], agent.v, nx, ny)
    _ = ax[0].set_title("Value pi")
    visualize_policy(ax[1], agent._policy_q, nx, ny)
    _ = ax[1].set_title("Greedy policy")
Пример #2
0
    reward_sum = 0
    env.reset()
    while True:
        state = env.s
        action = sarsa_agent.get_action(state)
        next_state, reward, done, info = env.step(action)
        next_action = sarsa_agent.get_action(next_state)

        sarsa_agent.update_sample(state=state,
                                  action=action,
                                  reward=reward,
                                  next_state=next_state,
                                  next_action=next_action,
                                  done=done)
        reward_sum += reward
        if done:
            break

    sarsa_rewards.append(reward_sum)

    if i % report_every == 0:
        print("Running {} th episode".format(i))
        print("Reward sum : {}".format(reward_sum))
        sarsa_qs.append(sarsa_agent.q.copy())
        iter_idx.append(i)

num_plots = len(sarsa_qs)
fig, ax = plt.subplots(num_plots, figsize=(num_plots * 5 * 5, num_plots * 5))
for i, (q, viz_i) in enumerate(zip(sarsa_qs, iter_idx)):
    visualize_policy(ax[i], q, env.shape[0], env.shape[1])
    _ = ax[i].set_title("Greedy policy at {} th episode".format(viz_i))
dp_agent.set_env(env)

## 방법 1) 정책 반복
#정책반복 : (정책 평가 + 정책 개선)을 정책이 수렴할때까지 반복!
dp_agent.reset_policy()
# policy_iteration() 안에 policy_evaluation(), policy_improvement() 계산이 들어있음
info_pi = dp_agent.policy_iteration()

figsize_mul = 10
steps = info_pi['converge']
fig, ax = plt.subplots(nrows=steps,
                       ncols=2,
                       figsize=(steps * figsize_mul, figsize_mul * 2))
for i in range(steps):
    visualize_value_function(ax[i][0], info_pi['v'][i], nx, ny)
    visualize_policy(ax[i][1], info_pi['pi'][i], nx, ny)

## 방법 2) 가치 반복
# 정책 평가와 정책 개선을 하나로 합친 알고리즘
# 정책을 쓰지 않고 상태가치함수를 가지고 업데이트를 한다
# V{k+1} = max{모든a}(R{a} + (gamma)*P{a}*V{k+1})
dp_agent.reset_policy()
info_vi = dp_agent.value_iteration(compute_pi=True)

figsize_mul = 10
steps = info_vi['converge']

fig, ax = plt.subplots(nrows=steps,
                       ncols=2,
                       figsize=(steps * figsize_mul * 0.5, figsize_mul * 3))
for i in range(steps):
Пример #4
0
print("action dimension: {} \n".format(policy_action_dim))

print("===== 정책함수 =====")
print(dp_agent.policy)

## 랜덤 정책함수 평가하기 (가치 함수를 찾는 과정)
'''
앞서 정의한 `policy_evaluation()` 를 활용해 현재 정책인 랜덤 정책에 대한 가치 함수를 추산합니다.
perform bellman expectation backup operator인 T{pi}(V)가 수렴할때까지 policy_evaluation()가 계산하고 T{pi}(V)를 뱉는다
이 v_new는 T{pi}(V)이며 이게 수렴할때까지 계산을 반복함
'''
v_pi = dp_agent.policy_evaluation()
fig, ax = plt.subplots(1, 2, figsize=(12, 6))
visualize_value_function(ax[0], v_pi, nx, ny)
_ = ax[0].set_title("Value pi")
visualize_policy(ax[1], dp_agent.policy, nx, ny)
_ = ax[1].set_title("Policy")

v_old = v_pi  # 정책 개선 정리에 대해 설명할때 사용

#정책 개선 (정책을 찾는 과정)

## "내 정책은 조금 전의 정책보다 개선된다!"
'''
`policy_improvement()` 를 활용해 greedy policy improvement 를 수행합니다.

> Greedy 정책개선
> 1. $V^{\pi}(s)$ 와 $P$, $R$ 를 이용해 $Q^{\pi}(s,a)$ 를 계산한다. <br>
$$Q^\pi(s,a) = R_s^{a} + \gamma \Sigma_{s' \in \cal{S}}P_{ss'}^aV^{\pi}(s')$$

> 2. 개선된 정책 $\pi'(a|s)$ 을 가장 높은 $Q^{\pi}(s,a)$ 값을 주는 $a$ 에 대해서 1로 설정.
Пример #5
0
sarsa_rewards = []
qlearning_rewards = []

for i in range(num_eps):
    sarsa_reward_sum = run_sarsa(sarsa_agent, cliff_env)
    qlearning_reward_sum = run_qlearning(q_agent, cliff_env)

    sarsa_rewards.append(sarsa_reward_sum)
    qlearning_rewards.append(qlearning_reward_sum)

fig, ax = plt.subplots(1, 1, figsize=(10, 5))
ax.grid()
ax.plot(sarsa_rewards, label='SARSA episode reward')
ax.plot(qlearning_rewards, label='Q-Learing episode reward', alpha=0.5)
ax.legend()

## 어? off-policy 인 Q-learning의 보상이 더 높을줄 알았는데...?
'''
off-policy인 Q-learning의 정책이 on-policy 인 SARSA의 보상보다 낮은 결과를 episode reward 를 얻었네요? 이게 무슨일일까요?
> 정답은 0이 아닌 epsilon에 있습니다.
SALSA는 epsilon이 0이 아니기 때문에 최적 경로를 찾아가는걸 잘 못한다
SALSA는 안전한 경로를 우선적으로 찾아간다
따라서 reward가 SALSA가 높다고 SALSA가 무조건 좋은것이 아니기 때문에
Reward 만으로는 optimal한 policy를 찾기 힘들다
'''
fig, ax = plt.subplots(2, 1, figsize=(20, 10))
visualize_policy(ax[0], sarsa_agent.q, cliff_env.shape[0], cliff_env.shape[1])
_ = ax[0].set_title("SARSA policy")

visualize_policy(ax[1], q_agent.q, cliff_env.shape[0], cliff_env.shape[1])
_ = ax[1].set_title("Q-Learning greedy policy")
Пример #6
0
    def reset_values(self):
        self.v = np.zeros(shape=self.num_states)
        self.q = np.zeros(shape=(self.num_states, self.num_actions))

```
'''
mc_agent.improve_policy()

mc_agent._policy_q

## 추산된 상태가치함수 V(s) 및 Q(s,a) 확인하기

fig, ax = plt.subplots(1, 2, figsize=(12, 6))
visualize_value_function(ax[0], mc_agent.v, nx, ny)
_ = ax[0].set_title("Value pi")
visualize_policy(ax[1], mc_agent.q, nx, ny)
_ = ax[1].set_title("Greedy policy")

import pandas as pd


def highlight_max(s):
    '''
    highlight the maximum in a Series green.
    '''
    is_max = s == s.max()
    return ['background-color: green' if v else '' for v in is_max]


def visualize_q(q):
    df = pd.DataFrame(q, columns=['up', 'right', 'down', 'left']).T