본문 바로가기
기계공학부 시절의 기록/강화학습일기

[MC-블랙잭] Monte Carlo에서 Q-table 어떻게 만들어? (1) 튜플

by juhyeonglee 2021. 11. 2.
728x90
반응형

 

참고하기 위한 코드와 글들을 찾으며 공부한 내용을 기록하였다.

클래스를 활용한 코드들도 있고 그렇지 않은 코드들도 있었다. 

코드진행을 이해하기 위해서 파이썬에서의 클래스 문법을 공부하였고 블랙잭게임에서의 state 데이터를 나타내고 처리하기 위해서 튜플을 활용함을 발견하여 튜플에 대해서 공부하였다. 

 

파이썬도 클래스

몬테카를로 방법으로 BlackJack 예제를 풀고 있다.

이전 Gambler's Problem과 같이 간단한 예제는 함수로만 진행했는데 게임룰이 조금 복잡해지고 다른 사람들의 코드들을 보다보니 클래스를 많이 쓰는 것을 볼 수 있었다.

 

파이썬은 절차형, cpp은 객체형 언어로 알고 있었는데 파이썬에서도 객체를 쓰나보다.

'아무튼 워라벨'님의 블로그. 파이썬에서의 클래스 설명

 

 

monte carlo에서 어떻게 Qtable을 만들까?

생성자를 통해서 클래스선언과 동시에 객체변수를 만드는 것 등이 cpp과 비슷함을 알 수 있었다.

어려운 점은 Qtable을 만들기였다.

블랙잭게임에서 state는 (플레이어카드합, 딜러카드1장, 에이스카드활용여부)로 모든 경우의 수는 200이다.

예를 들어 (14, 1, True)라고 하면 플레이어의 두 장의 카드 합은 14, 딜러가 보인 한 장의 카드는 에이스카드, 플레이어의 에이스카드는 11로 활용함을 의미한다. 이 때에 취할 수 있는 액션은 (hit, stack) 두 가지 뿐이다. 

따라서 총 200 by 2 의 Qtable을 만들고 에피소드를 진행하며 얻어지는 Q(state, action)을 갱신해야한다.

(13, 1, True)와 (20, 8, False)는 각각 200개의 행 중에 어느 행에 속해야 하는가?? 이러한 state들의 순서를 매기기도 어렵다. 

 

그러던 중 아래의 좋은 참고자료를 발견하였다.

 

조르디교수의 MC prediction 내용 설명

(참고. 조르디교수의 MC control 내용설명)

 

조르디교수의 MC prediction 내용 설명을 읽으면서 중요한 내용을 발견했다. 바로 에피소드는 리스트자료형으로 만들고 그 안에 (state, action, reward) 튜플을 append하고 state는 또 (playerCardSum, dealerShowing, usableAce)로 이루어진 as a list of tuples of tuples라는 것이다.

 https://towardsdatascience.com/monte-carlo-methods-9b289f030c2e

 

 파이썬 튜플 설명글

요약 : 튜플은 리스트와 매우 유사하지만 튜플은 읽기전용이라는 점에서 리스트와 다르다. 튜플은 다양한 타입의 데이터를 원소로 가질 수 있다. 신기한 점은 리스트도 하나의 원소로 가질 수 있다는 점이다. 튜플은 수정이 불가능하지만, 튜플 안의 리스트는 변경이 가능하다. 그럼에도 튜플이 읽기전용이라고 할 수 있는 이유는 identity of an object는 절대 변하지 않기 때문이다. 즉 리스트의 id는 그대로 이므로 읽기전용이라 할 수 있다. identity of an object는 메모리 상에 저장된 객체의 위치라고 생각하면 쉽다. 한마디로 튜플은 수정불가. 그리고 리스트보다 속도가 빠르다. 즉, 안전하고 빠르다는 장점이 있다.

 

구글검색('identity of an object')

The identity of an object distinguishes one object from another. It is useful to think of an object's identity as the place where its value is stored in memory.

 

그리고 내가 활용할 튜플의 성질은 블랙잭게임에서 state를 나타낼 때, (playerCardSum, dealerShowing, usuableAce)를 매 스텝마다 나타내며 시퀀스를 만들어야 한다. 아래의 성질들을 이용하면 될 것 같다.

 

성질1.

https://www.datacamp.com/community/tutorials/python-tuples-tutorial의 끝자락

성질2.

튜플은 리스트 안에서 append시킬 수 있을 것이다.

에피소드 생성 코드 공부

def 에피소드생성함수()

  episode = [] # 에피소드를 담을 빈 배열 생성

  state = (random(playerCard), random(dealerShowing), random(usuableAce))

  while True:

    action = random(actions) # 랜덤 action 취함

    next_state, reward, done = env.step(state, action) # env.step(state, action)로 next_state, reward, done 얻기

    episode.append((state, action, reward))

    state = next_state    

    if done: 

      break

  return episode

 

728x90
반응형

댓글