Rule-based AI 설계

류광, 1999

이 글은 하이텔 게임 제작 동호회에 올렸던 글입니다. 게임의 인공지능을 설계하고자 하는 분들에게 도움이 되었으면 합니다.

차례 [+]

개요.

프로세서나 3차원 가속 카드 등 하드웨어의 발전으로 지난 몇년간 게임 개발에서 가장 중요한 이슈였던 3D 그래픽 문제가 해답을 거의 찾았습니다. 알고리즘은 이미 거의 다 개발되었고, 요즘 들어 하드웨어가 받쳐주기 시작하니 이제 CPU 가 딴 일을 처리할 여유를 가지게 된 것입니다.

...이제 이슈는 인공지능이 아닐까요.

화려한 그래픽과 사운드를 자랑하는 수많은 게임들 사이에서 인기를 독차지하는 게임이 되려면, 인공지능에 좀 더 시간을 투자해야 할 것입니다. 요즘 이 게시판에 인공지능 관련 글들이 많이 올라오기에, 평소 공부했던 것을 정리해 보고자 합니다. 물론 "학문적인 인공지능" 이 아니라, "게임 인공지능" 에 대한 글입니다. 학문적인 인공지능의 목표가 인간 이성의 연구 또는 컴퓨터 활용 영역의 확대라면, 게임 인공지능의 목표는 "적과 NPC를 실감나게 만들자" 입니다. 따라서 실제 인공지능학에서 다루지 않는 (또는 하찮게 여기는) 개념이나 기법이라도 목표에 맞으면 얼마든지 쓸 수 있는거죠.

Rule-base AI(영어 타이핑하기가 귀챦군요..룰 베이스드 인공지능이라고 하지요)

룰 베이스드 인공지능은 인공지능 초창기의 전문가 시스템과 일맥상통합니다. 여러가지 상황에 따른 행동 규칙을 만들어놓고 거기에 따라 캐릭터의 행동을 결정하는 거지요. 다만 If-then-else 시스템의 노가다를 좀 더 효율적으로 처리할 수 있도록 하는 겁니다.

룰 베이스드를 도식화 하면 다음과 같습니다.

  입력 - 룰 적용 엔진 - 출력

여기서 입력은 예를 들면 상대 캐릭터와의 거리, 자신의 HP, 맵타일 번호 등등입니다. 출력은 이동, 공격 등 캐릭터의 동작이 되겠지요. 게임 엔진에서 입력치들을 넘겨주면 룰을 찾아서 출력을 하고, 그 출력을 다시 게임 엔진에 넘겨주 면 게임 엔진은 그래픽이나 점수 등등을 처리하는거죠. 결국 룰 베이스드 인공지능 설계의 핵심은 룰 데이터베이스와 해석 엔진을 만드는 것입니다.

룰 적용 엔진은 뭐 수십 수백줄의 If-then-else 로 만들 수도 있고, 테이블로 만 들 수도 있습니다. 신경망을 넣으면 룰 베이스드 차원을 넘는 학습형 인공지능이 될 수도 있구요. 테이블 방식이 노력에 비해 효과가 좋고 디버깅도 쉽습니다. 테이블을 실행 파일이 아닌 다른 파일로 만들어 두면 인공지능을 손본때마다 다시 컴파일 안해도 되지요. 다음 예는 적 캐릭터의 인공지능을 다루는 것은 아니지만, 감을 잡기 좋을 것 같아서 제시해 보겠습니다. 플레이어의 움직임 처리 테이블입니다. 입력은 상태 번호와 키보드 코드, 캐릭터 주변의 맵 타일 번호이며 출력은 상태번호입니다. 상태 번호를 게임 엔진에 넘겨주면 실제적인 위치 변화, 그래픽 처리 등을 합니다.

(테이블 해석 방법: 예를 들어 서있는 상태 (1번 상태) 에서 점프키를 누른 상황이라면 현재 상태가 1번줄, 점프키는 3번 칸이므로 (1,3) 의 수치인 3이 선택되 는 방식입니다. 이정도의 간단한 엔진이라면 그냥 배열 첨자 처리만으로 끝나는 문제지요.)

키보드 관련 테이블

(현재 상태)(키입력 없음)(화살표키)(점프키)
상태1(서있음)123
상태2(걷기)123
상태3(위로점프)433
상태4(떨어짐)444

주변상황 관련 테이블

