첫번째 알고리즘

CartPole 게임을 더 잘하기 위해서 우리의 알고리즘을 적용해볼 수 있습니다.

그전에 우선 CartPole 게임에서 하나의 행동이 정확히 어떤 영향을 미치는지 다시 한 번 확인해봅니다.

앞에서도 설명했듯이 취할 수 있는 행동은 오직 0과 1입니다.


예제1 - 행동 0의 효과

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import gym

env = gym.make('CartPole-v0')
observation = env.reset()
print(observation)

observation, reward, done, info = env.step(0)
print(observation)

env.close()
[ 0.00766095 -0.04000024  0.02519945 -0.0459994 ]
[ 0.00686094 -0.2354743   0.02427946  0.25452646]

observation의 값은 각각 [카트의 위치, 카트의 속도, 막대기의 각도, 막대기의 회전율] 을 나타냅니다.

env.step()에 0을 입력하면, 카트의 속도가 왼쪽 방향으로 증가하고 막대기의 회전율이 오른쪽으로 기우는 방향으로 변했습니다.

행동 0은 카트에 왼쪽 방향으로 힘을 가하는 것을 알 수 있습니다. 행동 1은 오른쪽 방향으로 힘을 가합니다.



예제2 - 행동 0을 반복

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import gym
from gym.wrappers import Monitor

env = gym.make('CartPole-v0')
env.reset()

for i in range(10):
    env.render()
    observation, reward, done, info = env.step(0)
    print(observation, done)
    if done:
        break
env.close()
[-0.03793191 -0.23736549  0.0445555   0.2800849 ] False
[-0.04267922 -0.43309376  0.05015719  0.58648092] False
[-0.05134109 -0.628881    0.06188681  0.89453248] False
[-0.06391871 -0.82478512  0.07977746  1.20600922] False
[-0.08041442 -1.02084216  0.10389765  1.52258913] False
[-0.10083126 -1.21705447  0.13434943  1.84581146] False
[-0.12517235 -1.41337713  0.17126566  2.17702177] False
[-0.15343989 -1.60970224  0.21480609  2.51730735] True

행동 0을 반복적으로 수행하면 카트의 속도는 왼쪽 방향으로 증가하면서, 막대기의 각도가 수직에서 오른쪽으로 증가하는 것을 알 수 있습니다.

막대기의 각도가 12도, 즉 0.20944보다 커졌을 때, done=True가 되면서 에피소드가 종료됩니다.

이 과정은 아래의 영상과 같습니다.


행동 0을 반복 선택했을 때 카트의 움직임.


예제3 - 행동 1을 반복

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import gym
from gym.wrappers import Monitor

env = gym.make('CartPole-v0')
env.reset()

for i in range(10):
    env.render()
    observation, reward, done, info = env.step(1)
    print(observation, done)
    if done:
        break
env.close()
[-0.02082118  0.23393106 -0.02717276 -0.34714004] False
[-0.01614256  0.42942876 -0.03411557 -0.64826615] False
[-0.00755398  0.62500897 -0.04708089 -0.95149378] False
[ 0.0049462   0.82073184 -0.06611076 -1.25858944] False
[ 0.02136083  1.0166345  -0.09128255 -1.57122391] False
[ 0.04169352  1.21271955 -0.12270703 -1.89092674] False
[ 0.06594791  1.40894161 -0.16052557 -2.21903212] False
[ 0.09412675  1.60519166 -0.20490621 -2.55661463] False
[ 0.12623058  1.80127914 -0.2560385  -2.90441439] True

행동 0을 반복적으로 수행하면 카트의 속도는 오른쪽 방향으로 증가하면서, 막대기의 각도가 수직에서 왼쪽으로 증가하는 것을 알 수 있습니다.

막대기의 각도가 -12도, 즉 -0.20944보다 커졌을 때, done=True가 되면서 에피소드가 종료됩니다.

이 과정은 아래의 영상과 같습니다.


행동 1을 반복 선택했을 때 카트의 움직임.


예제4 - 첫번째 알고리즘

첫번째 알고리즘을 시도해봅시다.

