간단한 Q 알고리즘 적용 실습

import numpy as np
import random as pr

def rargmax(vector):
    """ Argmax that chooses randomly among eligible maximum indices."""
    m = np.amax(vector)
    indices = np.nonzero(vector == m)[0]
    return pr.choice(indices)

액션을 정하기 위한 알고리즘을 정의합니다. Q테이블의 액션 기대값이 가장 큰 액션을 선택하거나, 모든 액션의 기대값이 0 이라면 랜덤하게 액션 선택합니다.

import gym
from gym.envs.registration import register

register(
    id='FrozenLake-v3',
    entry_point='gym.envs.toy_text:FrozenLakeEnv',
    kwargs={'map_name' : '4x4', 'is_slippery': False}
)
env = gym.make('FrozenLake-v3')

gym 패키지를 import하고 OpenAI GYM에서 제공하고 있는 환경 중 FrozenLake-v3 환경을 생성합니다.

# Initialize table with all zeros
Q =np.zeros([env.observation_space.n,env.action_space.n])

Q 테이블의 모든 값을 0으로 초기화 합니다.

# create lists to contaion total rewards and steps per episode
rList = []

# Set learning parameters
num_episodes = 2000

for i in range(num_episodes):
    # Reset environment and get first new observation
    state = env.reset()
    rAll = 0
    done = False

    # The Q-Table learning algorithm
    while not done:
        action = rargmax(Q[state, :])

        # Get new state and reward from environment
        new_state, reward, done,_ = env.step(action)

        # Update Q-Table with new knowledge using learning rate
        Q[state,action] = reward + np.max(Q[new_state,:])

        rAll += reward
        state = new_state

    rList.append(rAll)

총 2000번의 에피소드를 정의하고 에피소드가 끝날때까지 액션을 취하고 최종 보상값을 리스트에 담습니다.
이 때 액션은 위에서 정의한 알고리즘을 통해 정합니다.

print("Sucss rate: " + str(sum(rList)/num_episodes))
print("Final Q-Table Values")
print("LEFT DOWN RIGHT UP")
print(Q)

2000번의 에피소드 중 목적지까지 도달한 횟수에 대한 확률과, 최종 에피소드까지 완료 후의 Q 테이블 값을 출력합니다.

import matplotlib.pyplot as plt

plt.bar(range(len(rList)), rList, color="blue")
plt.show()

matplotlib 패키지를 import하고 성공한 횟수를 그래픽으로 출력합니다.

  • 그래프를 출력하는 코드는 notebook 또는 pycharm등의 애플리케이션 환경에서는 정상적으로 실행되지 않습니다. 터미널을 이용하여 직접 실행 해야 합니다.
(Jupyter Notebook 실습코드 - 하단이 보이지 않을 경우 새로고침)

results matching ""

    No results matching ""