(현재 상태)(바닥)(천장)(벽)(없음)
상태1(서있음)1114
상태2(걷기)2214
상태3(위로점프)3433
상태4(떨어짐)1444

어떻습니까? 동작에 관련된 조건문 없이도 주인공의 이동과 점프를 처리할 수 있겠지요! 주인공이 상태2(걷기)에 있을때 점프키를 누르면 점프를 시작하되, 두번째 테이블에 의해 천장에 닿으면 떨어지게 (상태4) 됩니다. 떨어지는 도중 바닥을 만나면 상태1이 되어서 서있게 되는 거지요. 천장을 뚫고 점프가 가능하게 하려면 실행 파일을 다시 컴파일 할 필요없이, 두번째 표의 (2,3) 칸 수치를 3으로 바꾸면 됩니다.

룰 베이스드 엔진이 꼭 이런 형식이라는 이야기가 아닙니다. 감만 잡을 수 있으면 되는 겁니다....

좀 더 공부해 보실 분은 finite state machine 또는 finite state automata 관련 글을 인터넷에서 뒤져 보세요. 물론 Rule-based 란 단어로 검색을 해도 여러가지 글들이 나올 것입니다.

다음 글에서는 룰베이스드 인공지능 설계 과정을 단계별로 알아보겠습니다....

Rule-based AI 설계 - 단계별 과정 1

단계 1. 몇 단계의 인공지능이 필요한가

  "군대의 총 사령관은 각 병사의 건강 상태나 총탄 수를 신경쓰지
않는다. 다만 전선의 배치를 고민할 뿐이다."


                               - 어떤 인공지능 관련 글에서....

총 사령관이 각각의 병사가 얼마나 유능한지 알 수도 없고 알 필요도 없지요. 마찬 가지로 개개의 병사가 전선의 배치에 고민을 한다고 해서 무슨 소용이 있을까요. 병사에게 중요한 건 눈앞의 고지를 점령하는거지요...

게임의 전반적 인공지능 설계에 있어 첫번째 단계는 인공지능의 계층을 설계하는 것입니다. 말하자면 전략과 전술을 나누는 것입니다. (전쟁 게임에만 적용되는 것이 아닙니다...) 일반적으로 전략과 전술은 구체적인 경계선이 있는 것이 아니라고 합니다. 적용되는 범위의 크고 작음에 관계되는 것이지요. 나라와 나라 간의 전쟁의 경우 정치가의 전략 (전쟁을 통해 국민들의 불만을 누른다...) 에 비해 총사령관의 전선 배치는 전술이라 할 수 있지만, 전선 배치는 연대장이 행하는 부대 배치에 비하면 전략이라고 할 수 있는거지요. 마찬가지로 소대 단위의 전술 (너는 엄호해라, 너는 돌격이다 등등) 은 개개의 병사에게는 전략으로 받아들여 지는 것입니다. 개개인의 전술은 뭐 뛰고 구르고 하는 일이겠지요. 게임의 인공지능 역시 게임의 성격과 복잡함에 따라 인공지능이 여러 계층으로 나뉘게 됩니다. 실시간 전쟁게임의 경우

  1. 최고위 인공지능 - 맵 전체의 정보를 토대로 생산, 부대 편성, 공격 지점 등을 판단
  2. 중간 - 국지적 전투 지역에서의 판단, 결정. (전사는 앞줄, 궁수는 뒷줄 등의 전략 수준)
  3. 최하위 - 개별 유닛의 인공지능 구현 (공격, 후퇴 등등)

뭐 이정도로 나뉠 수 있겠죠. 좀 더 복잡한 (문명이나 우주 정복 시뮬 등) 게임의 경우는 더 여러단계로 나뉠 수 있겠구요. 실시간 전략 게임은 미션 별로 진행되지만 (즉 미션 클리어 조건이 미리 짜여져 있음) 정복 시뮬 같은 경우는 외교나 전쟁 결정 등등 좀 더 상위의 판단 과정이 있겠지요. 위의 예에서는 세 단계의 인공지능 엔진이 필요한 것입니다. (세 인공지능을 모두 룰 베이스드로 할 필요는 없습니다. 최근 게임들은 룰, 신경망, 퍼지, 유전자 등등을 적절히 혼합하지요. 단계별 인공지능의 성격에 맞게 적절한 것을 선택하면 되는 것입니다.)

