RPG Maker
2006.05.14 06:51

자가진화하는 CPU 플레이어

조회 수 400 추천 수 1 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

프로그래밍 초보분이나 초보툴러(만들기 시리즈를 많이 다루시던분)께서는 개념이해가 안 될수 있습니다.
(이해가 안되시는 분께선 대단히 죄송하지만 뒤로 버튼을 누르시거나 반복 학습 <- 을 해주시기 바랍니다)

숙달된 툴러라면 약간 힘드시더라도 분명 이해할 수 있는 내용이라고 생각하니 역시 반복학습 <- 을 당부드립니다.

-결국 공부는 반복학습. 별거 있습니까?-

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※



지금부터 본인이 쓰려는 글은 인공적인 유전자를 만들어 이것을 진화, 돌연변이, 교배 등을 시키는 방식의 AI컨트롤 입니다.

정확히 말하면 정확한 의미에서의 AI는 아니고 인공 유전자를 만들고, 진화 시키는 방법에 대한 글이니 AI컨트롤이라는 설명은 어폐가 있습니다만 가장 적절하다고 했각했기에..;;

각설하고 시작하겠습니다.

-----------------------------------------------------------------------------------------------


스텝1. 케릭터 이동의 유전자

뱀꽁다리1.
C/C++/VB/.NET 등으로 게임을 만드는 분들은 케릭터 이동이 단순 4방향이 아닌 8방향. 또는 다방향으로 이동할 수 있습니다만

가장 기본이 되는 4방향으로 설명을 하도록 하겠습니다. 그외의 다방향 이동에 대해선 알아서 고민해보세요. 시간과 전력 자원은 무한한것이 아니기에...;;;


4방향 이동 가능 케릭터의 이동가능 방향?
-상, 하 좌, 우

상식입니다만 상식이 중요해지는 유전자 컨트롤입니다.
지금부터 이 '상, 하, 좌, 우' 을 유전자로 인코딩하겠습니다. 각기 '1, 2, 3, 4'에 대응 시키는 작업일 뿐으로 그리 어려운 것은 아닙니다.

'인코딩 된' 4방향 이동 가능 케릭터의 이동가능 방향?
-1, 2, 3, 4

이동가능한 방향이 유전자 1, 2, 3, 4 로 인코딩 되었습니다. 이것을 유전자 객체(집단)으로 만들어야 합니다.
임의로 10개 단위의 이동명령 유전자 객체를 만들어보겠습니다.

1, 3, 4, 2, 4, 3, 4, 1, 2, 4

디코딩합니다.

상 좌 우 하 우 좌 우 상 하 우


임의로 만들어진 만큼 쓰잘데기 없는 유전자가 되었군요.
하지만 여러분은 지금 BC 65000 년 전 보다 훨씬 오래 전에 만들어진 유전자 객체 하나를 만든 것 입니다.

이 유전자 객체가 진화하고 발전하려면 이 것과 비슷한 객체가 필요하고 교배(유전자 교환)를 하고
돌연변이 (유전자 치환) 를 통해
자식 (두 부모 유전자에게서 더 나은 부분을 얻은 유전자 객체)을 낳아야 합니다.


즉 이런 유전자 객체가 더 많이 필요 합니다. 몇 개나 만들지는 프로그래머 마음입니다만 너무 많이 만들면 성능에 저해를 준다는 사실도 잊어선 안되겠습니다.


맵을 하나 만듭니다.


1 2 3 4 5 6
- - - - - -
1            
             2
- - - - - -

1에서 출발해 2까지 다가가는 심플한 맵입니다. 장애물도 없고 단순히 다가가기만 하면 되는 맵으로 AI 성능 테스트에는 아주 쓸 만합니다.

위에 숫자를 적어놨듯이 가로축 (x축) 좌표의 길이는 6이고, 세로축 (y축) 좌표는 2 입니다.

즉 1에서 시작해 2까지 도달하는데에는 7개의 이동 유전자면 충분합니다.
하지만 눈치가 좋은 분이라면 이미 알아채셨겠지요.

랜덤하게 만든 이 유전자로는 10개든 20개든 2까지 찾아가기 무척이나 힘들거란 사실을 말입니다.


