무작위 방향으로 로봇 움직이기

이전 강의들에서 습득한 코딩 기법들을 이용해서 무작위로 이동하는 로봇을 그래프 상에서 동영상으로 관찰해 볼까해요.
그리고, 이세돌 9단을 이긴 알파고에도 적용되었다고 알려진, 기계학습(Machine Learning)의 한 종류인 강화학습(Reinforcement Learning). 그 강화학습에서 우리가 하게 될 무작위로 이동하는 로봇 코딩이 어떻게 사용될 수 있는지 알아보기도 할 거랍니다.


강의들은 모두 무료입니다. 단, 저작권은 키클 코딩랩 에 있으며, 무단 복제 및 배포를 엄금합니다.
이를 어길 시, 본 사이트의 서버가 미국에 있으므로, 미국법에 의해 처벌될 수도 있습니다.




무작위로 이동 방향 정하기

이전 강의(데이터 분석의 기초인 균등분포 난수 공부하기)에서 공부했듯이, 균등분포 난수는 주어진 선택 가능한 항목들 중 하나를 무작위로 선택하는 경우에 많이 사용되요.
이번 강의에서는 로봇의 네 가지 이동 방향, 즉, 위쪽, 아래쪽, 오른쪽, 왼쪽, 중 한 방향을 무작위로 선택하는 경우를 생각해 볼거랍니다. 한 방향을 선택하면, 그 방향으로 이동하고, 또 다시 한 방향을 무작위로 선택하고 이동하고를 반복할 건데요. 총 50번 반복하는 것으로 해보지요. 실제로 연구 프로젝트를 수행할 때, 입력에 따른 물체의 위치 변화 등을 간단하게 시뮬레이션 하고자 하면 이런 방식을 많이 사용한답니다.
자, 본격적으로 코딩을 시작해 볼까요?

원하는 폴더에 새로운 Python파일을 만들고, "lec7_random_move.py"라고 파일 이름을 지어 보지요.
먼저, 어떤 라이브러리들부터 사용할지 선언해야 겠죠? 아래 줄1~2와 같이 Matplotlib의 pyplot객체와 Numpy를 각각 plt와 np라는 별명으로 import해 보지요.

그리고, 줄4에서 로봇의 시작 위치 좌표를 (0, 0)으로 정해 볼게요. Numpy의 array()를 사용한 것 주목하구요. 복습이 필요하면, 여기로~~!!
줄5에서는 로봇의 이동방향을 (x, y)좌표를 이용해서 정하고 있어요. 즉, 오른쪽([1, 0]), 위쪽([0, 1]), 왼쪽([-1, 0]), 아래쪽([0, -1]), 네 방향의 이동방향을 정하는 것이지요. 그리고, 이 네 방향을 4x2 크기의 2차원 배열 (수학적으로는 행렬)로 정의한답니다. 이 행렬을 시각화 하면 다음과 같은 모양이지요. 1열은 x좌표를, 2열은 y좌표를 의미한다는 것 잊지 마세요.

10
01
-10
0-1

다음으로는 아래와 같이 코딩을 할 건데요. 무작위로 움직이는 모습을 figure 상에서 동영상으로 보여주기 위한 초기 설정들 이예요. 강의 Numpy 이용하여 로봇 위치들을 동영상으로 보여주기에서 했던 것과 같은 방식으로 코딩을 할 거랍니다.

줄7과 줄8에서 x축과 y축의 범위를 정하고 있구요.
줄10에서는 figure를 생성하고 있답니다.
동영상으로 보여주기 위한 코드들은 추후에 더 추가하기로 하구요.
줄12에서는 for 루프의 시작을 알리고 있지요. 무작위 방향으로 50번 이동할 거라고 했지요? 그래서 for 루프를 사용하는 것이고, range(50)으로 반복 횟수를 정한 것이랍니다.

이제, 네 방향 중 하나를 무작위로 정하는 코딩을 해 볼까요? 아래 줄13~줄22에서 보이는 것처럼 코딩할 건데요.
사실, 이 부분은 강의 데이터 분석의 기초인 균등분포 난수 공부하기에서 사용한 코드랑 똑같답니다. 복습이 필요하면 꼭 다시 확인해 보기를 바래요.

줄13에서 무작위로 선택한 방향의 인덱스 번호를 저장할 변수 idx_move를 초기화 하구요.
줄14에서 균등분포에 기반한 난수를 [0.0, 4.0) 범위에서 뽑아내고 있지요. 균등분포 난수를 뽑아내는 uniform()에 대한 설명을 이번 강의에서 한 번 더 할게요.

[라이브러리] Random의 uniform()

다시 코드로 돌아와서,
줄15~16에서는 생성된 난수가 [0.0, 1.0) 범위 안에 있을 때 첫 번째 방향을 선택하고 있지요.
줄17~18에서는 생성된 난수가 [1.0, 2.0) 범위 안에 있을 때 두 번째 방향을 선택하고, 줄19~20에서는 생성된 난수가 [2.0, 3.0) 범위 안에 있을 때 세 번째 방향을 선택하고, 줄21~22에서는 생성된 난수가 나머지 범위 안에 있을 때 네 번째 방향을 선택하는 것이지요.




로봇의 위치 이동하기

무작위로 이동 방향을 정했으면, 그 방향으로 이동을 해야 겠지요?
아래 줄24~줄35에 코드들이 추가되었어요. 하나씩 짚어볼까요?