단계를 나누는 것은 물론 만들고자 하는 게임의 성격과 복잡도를 가지고 판단하면 되며, 이것은 인터페이스나 게임의 진행 방식과 거의 맞아떨어집니다. 삼국지 시리즈 같은 경우 전체 지도 화면, 여러 정보창, 전투 화면 등으로 구성되는데 인공지능의 계층도 거기에 따라 세단계나 네단계로 나뉘어지지 않나 생각합니다. 삼국지 (코에이) 의 예를 들면

  1. 전쟁, 외교 관련 인공지능
  2. 전투 관련 인공지능
  3. 각 인물 관련 인공지능 (배신, 등용 등등)

정도면 되지 않을까요. 물론 각 단계 역시 세부적인 단계로 나눌 수 있겠지만요. 물론 전투와 인물 관련 인공지능은 상, 하 계층적 관계는 아닙니다.

단계 2. 단계별 정보를 결정.

단계를 나눈 후에는 좀 더 세부적인 작업이 필요합니다. 여기서부터 어려워지는거죠. 단계의 상하 관계를 따라 이동하는 정보를 판단해야 합니다. 또한 이 정보를 수치화, 규격화 해야죠.

위의 실시간 전쟁 시뮬인 경우 명령, 보고 계통을 따라 흐르는 정보는....

i)     최   고   위       인   공   지   능 ←각 부대위치,자원 생산량,건물상황
                                            →유닛 생산, 건물 건설, 자원 채취
         ↓                         ↑                         ↓
   부대 편성, 이동,        부대 피해 상황, 공격 성과,          ↓
   공격 명령               맵에서의 적, 아 영향력 등등         ↓
         ↓                         ↑                         ↓
ii)    중 간 단 계        인   공   지   능                    ↓
         ↓                         ↑                         ↓
   부대 각 유닛의 이동,    개별 유닛 위치, 상태, 시야에        ↓
   공격, 대형 편성 명령    보이는 적 유닛 정보 등등            ↓
         ↓                         ↑                         ↓
iii)   최   하   위       인   공   지   능                    ↓
         ↓                                                    ↓
    개별 유닛에 대한                                           ↓
    직접적인 명령                                              ↓
         ↓                                                    ↓
*    게임  엔진 (실제적 처리) ←←←←←←←←←←←←←←←←←

이런 정보들을 잘 결정하고, 적절히 수치화 규격을 만들면 이제 룰 데이터베이스를 구축할 준비가 되는 것입니다. 이 정보들이 저번 글에서 말한

   입력 - 룰 적용 엔진 - 출력

의 입력, 출력 내용이 되는 것입니다.

단계 3. 정보의 가공, 수치화

위의 예에서, 최하위 인공지능이 중간단계 인공지능 에게 이렇게 말하고 싶다고 합시다.

"유닛 3이 위험하다! 고립되어 있고 적들이 포위해 온다!!"

또는, 다음과 같이 명령을 내리려 합니다.

"탱크3 앞으로! 투척병 5는 전방의 탱크에 수류탄 투척!"

이정도야 뭐 실시간 자연어 처리 엔진을 만들면 되겠죠...(^^;) 중간에 영한 번역 루틴도 넣고.... (다국적 군이 참가하는 전략 시뮬!)

수치화 (주로 정수) 하지 않으면 사실 될 일이 없습니다. 디지털 컴퓨터이니까요. 수치화 해야 계산도 됩니다. 특히 테이블 방식의 룰 베이스드 엔진은 주로정보들이 배열의 첨자로 쓰이기 때문에 더욱 중요합니다.

그런데 위험하다라는 판단은 어떻게 할까요? 시야에 있는 적 유닛의 수, 자신의 생명력 수치, 주변 아군 유닛 수, 귀환할 기지 까지의 거리 등등등.... 이런 것들을 적절한 계산으로 "위험도" 라는 수치로 만들 수 있을 것입니다. 이러한 위험도 계산 엔진 역시 룰 베이스드 엔진으로 만들어도 되구요.

위의 단계별 정보 흐름을 잘 판단해서 실제로 룰 베이스드 엔진에 집어넣을 구체적 수치 규격, 즉 데이터 타입 과 범위, 계산 방식 등을 결정하면 이 단계도 끝입니다.