여하튼 가장 중요한 부분의 설명을 시작해 봅시다.


과정1. 10개의 정수 유전자를 불러들여 디코딩한다.
과정2. 디코딩한대로 움직이되 움직일 수 없다면 무시하고 다음 유전자로 이동한다.
과정3. 이동 후 출구까지의 절대 거리를 계산해 전과 비교 멀어졌다면 점수를 깍고 가까워졌다면 점수를 얻는다.
-이 점수를 '적응도'라 부른다.-

매우 간단하지 않습니까?

각 유전자 객체를 불러들여 디코딩하고, 1회 이동 시킵니다. 이동 방향에 따라 점수(적응도)를 가감하고 다음 이동을 실행합니다.
모든 유전자의 이동이 끝났다면 각 유전자 객체의 점수를 계산합니다.

그리고 진화 시킵니다.

진화 시키는 방법에는 몇가지 방법이 있습니다만 두 개의 기본과 한개의 옵션을 설명해 드리도록 하겠습니다. (그 외의 방법은 무척 복잡한 수식이 들어가기 때문에 설명해 드리고 싶어도 무리가 따릅니다.)

뱀꽁다리3
아래 나오는 것들의 로직 설명은 하지 않습니다. C++로 코딩된 문장이 있긴 합니다만 역시 시간과 전력은 무한이 아니므로.. 라기보단 귀찮군요. <-
요청이라도 하신다면 한번 쳐보긴 하겠습니다만.....;;
뭐 로직 고민해 보시는 것도 공부의 일환이라 생각하시고... <-


첫번째 기본기: 토너먼트 선택.

모든 유전자 객체 중 두 개를 랜덤하게 선발해서 적응도를 비교합니다.
상대편에 비해 적응도가 높은 2개의 유전자 개체를 선택합니다.

이 방법은 최하의 적응도를 가지고 있는 유전자는 절대 선택 될 수 없습니다. (너무 높은 적응도만을 선호하면 지역적 최소값 (차후설명) 에 빠질 가능성이 있습니다.)


두번째 기본기: 룰렛 선택

모든 유전자 객체의 적응도에 따라 랜덤하게 선택합니다.
쉽게 말해 룰렛을 돌리고 거기에 다트를 던져 맞은 유전자 객체를 선택하되.
적응도가 높은수록 룰렛에서 넓은 면적을 차지합니다.

이 방법은 최하의 적응도를 가지는 유전자가 선택될 가능성도 있지만 높은 적응도를 가지는 유전자가 선택되지 못해 퇴화할 가능성이 있다는 불안을 가지고 있습니다.


옵션 : 엘리트 주의

유전자 객체의 집단 중 취고의 적응도를 가지는 상위 약간개의 유전자 객체를 강제로 다음 세대에 복사합니다. 이 때, 주의점이 있습니다.
전체 뽑는 유전자 객체의 수에서 엘리트 주의로 강제로 유전시킨 숫자도 빼야 한다는 이야기입니다.

즉 이렇습니다.

부모 유전자수 유전자 100개. (뽑을 개수)
자식의 수 50개 (만든 개수)

이렇게 되어야 하는 것이. (자식 유전자 개수의 2배 만큼 어미를 뽑아야 합니다)

부모 유전자 수 100개 + 10개 (엘리트 주의를 적용해 상위 10개를 강제로 뽑았습니다)
자식의 수 50개 + 5개 (엘리트(??) 자식의 수)

이렇게 되면 C나 C++ 같은 경우 배열의 개수가 넘쳐서 오버플로에러를 내게 됩니다. RPG만들기 툴의 경우는 어떻게 될지 예상하기도 힘듭니다.

무슨 말을 하고 싶은 건지 이해 하셨다면 다음으로 넘어가시기 바랍니다.


어미 유전자를 모두 뽑았다면 이제 자식을 만들어야 합니다.
자식을 만드는 방법도 몇가지 있습니다만 1가지 기본과 1가지 돌연변이에 대해서만 설명하도록 하겠습니다.