만약 막대기가 오른쪽으로 기울어져 있다면, 즉 observation[2] > 0 이라면 오른쪽으로 힘을 가하고, 그렇지 않다면 왼쪽으로 힘을 가하도록 해보겠습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import gym
from gym.wrappers import Monitor

env = gym.make('CartPole-v0')
observation = env.reset()

for i in range(100):
    env.render()
    # 알고리즘1:
    # 막대기가 오른쪽으로 기울어져 있다면, 오른쪽으로 힘을 가하고
    # 그렇지 않다면, 왼쪽으로 힘을 가하기.
    if observation[2] > 0:
        action = 1
    else: action = 0

    observation, reward, done, info = env.step(action)
    print(observation, done)
    if done:
        print(i+1)
        break
env.close()
[-0.02904037  0.20052606  0.04294506 -0.2595151 ] False
[-0.02502985  0.39500947  0.03775476 -0.53834927] False
[-0.01712966  0.58958087  0.02698777 -0.81890112] False
[-0.00533805  0.78432324  0.01060975 -1.10297486] False
[ 0.01034842  0.97930403 -0.01144974 -1.39231037] False
[ 0.0299345   0.78432649 -0.03929595 -1.10322938] False
[ 0.04562103  0.58974284 -0.06136054 -0.82312928] False
[ 0.05741589  0.39551159 -0.07782313 -0.55035939] False
[ 0.06532612  0.20156404 -0.08883031 -0.2831755 ] False
[ 0.0693574   0.00781398 -0.09449382 -0.01977808] False
[ 0.06951368 -0.18583473 -0.09488938  0.24165927] False
[ 0.06579698 -0.37948219 -0.0900562   0.5029681 ] False
[ 0.05820734 -0.5732271  -0.07999684  0.76596706] False
[ 0.0467428  -0.7671618  -0.0646775   1.03244478] False
[ 0.03139956 -0.96136662 -0.0440286   1.304141  ] False
[ 0.01217223 -1.15590341 -0.01794578  1.58272317] False
[-0.01094584 -1.35080731  0.01370868  1.86975617] False
[-0.03796198 -1.15583786  0.05110381  1.5813597 ] False
[-0.06107874 -0.96136004  0.082731    1.3050418 ] False
[-0.08030594 -0.76737879  0.10883184  1.03936029] False
[-0.09565352 -0.57385793  0.12961904  0.78272984] False
[-0.10713068 -0.38073299  0.14527364  0.53347393] False
[-0.11474534 -0.18792074  0.15594312  0.28986248] False
[-0.11850375  0.00467364  0.16174037  0.05013815] False
[-0.11841028  0.1971514   0.16274313 -0.18746571] False
[-0.11446725  0.38961622  0.15899382 -0.42471269] False
[-0.10667493  0.58217089  0.15049956 -0.66335419] False
[-0.09503151  0.77491424  0.13723248 -0.90512111] False
[-0.07953322  0.96793771  0.11913006 -1.15171439] False
[-0.06017447  1.16132121  0.09609577 -1.40479226] False
[-0.03694805  1.35512766  0.06799992 -1.665952  ] False
[-0.00984549  1.54939575  0.03468088 -1.9367041 ] False
[ 0.02114242  1.74413048 -0.0040532  -2.21843641] False
[ 0.05602503  1.54904743 -0.04842193 -1.92700588] False
[ 0.08700598  1.35447683 -0.08696204 -1.64972256] False
[ 0.11409552  1.16047224 -0.1199565  -1.38534996] False
[ 0.13730496  0.96703281 -0.14766349 -1.13245864] False
[ 0.15664562  0.77411939 -0.17031267 -0.88949304] False
[ 0.17212801  0.58166671 -0.18810253 -0.65482089] False
[ 0.18376134  0.38959245 -0.20119895 -0.42676815] False
[ 0.19155319  0.1978037  -0.20973431 -0.20364245] True
41

41회의 시간 스텝 동안 에피소드가 종료되지 않았습니다.

하나의 행동을 반복해서 선택했을 때와 비교해서 실력이 꽤 많이 향상된 것을 알 수 있습니다.

이 과정은 아래의 영상과 같습니다.


막대기의 각도에 따라 행동을 선택했을 때 카트의 움직임.


이전글/다음글

이전글 :