또한 이 부분에는 퍼지 이론이 개입할 여지가 많습니다. 즉 적 기지와의 거리는 구체적 정수로 계산해 내되, 이를 퍼지화 해서 대단히 멀다, 멀다, 적당한 거리이다, 가깝다, 대단히 가깝다 등으로 판단할 수 있지요. 이를 0,1,2,3,4 의 정수로 변환하면 "거리" 라는 정보의 수치화가 끝납니다.

그럼 다음에는 룰 적용 엔진, 룰 테이블 작성 등에 대해 이야기하지요.

3. Rule-based AI 설계 - 단계별 과정 2

단계 4. 세부적 계산 알고리즘 결정

단계 2에서 개별 유닛의 위치라면 그냥 유닛의 구조체 데이터 중 x, y 를 사용하면 되겠지만, 맵 전체에서 적, 아의 영향력은 어떻게 계산할까요? 또 적 기지까지의 최단 거리를 알면 좋겠는데 어떻게 계산을 할까요?

....이제 이런 문제들을 해결해야 합니다.

( 참고 삼아 영향력을 계산하는 원리를 잠깐 설명하자면, 전체 맵을 하나의 철판으로 보고, 적 유닛은 얼음, 우리 유닛은 불덩이라고 가정합니다. 맵에 유닛들이 펼쳐져 있다면 뜨거운 곳이 있고 차가운 곳이 있겠지요. 우리 유닛들이 몰려 있는 곳과 적 유닛이 몰려 있는 곳 중간지점은 미지근할것이고... 뜨거우면 우리쪽 (사실은 컴퓨터 측) 이 우세한 곳이고, 차가우면 적이 우세한 곳입니다. 이런 원리로 계산을 하더군요. 구체적인 알고리즘은 인터넷에서 map influence 관련 글들을 찾아보세요.)

그러자면 여러가지 알고리즘이나 이론들을 좀 알아야겠지요. 물론 인공지능에 관련된 것 뿐만 아니라 중력이나 가속도 등등 잡다한 것들도 많이 알아야 할 것입니다. 맵 타일 방식의 전투 시뮬이라면 길찾기 알고리즘은 기본이죠... 또 퍼지 이론도 무척 중요할 것입니다.

단계 5. 룰을 확정하고 룰 적용 엔진을 설계

룰이라... 애초에 이걸 확실히 설명했어야 하는건데 말이죠. 간단하다면 간단한 것이, 인공 지능의 사고 과정 각 단계가 룰입니다. 하나 하나의 판단, 결정마다 하나의 룰이 생기는 거죠. 그리고 룰은 입력과 출력이 있구요. 입력은 다수일 수 있으나 출력은 한 종류가 되어야 합니다. (그래야 함수 또는 테이블로 구현할 수 있지요.)

당연히 룰은 위에서 결정한 인공 지능의 단계와 정보 흐름을 가지고 만들어야 하겠지요. 다시 얘기하자면, 룰은 "이런 상황이면 이렇게 행동한다" 라는, 말 그대로 행동 또는 상황 판단 규칙입니다. 이것은 가장 초기 단계에 이미 머리 속에 어느정도 결정되어 있을 것이며, 사실 그래야 위의 단계들을 성공적으로 밟아 갈 수 있을 것입니다.

룰이 결정되고 입,출력의 종류 즉 정보가 결정되면 룰 적용 엔진을 만듭니다. 조건문 방식이나 또는 함수 방식을 쓴다면, 바로 코딩 단계로 넘어가는 것입니다. 테이블 방식이라면, 각 룰을 테이블로 즉 입력 종류가 차원이 되는 (즉 첨자의 수가 되는) 배열로 구성합니다. 이것이 룰 테이블이고 룰 테이블이고, 이 룰 테이블들이 모여 룰 데이터베이스를 구성합니다. 물론 조건문, 함수, 테이블 방식을 섞어서 쓸 수 있으며 그렇게 하는 것이 더 효율적일 것입니다. (다만 테이블 방식은 실행 파일의 재 컴파일없이 룰 테이블 데이터 파일만 수정해도 인공지능 자체를 어느정도 수정할 수 있다는 장점이 있습니다.)