과정1. 부모1 에서 임의의 두점을 선택합니다.
과정2. 부모2 에서 임의의 두점을 선택합니다.
과정3. 부모2 에 선택된 임의의 두점 사이에 부모 에서 선택된 두점 사이의 유전자를 복사해 넣습니다.
과정4. 부모2 의 뒤로 삐져나온 게놈을 절단합니다.
과정5. 부모2 의 각 유전자에 돌연변이를 적용합니다.
과정6. 부모2 가 자식 유전자로 다시 태어났습니다.

돌연변이를 제외하면 C/C++ 사용자에게 로직구성하는데 문제는 없겠지요.
RPG 만들기 유저라면 한개의 변수를 한개의 유전자 삼아 계산을 해야 합니다.

10개짜리 유전자 개체 10개를 만든다면 100개 + @(이건 게놈의 적응도나 부모의 교환점 4개를 등을 저장하는 등의 추가 변수 입니다.)의 변수가 필요하게 되는거죠.
노가다가 됩니다만 불가능한 것은 아닙니다..

(단지 한가지 조언하고 싶은게 있다면 RPG만들기로 유전자 기반의 AI짜기보단 그냥 로직 기반 AI를 짜라고 말씀드리고 싶습니다.)
뭐 개인의 선택이니 넘어가도록 합니다.


돌연변이를 일으키는 방법은 매우 쉽습니다.

위의 과정 5부분에서 유전자 개체의 각 유전자마다 확률 검사를 합니다. 대개 0.01 정도를 선호한다고 합니다. 확률검사에서 성공했다면 위의 1, 2, 3, 4 중의 하나로 임의로 치환합니다.


자 이것으로 기초적인 유전자 프로그래밍이 끝났습니다.
이것의 응용도는 무궁무진 합니다.

위에서 사용한 것과 같이 단순히 이동을 효율적으로 하는 AI로써 사용할 수도 있지만 공격 패턴 등 을 결정할 수도 있습니다. (다만 완전 턴제 전투에서 이 AI를 사용하는건 자제해 주십시오. 이 AI방식으로 훈련된 CPU는 매우 교활합니다. 분명히 시작하자마자 초강력 기술이나 교란 마법 퍼붓고는 평타 고고 할겁니다.)


다만 문제점도 있는데 초반의 적 AI가 형편없다는 겁니다. 이 문제는 게임 시작하자마자 가장의 적, 또는 미로를 준비하여 미리 유전자 객체를 '초기화' 시키는 과정이 필요합니다.

일정한 세대 (부모가 적응도 테스트를 거쳐 자식을 만들어 내는 일련의 과정을 '세대'라고 합니다)가 지나거나 일정한 적응도가 나올때까지 훈련 시킬 수 있을 것입니다.


음... 예제 파일로 C++로 작성 된 재밌는 프로그램을 하나 업로드 시켜드리겠습니다.

상업적 목적이 아닌한 재배포를 허용하는 것이니 올려도 상관없겠지요.
(모 전문서적의 예제입니다)

프로그램의 컨트롤은 간단합니다. F키를 누르면 빠르게 진행되고 R키를 누르면 리셋 됩니다.

처음 시작하면 지뢰(녹색 네모)와 빙글빙글 도는 지뢰탐지기 들이 보이는데 F키를 눌러서 제네레이션을 2까지 빠르게 돌린 후 다시 F키를 눌러 지뢰탐지기의 화면으로 돌아가세요.

놀랍도록 똑똑하게 지뢰를 제거하는 놈들의 모습이 보일겁니다.




에.. 마지막으로 지역적 최소값은.
쉽게 예제를 들어 설명하겠습니다.

3, 2, 1, 4, 0

이런 행렬이 있다고 합니다. 그리고 이 행렬에서 가장 작은 최소값을 찾아내는 유전자 객체가 있다고 합시다. (물론 C/C++의 경우 간단한 코딩으로 되는 거긴 합니다만..)

이 유전자 객체가 너무 우수한 것만 쫒다보면

3에서 2로 2에서 1 까지는 잘 찾아갑니다만 1에서 4로는 가려하질 않습니다.
왜냐하면 작은 값으로만 이동해야 점수가 늘어나니까요.