줄24에서는 x좌표를 무작위로 선택된 방향으로 이동하는 코드예요. coord[-1, 0]은 가장 마지막 혹은 최근 로봇의 x좌표를 의미해요. 왜냐하면, 줄35에서 설명하겠지만, 로봇이 지나간 위치 좌표를 coord의 새로운 행으로 추가할 것이거든요.
인덱스 번호에서 -1은 가장 마지막 요소를 의미하지요? (인덱스 번호에 대한 복습이 필요하면, 문법노트의 리스트 설명을 다시 한 번 보세요~) 그래서, coord[-1, 0]는 coord라는 2차원 배열 혹은 행렬에서 마지막 행의 첫 번째 열에 있는 값을 의미한답니다. move[idx_move, 0]은 move 행렬에서 idx_move를 인덱스 번호로 갖는 행의 첫 번째 열에 있는 값을 의미하구요. coord[-1, 0]에 move[idx_move, 0]를 더하면, 현재 로봇의 위치를 선택된 방향의 x좌표를 이동하는 것이 되지요.

줄25는 줄24와 똑같은데, x좌표가 아닌 y좌표를 대상으로 한 것이죠. 그래서, coord[-1, 1]과 move[idx_move, 1]에서 인덱스 번호 0대신 1을 사용한 것이랍니다.

줄26~줄33에서는, 이동한 로봇의 위치가 앞서 정해 놓은 x축과 y축의 범위를 벗어날 경우, 최소값 혹은 최대값으로 교체하고 있어요. 이렇게 하는 이유는, 로봇이 정해 놓은 범위를 벗어나서 우리가 figure상에서 못보게 되는 것을 방지 하기 위함이예요.

줄35에서는 Numpy의 append()함수를 사용해서, 새로운 로봇의 위치 좌표를 coord에 새로운 행으로 추가하는 코드예요. append()에 대해서 자세히 알아볼까요?

[라이브러리] append()

위에 설명한 대로, Numpy의 append()를 이용하여 로봇이 지나간 위치들을 저장할 수 있답니다. 그리고 저장된 위치들을 figure에서 보여줄거랍니다.




그래프 상에서 동영상으로 보여주기

이제, 동영상으로 보여주는 코드를 추가해 보지요. 이미 해 봤던 코드이니 익숙할 것이라 믿어요.
아래 줄37~줄43처럼 코드를 추가해 보아요.

줄37에서는 figure를 깨끗하게 초기화 하는 코드지요?
줄38에서는 이어 붙여온 로봇 위치들 중 가장 최근 것, 즉, 현재 위치를 파랑색 마커를 이용해서 보여주는 코드구요.
줄39는 지금까지 저장해온 좌표들을 파랑색 선으로 그려주는 코드예요. 모든 x, y좌표들을 지칭하기 위해 콜론(:)을 사용한 것 주목하세요. 이렇게 배열의 값들을 이용하는 방법에 대해서 짚고 넘어갈게요. 아래 설명은 array() - 확장 에서도 볼 수 있어요.

[라이브러리] array() - 확장

줄41~줄43에서는 각 축의 범위를 정하고, for loop의 실행을 잠시 머추는 코드이지요.
위 완성된 코드를 실행하면, 무작위로 움직이는 파랑색 로봇과 그동안 지나온 경로를 보여주는 파랑색 선을 볼 수 있을 거예요.

그렇다면, 위 코드가 어떻게 강화학습(Reinforcement Learning)에 사용될 수 있는지 궁금하지요?
강화학습은 기본적으로 현재 상태(State)에서 무작위로 방침 혹은 정책(Policy)를 선택하고, 그 선택된 정책으로 행동하고, 행동 후에 원하는 목표를 얼마나 잘 성취하는지 평가를 하고, 그 평가를 저장하게 된답니다.
그리고, 이 과정을 무수히 반복하지요.10,000번이 될 수도 있고, 100,000번이 될 수도 있지요. 이렇게 무수히 반복되는 과정이 바로 학습(Learning) 이구요. 학습이 끝나면, 저장해 놓은 평가들을 검토해서 최종적으로 가장 최적인 정책을 선정하고 이용하게 된답니다.
우리가 위에서 코딩한 경우를 생각해 보면, 현재 상태(State)는 로봇의 현재 위치에 해당하고, 무작위로 선택된 정책(Policy)은 무작위로 선택된 로봇의 이동 방향에 해당한답니다.
물론, 위 설명이 강화학습의 모든 것을 설명한 것은 아니예요. 하지만, 기본적인 큰 그림은 묘사가 된 것이니, 상식 수준에서 강화학습을 이해하는데 도움이 되었기를 바래요.

강의에서 작성된 소스 코드 (source code)를 다운받으려면, 다음 링크를 클릭하세요: 소스 코드 다운로드
혹시, 이해가 잘 안되는 부분에 대한 질문이 있거나 다루어 줬으면 하는 주제가 있으면, 화면 오르쪽 하단에 "질문하기" 버튼을 이용해 주세요.






발자취

2019-09-11 "키클 코딩랩 - 미국 공학박사 아빠의 코딩 연구소"로 이름 변경
2019-06-28 코딩 교실 공개
2019-03-18 코딩 교실 제작 시작

바로가기
Python 배움터
C/C++ 배움터
About
Contact
Privacy Policy
강의목록
질문하기
처음으로