테이블 방식의 기본은 각 정보를 룰 테이블, 즉 룰 데이터가 들어 있는 배열의 첨자로 써 먹는 것입니다. 예를 들어 유닛의 공격/후퇴를 결정하는 룰이 있다고 합시다. 입력 정보는 유닛의 생명력, 시야 내의 적 유닛 수, 자신 주변 5*5 타일 안의 아군 유닛이고, 출력은 1(공격) 또는 0(후퇴) 라고 합시다. 입력 갯수가 3 이므로 이 룰의 테이블은 3차원 배열이며 데이터는 0 또는 1입니다. 수치화 처리후에 각 입력을 배열 첨자로 넣는 것으로 룰 적용이 끝나는 것입니다. 사실 문제는 데이터베이스를 설계하고 실제로 데이터를 넣는 것이지요.

데이터베이스 설계와 엔진 설계는 수치화 규격과 각 정보간의 상호 관계를 잘 살펴서 동시에 진행해야 할 것입니다.

룰 데이터베이스는 여러 룰 테이블들이 계층적으로 관계를 가지므로, 데이터베이스 구축의 첫 단계는 각 룰 테이블을 규정하고 그들의 수직, 수평적 관계를 설정하는 것입니다. 이는 사실 사무용 데이터베이스 설계와 일맥상통하는 것입니다. (덜복잡하겠죠 그래도...)

수직, 수평적 관계를 설정한다는 것은 어떤 룰 테이블의 출력을 어떤 룰 테이블의 입력으로 연결하는가의 문제인데, 적당히 예를 들기가 힘들군요. 어쨌든 이것은 게임에서 적 캐릭터가 어떻게 사고를 하게 할 것인가를 정확히 파악하고 있어야 하는 문제이니... 분발하시길....

단계 6. (테이블 방식의 경우) 룰 테이블에 실제 데이터를 입력

테이블 방식의 경우 룰 데이터를 실제로 만들어야 합니다. 적당한 툴이 있어야겠지요. 지금까지의 단계가 분석적인 작업이었다면, 이 부분은 상상력이 많이 동원되어야 할 것입니다. 이런 상황에 어떻게 반응하는 것이 옳을까.... 하는 고민을 주로 하게 되지요.

예를 들어 대전 격투 게임에서 공격의 종류를 선택하는 룰을 생각해 봅시다. 간단하게 하기 위해 입력은 거리, 적의 상태 두가지로 하고, 출력은 공격안함(0), 상주먹(1), 중주먹(2), 상차기(3), 중차기(4) 로 합시다.

              사정거리 밖(0) 차기만 가능(1) 주먹,차기 가능(2) 주먹만 가능(3)
공격 직후(0)            0          3              3                2
공격 전(1)                         4              4
다가옴(2)                          0
멀어짐(3)                          4
서있음(4)                          3
앉아있음(5)                        4
점프중(6)                          4

.... 직접 채워넣어 보세요....

위와 같은 룰은 2차원 배열로 이루어지게 되는거죠. 룰 테이블 에디터를 만들어야 좀 더 편하게 작업을 할 수 있을 것입니다. 실제 코딩시 위의 출력 번호를 함수 포인터와 연결하면 객체 지향적인 코드가 됩니다. 이런 기법도 이제는 흔히 쓰는 것 같더군요. 스프라이트 구조체에 함수 포인터를 두고, 캐릭터의 상태에 따라서 함수 주소를 넣어주면 게임의 중심 엔진에서 지저분한 조건문 없이 깔끔하게 처리할 수 있죠.

단계 7. 수정... 반복 또 반복

시간을 투자하면 할 수록 좋은 인공지능이 되겠지요. 조건문이나 함수 방식의 룰 엔진이라면 이해하기가 좀 쉬울테지만 디버깅은 더 번거로울 수 있습니다. 모듈화 하거나 DLL 방식으로 한다고 해도 매번 재 컴파일을 해야 하니까요.

테이블 방식의 경우 유전자 알고리즘을 이용해서 자동화 할 수 있습니다.

테이블들을 유전자라고 생각합니다. 우선 같은 룰의 테이블을 약간씩 차이가 나게 여러 종류로 만듭니다. 그리고 모의 실행 머신을 만들어서 (그래픽이나 사운드 처리는 빼도 될 것입니다.) 두 컴퓨터 플레이어끼리 전투를 시키고, 승패나 피해치 등을 평가합니다. 이런 작업을 여러 대의 컴퓨터에서 동시에 진행시키고, 승자 쪽의 테이블들끼리 유전자 조작 (결혼도 시키고, 돌연 변이도 시키고 등등등...) 해서 최강의 유전자를 만들어 내는 것입니다. (족보도 만들어야죠... 최고의 혈통을 찾는겁니다...)