즉 1 -> 4 의 방향으로가면 점수가 줄어들기 때문에 우수한 녀석들은 1에서만 빙빙돌고 4로 가려하질 않는 겁니다.

(그래서 빠른 진화를 추구할 때는 엘리트를 최대한 우대하고 최종적인 진화라는 측면을 볼때는 바보도 필요한 겁니다. 바보라면 점수가 줄든 말든 4 다음의 0까지 체크를 한 테니까요)

하지만 전체 행렬을 보면 제일 작은 값은 1이 아니라 0이지요.

이 행렬이 무지 길어서 인간이 이런 오류를 찾아 낼수 없었고, 이 AI가 찾아낸 '지역적 최소값'을 그대로 프로그램에 사용한다면 이는 문제가 됩니다.

이런 '지역적 최소값'에 빠지지 않는 것도 AI프로그래밍에 매우 중요한 것이라 할 수 있겠습니다.
?

  1. [Orchestral Instrumentation] 4. 비올라

    Date2006.05.03 Category언어/기타 ByPianoForte Views383
    Read More
  2. 마법상점

    Date2005.12.30 Category언어/기타 Byrlsrnjs Views387
    Read More
  3. 한방씩 주고 받는 턴제식 rpg 잠시 30분동안 만들어봣습니다 .ㅋ

    Date2005.12.30 CategoryRPG Maker By*YeNa* Views388
    Read More
  4. 밑에 교역시스템글... 여러가지 추가

    Date2006.01.08 Category언어/기타 ByRess Views391
    Read More
  5. VB/VC 키코드 리스트

    Date2006.05.30 Category언어/기타 By알닭 Views391
    Read More
  6. 스타 맵을 만들어볼까? -트리거 1-

    Date2006.09.28 Category언어/기타 By다크세이버™ Views392
    Read More
  7. 자료구조 (2) - Queue[민프레스 강의정리]

    Date2005.12.31 Category언어/기타 By성령의분노 Views392
    Read More
  8. 스타 맵을 만들어 볼까? -기초 2-

    Date2006.09.24 Category언어/기타 By다크세이버™ Views394
    Read More
  9. 변신을 하면 공격속도가 올라간다?

    Date2005.10.01 Category언어/기타 By게임시작 Views394
    Read More
  10. 0.0초 대기시간 분석 (전에 올렸는데 없어졌군요)

    Date2006.09.01 Category언어/기타 By[S's-S] Views394
    Read More
  11. VNAP 배경음 예제

    Date2006.09.14 Category언어/기타 Bydnajs Views395
    Read More
  12. 스타 맵을 만들어 볼까 ? -기초 3-

    Date2006.09.26 Category언어/기타 By다크세이버™ Views395
    Read More
  13. 0.0초 대기시간 분석 (전에 올렸는데 없어졌군요)

    Date2006.09.01 Category언어/기타 By[S's-S] Views397
    Read More
  14. 제글읽고 답좀...

    Date2006.01.09 CategoryRPG Maker ByONEVlN Views400
    Read More
  15. 아르바이트,.

    Date2005.11.11 Category언어/기타 By㈜웃음돌이 Views400
    Read More
  16. 자가진화하는 CPU 플레이어

    Date2006.05.14 CategoryRPG Maker By니체 Views400
    Read More
  17. MSN 주소를 알려주세요.

    Date2006.09.28 Category언어/기타 ByMrGeek Views401
    Read More
  18. 스타 맵을 만들어 볼까? -기초 4-

    Date2006.09.27 Category언어/기타 By다크세이버™ Views403
    Read More
  19. if문

    Date2006.10.05 Category언어/기타 Bydnajs Views407
    Read More
  20. 한국 위키백과를 추천합니다.

    Date2006.08.29 Category언어/기타 ByMrGeek Views408
    Read More
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 51 Next
/ 51






[개인정보취급방침] | [이용약관] | [제휴문의] | [후원창구] | [인디사이드연혁]

Copyright © 1999 - 2016 INdiSide.com/(주)씨엘쓰리디 All Rights Reserved.
인디사이드 운영자 : 천무(이지선) | kernys(김원배) | 사신지(김병국)