ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [MC BlackJack 결과 시각화] 학습결과 그래프로 나타내기
    강화학습일기 2021. 11. 10. 00:27
    728x90
    반응형

    1. 3D plot

    아래 사진과 같이 모든 state(playerCardSum, DealerShowing, usableAce)에 대한 Optimal Value를 나타내려고 하였다. 아직 오류가 있어 playerCardSum이 11인 값도 나타나고 있다. 원래 12 미만의 값은 없어야 한다. 현재 이를 해결하고 있다. 아무튼 아래와 같은 3D plot자체를 만들기 위해서 꽤나 어려움을 겪었다.

     

    아래의 소스코드 맨아래를 참고하였다.

    조르디교수님코드

    코드를 보면 

    먼저 x와 y의 범위를 지정한다. 그리고 이를 통해 meshgrid를 만든다. 똑같은 x 배열을 y길이방향으로 쭉 복사한다. 마찬가지로 y배열을 x길이방향으로 쭉 복사한다. 이렇게 만든 각각의 장판을 겹쳐서 보면 2차원상에 (x,y)쌍이 만들어진다.

    이 각각의 좌표 위에 Z값을 매칭시켜 3차원 plot을 그려낸다.

    여기까지는 이해가 갔지만 

    Z = np.array([get_Z(x,y,usable_ace) for x,y in zip(np.ravel(X), np.ravel(Y))]).reshape(X.shape) 코드는 공부가 더 필요했다.

    zip() 설명 블로그

    .shape, reshape 설명 블로그

    np.ravel() : n차원 행렬을 1차원 배열로 만든다. 한 줄로 쭉 세운다.

    [실습코드]

     

    1차원 행렬의 x를 meshgrid로 2차원 행렬 X로 만들었는데 이 X를 다시 1차원으로 편다. X와 Y가 일렬로 쭉 펴지면 이를 zip함수로 순서대로 쌍을 짓는다. 그리고 이를 x,y로 집어 놓고 모든 쌍에 대해서 get_Z함수로 집어넣는다. 그렇게 만들어진 행렬을 다시 기존의 2차원 행렬 X와 같은 shape인 2차원 행렬로 reshape한다.

     

    나의 경우에 맞게 get_Z함수를 수정하여 그래프를 그릴 수 있었다.

     

     

     

    2. 2D plot

    아래 그림처럼 그래프를 그릴 수 있었다.

    답과는 많이 다른 모습이다..

    코드는 구글에서 찾은 ppt 다운로드 에서 참고하였다.

    또다른 블로그 처럼 0, 1로 나타내는 것도 좋은 방법같다.

     

     

    3. 문제발생 

    Q_table과 pi_table(optimal policy)의 item개수가 너무 많다.

    Q_table은 400개, pi_table은 최대 200개여야 하는데 그 이상이 집계된다. 

    (playerCardSum 총 10가지 경우, dealerShowingCard 총 10가지 경우, usableAce 총 2가지 경우 = 총 200가지 경우. Q_table은 (s,a) 개수 만큼이며 a는 0 or 1 이므로 200 *2 = 400 가지 경우이다.)

    episode를 출력하여 state를 확인해보니 개중에 playerCardSum이 12보다 작은 것들이 보였다.

    원래 플레이어카드 합이 12보다 작은 경우 카드최대값이 10을 더해도 21보다 작으므로 자동으로 카드를 더 뽑아놓도록 코드를 작성해야했다. 이를 수정한 결과 Q_table은 400개로 확인되었지만 pi_table은 220개로 확인되었다.

    pi_table을 print해보니 playerCardSum이 11인 경우가 보인다. 이 11 때문에 220개로 집계되었다.

     

    Q_table개수는400개로 딱 맞아떨어지는데 왜 pi_table은 11이 포함됐을까?? 

    내일 이 문제를 들여다보고 plot들을 다시 해보아야겠다.

     

     

    추가피드백)

    Optimal policy를 나타내는 그래프를 교재와 같이 나타내기 위해서는 에피소드를 진행할 때 따르는 policy를 playerCardSum이 20, 21일 경우에는 강제로 stick을 하도록 하면 된다.

    그 이유는 20일 때, bust가 되지 않으면서 21이 되기 위해서는 ace카드를 얻어야 하는데 이는 확률이 매우 낮다. 때문에 매우 낮은 확률로 21이 되고 높은 확률로 bust가 되는 것을 피하기 위해서 20, 21일 때는 강제로 stick을 하도록 하는 것이다.

    728x90
    반응형

    댓글 0

Designed by Tistory.