룰 테이블 에디터나 모의 실행 머신 등을 한 번 만들어두면 두고 두고 써 먹을 수 있겠지요. 특히 랜이 깔려있는 개발 환경이라면 더욱 강력한 시스템이 될 것입니다.

대충 뭐 이런 것이 룰 베이스드 인공지능입니다. 도움이 되었으면 하네요.

마지막으로, 자료실이나 인터넷을 뒤져 보면 ?WinRobot 이란 게임을 볼 수 있을 것입니다. 이 게임은 레이더가 있고 전,후진, 좌우 회전, 포탑 회전, 포탄 발사 등의 행동을 하는 탱크들이 전투장에서 서로 싸우는 게임인데, 특이한 것은 탱크를 직접 조종하는 것이 아니라 탱크의 인공지능을 만들어서 자동 전투를 벌이는 것입니다.

인공지능은 테이블 방식이 아니라 함수 방식으로, 이벤트 드라이븐 방식의 스크립트 언어를 제공합니다. 자신이 만든 스크립트를 제작자에게 메일로 보내면 토너먼트도 참가시켜 준다고 하더군요 (근데 2,3년 전 얘기입니다.... 요즘도 하는지 모르겠군요.) 테이블 방식이 아닌, 이런 스크립트 방식도 괜챦을 것 같습니다. 단 속도는 테이블 - 함수 또는 조건문 - 스크립트 순이 될 겁니다.

그럼 마지막 글을 기대해 주세요. 다음 글에는 룰 베이스드 인공지능의 한계와 가능성에 대한 것입니다. 전투 시뮬에서 간단한 룰들의 집합으로 "유인 공격" 이라는 상대적으로 복잡한 행동이 나타날 수 있는가에 대한 것이 주된 내용입니다...

4. Rule-based AI 설계-한계와 가능성

이번 글에서는 룰 베이스드로 "유인공격" 을 구현하는 문제에 대해 이야기하면서, 룰 베이스드의 한계와 가능성에 대해 잠깐 이야기하겠습니다.

1. 인공지능과 인공생명 - 숨겨진 목표

인공지능 시스템의 목표라면 (인공지능학 자체의 목표가 아니라) "컴퓨터가 지능적인 판단을 하는것" 이겠지요. 반면 인공생명 시스템의 목표는 (역시 학문 자체의 목표가 아니라) "각 개체들로 이루어진 집단이 자연 생태계적 현상을 나타내는 것" 이 될 것입니다. 그런데, 두 목표에 공히 숨겨져 있는 개념이 있습니다. 이는 게임의 인공지능에 있어서도 아주 중요한 것입니다. 그것은,

  • "최소한의 규칙으로 최대한 다양하고 복잡한 현상을 나타낸다" (인공생명의 관점)
  • "최소한의 규칙으로 최대한 다양한 문제를 풀어낸다" (인공지능의 관점)

라는 것입니다.

인공 생명의 경우는 정말 놀라울 정도로 간단한 규칙에서 복잡한 현상이 나타납니다. "생명" 이라는 게임의 규칙은 세가지이나, 초기치가 조금만 달라도 전혀 다른 현상이 나타납니다. 인공지능의 최고 형태라고 할 수 있는 자연어 처리는, 사람이 하는 말을 인공지능이 이해하도록 하는 것입니다. 이것은 수천만 단어의 사전 데이터베이스로는 해결할 수 있는 것이 결코 아닙니다. 인간이 하는 언어 활동과 인식 과정을 이해해야 하는 문제입니다.

그런 차원에서 룰 베이스드는 가장 저급한 인공지능이지요. 극단적 인 예를 들어서, 곱셈을 이해하는 인공지능은 "곱셈은 덧셈의 반복이다" 라는 규칙 하나로 모든 곱셈 문제를 해결할 수 있습니다. 그러나 룰 베이스드는 A(100,100) 배열에 100단의 구구단을 만들어 두고 곱셈을 처리하는 방식인 셈이지요. 그래서 101*1 은 계산을 못하게 됩니다. 이런 인공지능에서는 규칙과 다양성이 1:1 입니다.

그러나 여러 룰들이 네트워크를 이루면 다양성의 정도는 어느 정도 불어나게 됩니다. 곱셈 해결 룰베이스드 인공지능을 다시 한 번 생각해 봅시다.

이 인공지능에 세개의 룰이 있다고 합시다. 첫번째는 아까와 같은 구구단표 테이블입니다. 이번에는 A(9,9) 로 진짜 구구단입니다. 두번째 룰은 10 이상의 수에서 1의 자리 수만 빼내는 것입니다.(곱셈은 모르는데 나눗셈은 아네요...^^;) 세번째 룰은 이 두 룰을 반복, 조합하는 규칙입니다. (룰 베이스드에서 룰 자체를 입력, 출력으로 하는 거죠). 물론 곱셈을 이런 식으로 해결할 필요는 없겠지요. 그러나 인공지능 설계시 "곱셈은 덧셈의 반복이다" 라는 수준의 해답을 찾기 어려운 복잡한 시스템인 경우 이런 방식으로 분해하는 것도 중요한 접근 방법입니다.

2. 전쟁시뮬에서의 "유인 공격"

워크 같은 게임에서 컴퓨터 플레이어가 게이머의 유닛을 유인해서 공격하도록 하려면, 두가지 접근 방식이 있습니다. 첫번째는 미션을 만들때 미리 프로그래밍해 놓는 것입니다. 즉 하드 코딩이지요. 이런 것을 "인공지능이 속인다" (cheating) 라고 하더군요. 이런 방식에서는 대부분 컴퓨터 측은 맵 전체 정보를 다 가지고 있다고 합니다. 물론 게이머 측에서는 유닛이 지나간 곳만 볼 수 있지요. 그래서 cheat 입니다.

두번째 방식은 유닛과 부대의 인공지능이 판단하도록 만드는 것입니다. 상황에 따라서는 유인 공격이 이루어지지 않을 수도 있습니다.

효율성 면에서는 차라리 미션 안에 다 넣어 두든 것이 좋을 지도 모르지요. 그렇지만 요즘은 맵 에디터나 미션 에디터를 제공하는 추세라서, 하드코딩 방식이라면 사용자 미션과 원래 미션간의 차이가 벌어집니다... 인공지능 제작자로서는 자존심 문제죠.

그런데, 인공지능 방식을 쓴다고 했을때 그 인공지능에 꼭 "유인공격" 을 처리하 는 부분이 있어야 할까요? 개별 유닛들의 개별적인 판단들이 모이다 보니 사람이 보기에 "유인공격이닷!" 이라고 느낄 수도 있는 문제라는 겁니다. 이런 접근 방식이 바로 "최소한의 규칙으로 최대한 다양하고 복잡한 현상을 나타낸다" 라는 개념 과 맞아떨어집니다.

쥬라기 공원에서 타조처럼 생긴 공룡들이 떼를 지어서 달리는 장면이 있었습니다. 이 공룡들은 한마리 한마리마다 달려가는 경로를 지정해 주는 것이 아니었다고 합니다. 단지,

  • 앞으로 달린다.
  • 장애물은 넘거나 피한다.
  • 다른 공룡에게 너무 가까이 가지 않는다.
  • 다른 공룡으로부터 너무 멀리 떨어지지 않는다.

정도의 간단한 규칙 만으로 공룡들을 달리게 한거라고 합니다. 이미 새떼나 벌떼가 날아다니는 시뮬레이션은 두세가지 규칙 만으로 실제 행동과 거의 흡사하게 흉내를 내고 있습니다. (void 라는 윈용 프로그램을 구해서 보세요.) 개별적인 작은 규칙들이 모여서 집단적인 새로운 차원의 현상을 나타내는 것이 인공 생명의 핵심이지요 . 인공지능도 예외는 아니구요.

따라서, "유인공격" 이라는 룰이 따로 있는 것이 아니라,그보다 좀 더 저차원적인 룰들만 가지고 "유인공격" 이라는 현상을 나타낼 수 있다면, 그 인공지능은 잘 설계된 것이라 할 수 있습니다. 이것을 한 번 살펴봅시다.

3. 세 개의 룰로 "유인공격" 을 구현

다음은 "유인공격"이 이루어지는 가상 시나리오입니다.

첫번째 룰은 공격/후퇴 룰입니다. 입력은 여러가지가 있겠지만 중요한 것은 위험도입니다. 위험도는 유닛의 생명, 지형적 잇점, 일정 범위 내의 적 유닛 수, 일정 범위내의 아군 유닛 수로 판단을 합니다.

두번째 룰은 후퇴 방향 선택 룰입니다. 후퇴가 결정되었을 경우 일정 범위 내의 지점 중 위험도가 가장 낮은 쪽으로, 그리고 적의 시선이 가려지는 쪽으로 후퇴하도 록 합니다.

세번째 룰은 공격 방향 선택 룰입니다. 이 역시 위험도가 낮은 지점부터 공격하도록 합니다. 즉 적 유닛 10대가 있는 곳과 1대가 있는 곳이 같은 거리에 있다면, 1 대가 있는 쪽을 공격하는 거지요.

두 룰을 보면 알겠지만, 위험에 처한 유닛은 자기편이 많거나 방어하기 편한 곳으로 후퇴하게 됩니다. 적이 몰려 있는 곳에 아군 유닛들이 띄엄 띄엄 접근하다가 적 유닛들이 몰려 있는 것을 보면 당연히 겁이 많은 아군 유닛들은 으슥한 곳에 모이게 되지요. (겁이 많다는 의미는 위험도 룰 테이블에서, 위험도 수치가 조금만 높아도 후퇴하도록 되어있다는 것입니다.) 이로써 룰 자체에는 없는 "매복" 이 이루어 집니다. 이때 위험도 수치는공격도 후퇴도 아닌 정지 상태를 결정합니다. 즉 평형을 유지하는 것이지요.

이때 용감한 (즉 위험도 수치가 어느정도 높아도 후퇴하지 않는) 유닛은 계속 전진을 합니다. 그러나 계속 전진하다가 위험도 수치가 너무 높아지면 후퇴를 시작합니다. 어디로? 지형 조건이 적절하다면 겁쟁이 아군들이 모여 있는 곳으로 후퇴를 하게 되지요. 이럴때 적 유닛이 쫓아오면 바로 "유인" 이 됩니다.

적 유닛들이 일정한 속도로 오면 위험도 수치는 별로 변하지 않지만, 속도 차이가 나서 한 두 유닛만 먼저 따라오고, 유인하는 유닛이 아군 유닛들과 점점 가까와지면 위험도는 획기적으로 낮아져서 이때부터는 공격으로 돌아가며, 숨어있던 유닛들도 공격에 가담하게 될 것입니다. 이러면 "매복-유인-개떼공격" 현상이 나타나는거죠. 유인이나 매복에 관한 룰 없이, 전진, 후퇴에 관련된 세개의 룰 만으로 이러한 현상을 나타낼 수 있다는 것입니다. (물론 테이블의 수치를 아주 정교하 게 짜야겠지요. 그렇지 않으면 그냥 적과 아군 사이를 왔다갔다 하다가 장거리 공격에 죽는 유닛이 나올 수 도 있습니다...)

4. 룰 베이스드의 한계와 가능성

위에서 얘기한대로, 룰 베이스드의 한계는 뚜렸합니다. 규칙에 의해 나타나는 현상이 그리 다양하지 못합니다. 또한, 학습 능력이 없습니다. 따라서 룰 베이스드만으로는 사용자가 기대하는 인공지능의 수준을 만족하지 못할 것입니다. 여러가지 기법을 섞어야 겠지요.

어쨌든 룰 베이스드라는 테두리 안에서 그러한 한계를 최소한이나마 줄이는 방법은, 룰들을 절묘하게 짜고 조합시키는 것이 되겠죠.

가능성이라... 가능성은 이미 검증이 되었다고 생각합니다. 아마, 게임의 인공 지능에 대해 별다른 선전이 없는 게임은 대부분 룰 베이스드일 겁니다. (개발자가 룰 베이스드란 말을 쓰던, 안쓰던 말이죠.) 뛰어난 인공지능은 아닐지라도 그냥 할만한 인공지능을 원한다면 그냥 룰 베이스드 만으로 충분하지 않을까요.

에필로그 후의 여담...

요즘은 인공지능 문제를 전혀 다른 방향으로 해결을 하더군요. 즉, 컴퓨터 플레이어에게 지능을 부여하기 보다는, 이미 지능을 가진 존재, 즉 인간들끼리 네트웍을 통해서 싸움을 붙입니다. 뭐 이것이 주류가 될거라고 생각하는 사람들이 많고, 저도 반대하지 않습니다. 그러나 그것은 인공지능에 대한 정당한 해결책은 아닐것입니다. 인공지능은 인공지능이니까요...

끝입니다...