글 수 49

퍼지를 이용한 인공지능

조회 수 2121 추천 수 0 2016.03.25 02:49:07


퍼지를 이용한 인공지능 - 김성완(kaswan)   <출처 : g-Matrix>

(링크가 삭제되어 본문을 옮겨왔습니다.)

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

 

 

** [강좌] 퍼지를 이용한 인공지능 **
copyrightⓒ 김성완(kaswan) [1993년 11월 26일]

 

 

 

1. 서 론
 

목 록

1. 서론
2. 퍼지 이론의 탄생과 발전
3. 퍼지 집합과 퍼지 논리
4. 퍼지 이론을 이용한 게임 캐릭터의 조종

게임에 등장하는 여러 캐릭터 중에서 플레이어가 직접 조작하는 캐릭터 외에는 프로그램내에서 적절하게 동작을 지시해 주어야 합니다.

단순하게 이미 정해진 패턴에 따라 움직이게 한다면 간단하고 프로그래밍도 쉽지만, 쉽게 컴퓨터가 조작하는 캐릭터의 동작을 외워 버리게 되고, 결국은 게임이 싱거워 집니다.

 

그래서 대개는 적당히 난수를 이용해서 너무 규칙적이지 않게 만들게 됩니다. 아니면 적절히 if문등을 이용해서 매 게임의 상황 (특히 플레이어가 조작하는 캐릭터의 동작) 에 따라 캐릭터의 동작을 지시해 주게 되는데, 일종의 인공지능이 도입 되는 거죠... 흔히들 미로 찾기 비슷한 류의 게임이나 바둑이나 장기등의 보드 게임 나아가서 전략 시물레이션 게임에나 거창하게 인공 지능이 필요한 것으로 아는데 그렇지않습니다. 단지 정도의 차이일 뿐이지 대개의 게임들은 모두 다 인공지능적인 요소를 지니고 있습니다.


대표적으로 스파투류의 대전 게임을 보시면 사람들 간에 대전도 있지만, 컴퓨터와 겨룰 경우는 상당한 인공지능 기법이 필요합니다. 사람과 사람이 겨루도록 디자인 된 게임이 아닌 이상 필연적으로 컴퓨터가 사람과 동등한 위치에서 제어를 할 대상들이 있게 마련입니다.


그런데 이런 류의 컴퓨터가 동작을 제어할 필요가 있는 게임을 한 번이라도 프로그래밍해 보신분들은 대개 if문등을 이용해서 하게 되는데, 동작을 지시하는 적절한 규칙을 만들어냅니다. 그러니까 이런 경우는 이렇게하라, 저런 경우는 저렇게해라 식이죠. 그렇지만 동작을 좀 더 정교하게 하고 그럴싸하게 하려면 프로그래밍이 상당히 까다로와 지게 됩니다. 그래서 인공 지능 분야, 특히 자동 제어부분에서 요즈음 각광을 받고 있는 퍼지를 게임에서 이용하는 요령에 대해서 알려 드리고자 합니다. 대충 퍼지의 개념에 대해 설명드리고, 이어서 게임내에서 이용하는 법을 설명 드리고자 합니다. 



2. 퍼지 이론의 탄생과 발전

 

목 록

1. 서론
2. 퍼지 이론의 탄생과 발전
3. 퍼지 집합과 퍼지 논리
4. 퍼지 이론을 이용한 게임 캐릭터의 조종

퍼지 이론이라는 말은 들어보지 못하셨더라도 퍼지 세탁기나 퍼지 밥통이라는 말은 광고등을 통해 많이 접하셨을 겁니다. 퍼지 이론이 이렇게 가전 제품에 응용이 될 정도로 각광을 받게 된것은 얼마 되지 않습니다. 그리고 실상 탄생 된 것도 얼마 되지 않은 이론이죠.


원래 퍼지 이론이라는 것은 이란 출신의 미국 수학자인 자데 교수가 196? 년에(기억이 가물~ ) 처음으로 제안한 수학 이론 입니다. 퍼지란 말의 뜻은 애매하다 모호하다 라는 그런 뜻입니다. 자데 교수의 말로는 옆집 여인이 자기 부인 보다 이쁜데, 고걸 수학적으로 표현할 방법이 없을까 하는 조금은 엉뚱한 계기로 시작 되었다고 합니다. 원래 자데 교수는 일종의 자동제어 분야에서 상당한 명성을 얻고 있던 학자이었는데도 자신의 분야가 계속 한계에 부딪히고 앞으로 나아가지 않는데 대해서 어떤 해결책을 찾고 있던 중이었답니다.


자데 교수는 그 원인이 기존 수학이론의 경직성에 있다고 판단했습니다. 즉 '예' 아니면 '아니오'의 단순한 이치 논리에 기반을 두고 있는 기존의 수학이론으로는 복잡성과 애매성을 지니는 실세계를 제대로 다룰 수 없다는 겁니다. 우리들이 고등학교에서 배우게 되는 소위 집합과 논리라는 부분이 수학의 제일 기초라는 것은 여러분도 잘 아실 겁니다. 결국은 모든 수학이 이를 기초로해서 쌓아진 학문체계입니다. 그런데 여러분은 처음에 집합과 논리를 배울때 뭔가 자신의 살아온 경험과는 다른 이상한 규칙을 접하게 됩니다.


대표적인 것이

 

 

문 ) 다음 중 집합인 것을 고르시오.

 

(1) 우리반에서 안경 쓴 사람의 모임

(2) 우리반에서 키 큰 사람의 모임 

(3) 모여고에서 이쁜 여학생의 모임 

(4) 학생들이 존경하는 선생님들의 모임 ...........정답은 (1) 번이죠.


이걸 통해서 수학이 얼마나 엄정하고 애매성을 철저하게 배제하는 지를 배웁니다.
그리고 또 논리에 대해서 보면 
 

"너 저 여학생 좋아하니 ?" 
" 글쎄 , 좋아 하는 것 같기도 하고 아닌 것 같기도 하고"
 

그러면 수학을 잘하는 학생은 이럴 겁니다. 
 

" 야 임마 . 딱 부러지게 얘기해. 좋으면 좋다, 아니면 아니다. TRUE OR FALSE 로 답해 !" 


배운걸 잘 실천하는 수학 잘하는 학생을 칭찬할 게 아니라 뭔가 이상하다고 느끼지 않았습니까? 바로 자데 교수가 처음에 우리가 집합과 논리를 배울때 지녔던 이상함에 착안하여 우리의 실세계를 재대로 다룰려면 수학에도 애매성을 도입해야 된다고 주장한 것입니다. 그러니까 이쁜 여학생의 모임도 집합으로 인정해야 하고, "글쎄" 라는 것도 예 , 아니오와 함께 취급해야 한다는 겁니다. 그리하야 자데 교수는 퍼지 집합과 퍼지 논리라는 것을 발명(?) 을 했습니다.


그런데 이 새로운 수학 이론을 학계에 발표하자, 수많은 수학자들이 이에 비판을 가해 왔습니다. 자데 교수가 뭔가 수학자의 본분을 망각한게 아니냐, 애매한게 어떻게 수학이 될 수 있느냐 ? 수학을 모독하는 행위이다 . 등등 .. 기존의 이치 논리에 익숙해 있던 서양의 돌대가리들은 고걸 도저히 수학이라고 인정할 수가 없었던 겁니다. 그러나 평소에 애매한 사고에 익숙해 있던 동양의 학자들은 그 이론을 접하자 동지를 만난 듯이 기뻤습니다. 그래서 퍼지 이론은 미국에서 생겨났지만 오히려 동양권에서 활발하게 연구 되기 시작했습니다.


그렇지만 동양이라고 해서 퍼지를 연구하는 학자들을 백안시 하지 않은 건 아닙니다. 역시 동양도 서양 학문을 공부해서 서양적인 사고에 물든 대다수의 수학자들은 퍼지를 연구하는 일단의 퍼지 학자들을 수학의 '수'자도 모르는 이상한 인간 취급을 했습니다. 그렇게 천대시 받던 퍼지 이론이 드디어 그 진가를 발휘하게 된 부분은 바로 응용 분야인 자동 제어였습니다. 그리고 급기야 일본에서 퍼지 밥통이니 하는 것들을 만들어 냄으로써 비로소 일반인들에게도 알려 지게 되었죠.


사실 어떤 기계라던지 대상을 자동제어 하려면 우리는 필연적으로 컴퓨터의 도움을 받게 되는데, 이놈의 컴퓨터란 놈이 이치 논리에 기반을 두고 만들어진 놈이라 대상이 조금만 애매성을 지니면 상당히 까다로와 지게 됩니다. 그렇지만 어디 세상이 딱 딱 부러지는 것만 있는 것도 아니고, 애매하고 복잡한 것들이 더 많죠. 몇 년 안된 아주 최근의 일이죠. 


간단한 실례를 들죠. 여러분 아마 엑스포 전시장에서 퍼지 로봇이라는 것을 보았을 겁니다. 와인잔에 술을 담아서 층층이 쌓아놓은 쟁반을 경험 많은 웨이타들 처럼 아주 능숙하게 받치고 있는 로보트의 팔을요. 요 기다란 막대기 같은 팔만 있는 로보트가 바로 퍼지제어를 받는 겁니다. 만약 여러분이 기존의 프로그래밍 방식으로 쟁반에 올려진 술을 쏟아지지 않고, 균형 잡을 수 있는 제어 프로그램을 만든다고 합시다. 그러면 아마 슈퍼 컴퓨터를 동원해도 가능할까 싶은 엄청난 애매성과 복잡성을 만나게 됩니다. 


막대의 무게 중심은 어떻고 쟁반의 무게와 무게 중심 거기에 올려진 잔들의 무게와 무게 중심, 잔들의 정확한 배치, 중력에 의해서 각 물체들에 미치는 힘을 계산해야하고, 물체의 모양이 단순하지 않으므로 각 물체의 토크(회전력)라던지 , 관성 모멘트, 쟁반과 잔 사이의 마찰력, 잔들 사이의 마찰력, 주위의 공기의 밀도, 공기의 움직임(바람), 쟁반과 막대사이의 마찰력, 막대를 움직이는 모터의 관성 모멘트, 모터의 힘, 정확한 회전수, 모터 축의 마찰계수.... 


그리고 완전히 우리를 포기하게 만든는 것이 있는데, 술잔에 담겨있는 출렁거리는 액체(술). 한마디로 고도의 역학 이론과 모터를 정밀하게 제어 할 수 있는 제어 기술로서 시시 각각으로 변하는 물체들의 움지임을 측정하는 예민한 센서, 이들을 이용해서 제어 신호를 모터에 보낼 완벽한 프로그램, 마지막으로 이런 수많은 데이타를 눈 깜짝할 사이 보다 빠르게 실시간으로 계산 할 수 있는 초 슈퍼 컴퓨터.  한마디로 완전히 불가능입니다.


그렇지만 퍼지 제어는 너무도 너무도 쉽게 이걸 해냅니다. 기적같이요. 마치 웨이타가 중력이니 마찰력이니 역학이니 하는 것을 전혀 몰라도 잘 해내 듯이 위에 열거한 조건들을 몰라도 사람보다 더 잘해냅니다. 옆에서 누가 조금 쳐서 기울어 지더라도 금새 균형을 잡아 버립니다. 그럼 다음에는 실제 퍼지이론의 기초가 되는 퍼지 집합과 퍼지 논리에 대해서 알아보고, 위와 같은 복잡한 대상을 어떻게 실제로 제어 하는지 그 원리를 알아보겠습니다.



3. 퍼지 집합과 퍼지 논리

 

목 록

1. 서론
2. 퍼지 이론의 탄생과 발전
3. 퍼지 집합과 퍼지 논리
4. 퍼지 이론을 이용한 게임 캐릭터의 조종

퍼지 집합과 퍼지 논리가 그러면 기존의 그것과 어떻게 다른지 알아보자.

 

 

기존의 집합론 : 예쁜 여자의 모임은 집합이 아니다.

퍼지 집합론 : 예쁜 여자의 모임도 집합이 될 수 있다.

 

기존의 집합론에서는 '예쁘다'라는 기준을 객관적으로 정할 수 없으므로 '어떤 여자가 과연 이 집합에 속하는지 아닌지'를 분명하게 결정할 수 없다. 그렇지만 퍼지 집합론에서는 설사 '예쁘다, 예쁘지 않다'의 명확한 기준이 없다 할 지라도, " 소속도 "라는 것을 통해서 분명하지는 않지만 어느정도 분류할 수 있다면 그것도 집합으로 인정하고 들어간다. 우리가 일상생활을 하면서 흔히 각 개인간이나 혹은 동일한 사람일지라도 기분이 따라 좌우 될 수 있는 애매한 기준으로 매겨진 어떤 모임이라도 하나의 집합으로서 생각하는 것과도 같다.


그러면 "소속도" 라는 것은 무엇이냐면, 어떤 원소가 집합에 속하는 정도를 수치로 나타내는 것이다. 값이 '1' 이면 확실하게 그 집합에 속하는 원소이고, '0' 이면 확실하게 그 집합에 속하지 않는다고 했을때, 그사이의 값들을 소속도로 가지는 원소들도 있다는 것이다. 이를테면

 

" 야 ! 제는 정말 이쁘다."

" 제 어때 괜찮지 "

" 제법 이쁜데 "

" 그런데로 괜찮은데 " 

" 별로야 "

" 욱 "

 

등등의 평가를 적절하게 '1' 과 '0' 사이의 수치로 나타내면 되는 것이다. 소속도를 정해서 적당히 집합에 속하는 정도를 수치로 표현 할 수 있으므로 일단 소속도가 정해지면 수학적인 연산을 행할 수가 있다. 그러나 소속도를 정하는 것이 문제이다. 예쁘다의 예에서도 보았듯이 소속도를 정하는 절대적인 기준이 없다는 것이다. 그렇다면 엄정하고 정확해야 되는 수학으로서 어떤 임의성과 주관성을 지니게 된다는 것이다. 이것이 수많은 기존의 수학자들이 퍼지이론을 비판한 주된 원인이다.


자데 교수도 물론 이런 점을 인정했다. 그렇지만 소속도를 정해주는데 있어서 주관성이나 임의성을 완전히 배제할 수는 없지만, 소속도를 정하는 것이 완전히 불가능 한 것도 아니며, 통계적인 방법을 이용한다면 그런데로 객관적인 기준으로 소속도를 정해 줄 수가 있다. 그리고 퍼지 이론이 가지는 이러한 임의성과 주관성이라는 단점은 역으로 생각하면 오히려 인간 적인 요소를 수학에 적극적으로 도입 할 수 있는 중요한 발판이되며, 나아가서 컴퓨터에 적용한다면 좀더 인간적인 컴퓨터를 만드느데 이용할 수 있다.


그러면 기존의 집합과 퍼지 집합의 차이를 그림으로 비교해보자.
 

 <<기존의 집합>>

 1
 ┃     ●     ●   ●
 ┃
 ┃
 ┃
 ┃ 
 ┃   
 ┗━●━┻━●━┻━┻━━
 0  A  B  C   D  E <원소들>

 <<퍼지 집합>>

 1                  ↑
 ┃           ●     
 ┃                 소
 ┃           ●   속
 ┃      ●      도
 ┃               
 ┃     ●         ↓  
 ┗━●━┻━┻━┻━┻━
 0  A  B  C   D  E  

 
 
 
 
 
 
 

 

 

 

 

 

그림에서 보는 것 처럼 퍼지 집합은 그 경계가 명확하지 않다. 이것을 논리에 문제로 이끌어가면 어떤 원소가 집합에 속하는지의 진위 여부가 '예 (1)' '아니오 (0)' 의 이치 논리가 아니라, ' 예 (1)' 와 '아니오 (0)' 중간 값을 가질 수 있는 퍼지 논리가 된다. 그러니까 기존의 논리는 어떤 명제의 진리 값이 참 (1) 아니면 거짓 (0) 의 두가지 값을 가질 수 밖에 없는데, 퍼지 논리의 경우는 그 사이의 값도 가질 수 있는 것이다.


온라인 상에서 수학을 설명하려면 각종 수학 기호라던가 곡선 그래프 등을 표시 할 수 없으므로 이 정도로 수학적인 면은 끝내고자 합니다. 그리고 제가 설명하려는 퍼지 인공지능이 아주 초보적인 것이라서 수학적인 것을 설사 모르더라도 퍼지의 기본적인 개념만 이해한다면 충분히 컴퓨터 상에서 이용할 수 있습니다. 참고로 퍼지 집합이나 논리에서도 기존의 수학에서 성립하는 여러 연산 법칙이 그대로 적용됩니다. 그러니까 퍼지수학은 기존의 수학을 확장한 것이죠.

 

 

4. 퍼지 이론을 이용한 게임 캐릭터의 조종

목 록

1. 서론
2. 퍼지 이론의 탄생과 발전
3. 퍼지 집합과 퍼지 논리
4. 퍼지 이론을 이용한 게임 캐릭터의 조종
 

퍼지이론을 이용한 응용 분야는 여러가지가 있습니다. 퍼지 추론이니 퍼지 제어니 하는 여러가지가 있는데, 이러한 분야에서 모든 것이 동일한 방법으로 적용되지는 않습니다. 나름의 상황에 맞는 방법들을 사용하기 때문입니다. 저도 본격적으로 퍼지이론을 공부한 처지도 아니고, 나름대로 게임에 응용하는 방법을 알뿐입니다. 

 

더 깊이 아시고 싶은 분은 나름대로 공부하시기 바랍니다. 그러면 더 좋은 방법을 여러분이 직접 찾을 수 있을 겁니다. 그러면 간단한 것 부터 살펴보죠. 예컨데 우리가 자동차를 운전한다고 합시다.  자동차의 경우는 비교적 조작이 쉬운 편인데, 우리가 운전을 배운다는 것은 어떤 일련의 규칙을 배워서 몸에 익히는 것입니다. 이를테면 오른쪽으로 가고 싶으면 핸들을 오른쪽으로 돌리고, 멈추고 싶으면 브레이크를 밟고, 속도를 내고 싶으면 가속 패달을 밟습니다.

 

우리는 자동차가 실제로 어떻게 동력이 전달되며 여러가지 장치들이 어떻게 작동하는지의 구체적인 메카니즘을 모르더라도 저러한 규칙들을 몸에 익히므로서 자동차를 운전할 수 있습니다. 퍼지제어도 마찬가지로 복잡한 메카니즘이 필요없이 자동차 운전의 예와 같이 사람처럼 비교적 간단한 몇가지 규칙을 이용해서 제어를 하게 됩니다.

 

이러한 규칙들을 나열한 것을 rulebase 라고 합니다. 제어해야할 대상이 복잡하다면 더 많은 규칙이 필요하겠지만, 간단한 경우 이차원 행렬 형식으로 규칙을 표시하게 됩니다. 가장 간단한 경우가 입력이 하나이고 출력이 하나인 경우입니다. 우리 주위에서 많이 볼수 있죠. 온도를 조절하거나 속도를 조절하는 경우. 퍼지 밥통 같은 것이죠. 즉 입력으로 주어지는 밥의 온도에 따라 전열기를 조절하게 됩니다. 

 

기존의 밥통들은 대개가 온도차에 따른 열 팽창률이 다른 두 가지 금속을 붙여놓은 일종의 스위치(바이메탈)가 있어서 온도가 올라가면 스위치의 접점이 떨어지고, 내려가면 붙는 방식으로 전열기를 켰다 껐다 합니다. 상당히 원시적이죠. 말하자면 ' on ' ' off ', '1' 아니면 '0' 이라는 식의 2치 논리로 작동하죠. 그렇지만 퍼지제어를 할 경우는 더 자세하게 제어 할 수 있습니다.

 

rulebase 를 한번 보죠.

 

 

낮은온도

기준온도

높은온도

온도 상승

조금가열

가열중지

가열중지

온도 고정

가열

조금가열

가열중지

온도 하강

세게가열

가열

조금가열

 

 

기존의 ON OFF 방식의 경우는 가열 중에 계속 열을 빼았기므로 해서 생기는 열손실을 보충할 수가 없기 때문에 온도 변화 폭이 커지게 됩니다. 그러나 퍼지 제어의 경우는 상황 변화에 따라 좀더 자세한 제어를 할 수가 있으므로 좀더 양호한 상태로 밥의 온도를 유지할 수가 있습니다. (즉 밥 맛이 좋다 !)

 

제 설명이 부실하기는 하지만 이제 어느정도 감을 잡으신 분들도 계실 겁니다. 그러니까 저러한 'rule base'를 컴퓨터에 다차원 배열로 저장해두면 우리가 어떤 대상을 제어하는데 이용할 수가 있겠죠.

 

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

 

여러분이 가장 기대하시는 강좌의 핵심 부분을 말씀드리죠. 밥통의 예를 통해서 간단한 퍼지제어의 예를 살펴 보았습니다. 퍼지제어의 특징은 무엇보다도 애매성에 있습니다. 우리가 흔히 알고 있기로 기계란 것은 정확한 수치로 작동해야 합니다. 밥통의 예에서 보면 정확하게 몇 도 이상이면 바이메탈의 접점이 붙고 아니면 떨어지고, 물론 실제로는 오차를 보이겠지만요.

 

그렇지만 퍼지제어는 우리 일상 대화에서 사용하는 대충의 어림수를 그대로 제어에 이용할 수가 있습니다. 그러니까 낮은 온도, 중간 온도, 높은 온도, 이런 식이죠. 꼭 분명하게 몇 도에서는 어떻게, 몇 도에서는 어떻게 하는 식으로 딱 부러지게 정해 주지 않아도 된다는 겁니다.  마치 전기 밥통이 없었던 우리의 옛날에 어머니들이 온도계 같은 것 전혀 없이도 맛있는 밥을 지으시던 것과 같죠. 그런데 인간이 사물을 판정하는 어림수는 신기하게도 7 가지를 넘지 않는다는 것이 심리학자들의 실험 결과 입니다. 그래서 이것을 일컬어서 매직 세븐이라고 부릅니다.

 

아래의 기호는 그 어림수를 표현하는 기호입니다.

 

'NL' ---------- NEGATIVE LARGE 

'NM' ---------- NEGATIVE MEDIUM 

'NS' ---------- NEGATIVE SMALL 

'Z' ------------ ZERO 

'PS' ----------- POSITIVE SMALL

'PM' ----------- POSITIVE MEDIUM

'PL' ----------- POSITIVE LARGE

 

요컨데 인지하는 대상의 어떤 변화를 일곱가지 어림수 중에 하나로 나타내면 됩니다. 물론 대상이 단순하다면 일곱가지 수를 다 사용하지 않고 다섯개나 세개를 사용해도 되겠죠. 그러면 제어지시는 어떻게 내리느냐 ? 여기서도 마찬가지로 어림수를 이용해서 내리게 됩니다. 자동차운전을 예로 든다면 길이 왼쪽으로 중간 정도 휘어있으면 핸들을 중간 정도 왼쪽으로 돌려라 뭐 이런 식이죠. 누구도 정확하게 핸들을 몇도를 돌려야 되는지 몰라도 되죠.

 

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

 

그러면 실제로 제가 슈팅 게임에 사용한 적 캐릭터의 움직임을 제어하는 룰베이스를 한번보죠.  

 

#define PURSUIT 0 // 추적 모드 

 

#define ATTACK 1 // 공격 모드 

 

#define RUN 2 // 회피 모드

 

char rule_base_x[3][3][5] = // ML SL 0 SR MR 

 

{

 

  -3, -3, -2, 0, 2, // LEFT

 

  -3, -2, 0, 2, 3, // 0 

 

  -2, 0, 2, 3, 3, // RIGHT

 

  -3, -3, -4, 3, 2,

 

  -4, -2, 0, 2, 4,

 

  -2, -3, 4, 3, 3,

 

  0, 2, 3, -3, -2,

 

  0, 3, 4, -3, 0,

 

  2, 3, -3, -2, 0

 

};

 

char rule_base_y[3][3][5] = // MU SU 0 SD MD 

 

{

 

  -4, -3, -2, 0, 2, // UP

 

  -3, -2, -2, 0, 2, // 0

 

  -3, -2, -2, 3, 2, // DOWN

 

  -4, -3, -4, 0, 0,

 

  -3, -2, -4, 0, 2,

 

  -3, -3, -4, 0, 2,

 

  2, 2, 3, -3, 0, 

 

  0, 3, -4, -3, 0,

 

  0, 3, -3, -2, -2

 

};  

 

< 하나는 X, 하나는 Y 에 대한 rule base 입니다. >

 

위에서 각각의 인덱스의 의미는 다음과 같습니다.

 

첫째 : 동작 모드 선택 

 

둘째 : 플레이어 캐릭터의 움직임 

 

세째 : 적 캐릭터에서 본 플레이어 캐릭터의 떨어진 거리

< 주석으로 표기된 어림수 기호의 의미는 예컨데 SL 이라면 왼쪽으로 조금 떨어졌다는 것입니다. >  

 

각 캐릭터의 위치는 프로그램 상에서

 

X = X + DX ;

Y = Y + DY ;

 

라는 식으로 갱신 되므로, 각 각의 배열 요소의 값은 적캐릭터의 DX 와 DY 값이 됩니다. 그러니까 시시 각각 변화하는 플레이어의 동작을 적절한 인덱스 값으로 바꾸어서, 그 인덱스에 해당하는 rule base 값을 적 캐릭터의 DX 와 DY 값으로 이용하면 되는 겁니다. 동작모드의 경우는 여러개를 준비해 두고 게임의 적절한 상황에 맞게 인덱스를 지정해 주면 다양한 적의 움직임을 만들수 있습니다.

 

그러면 실제로 rule base 는 어떻게 정해 주어야 할까요? 두 가지 방법이 있습니다.  하나는 경험적인 방법이고, 하나는 시행착오법입니다. 제가 위에서 사용한 룰베이스의 값들은 제가 게임 중에 캐릭터를 어떻게 조작하는지를 모방해서 만든 것입니다. 그러니까 룰베이스의 데이타를 제공하는 사람의 경험능력에 달려 있는 경험적인 방법이죠. 

 

저 같이 게임을 제대로 못하는 사람이 만들면 잘 해야 만든 사람 정도 실력 밖에 구현이 안되죠. 반면에 시행착오법은 최적의 룰베이스를 시행착오를 통해서 컴퓨터가 스스로 찾도록 하는 것입니다. 요즈음 신경망 인공지능을 이용해서 퍼지 룰 베이스를 찾아내는 연구가 활발하게 이루어지고 있는 것으로 알고 있습니다.

 

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

 

그러면 실제로 적 캐릭터를 움직이는 함수입니다.

 

void type_move(void)

 

{

 

  byte b, i, j, k ; 

 

  int delta_x, delta_y, bm = 0 ;

 

  delta_x = character[thunder].x - character[type01].x ;

 

  delta_y = character[thunder].y - character[type01].y ;

 

  if ( delta_x > 45 )

 

    torp_fire(character[type02].x, character[type02].y) ;

 

  for (b = 0 ; b < MAXNO ; b++) 

 

  { 

 

    if(beam[b].energy==0)

 

      continue ; 

 

    bm++ ;

 

  }

 

  if ( character[type01].energy >= character[thunder].energy )

 

    i = ATTACK ;

 

  else if ( bm && abs( delta_x ) < 60 )

 

    i = RUN ;

 

    else i = PURSUIT ;

 

  if (abs(delta_x) < 20)

 

    bullet_fire(character[type01].x, character[type01].y+5) ;

 

  switch(character[thunder].dx)

 

  {

 

    case -3 :

 

        j=0 ;

 

        break ;

 

    case 0 :

 

        j=1 ;

 

        break ;

 

    case 3 :

 

        j=2 ;

 

        break ; 

 

  }

 

  if ( abs(delta_x) < 5 )

 

    k = 2 ;

 

  else if ((delta_x) <= -5 && (delta_x) > -30) 

 

    k = 1 ;

 

  else if (delta_x <= -30) 

 

    k = 0 ;

 

  else if ((delta_x) >= 5 && (delta_x) < 30) 

 

    k = 3 ;

 

  else if (delta_x >= 30)

 

    k = 4 ;

 

character[type01].dx = rule_base_x[i][j][k] ; 

 

character[type01].x+ = character[type01].dx ;

 

  switch(character[thunder].dy)

 

  {

 

    case -3 :

 

        j = 0 ;

 

        break ;

 

    case 0 :

 

        j = 1 ;

 

        break ;

 

    case 3 :

 

        j = 2 ;

 

        break ;

 

  }

 

  if ( abs(delta_y) < 15 )

 

    k = 2 ;

 

  else if ((delta_y) <= -15 && (delta_y) > -60)

 

    k = 1 ;

 

  else if (delta_y <= -60) 

 

    k = 0 ;

 

  else if ((delta_y) >= 15 && (delta_y) < 60)

 

    k = 3 ;

 

  else if (delta_y >= 60) 

 

    k = 4 ;

 

  if ( random(5)==0 ) 

 

  {

 

    character[type01].dy = rule_base_y[i][j][k] ;

 

    character[type01].y+ = character[type01].dy ;

 

  }

}  

 

세세 하게 설명 하지 않아도 차근히 살펴 보시면 이해 하 실 수 있을겁니다. 의외로 간단하죠. 마지막에 if ( random(5)==0 ) 으로 한 건 100% 적용하면 제가 도저히 이길 수가 없으므로 y에 대해서는 1/5 만 적용되도록 한 겁니다. 어디 게시판에 보니까 '로드 런너'라는 애플시절의 게임을 아이비엠 용으로 만드는데, 게임의 상황에 따라서 미묘하게 변화하는 적 캐릭터의 동작 속도를 구현하기 어렵다고 하는데, 퍼지를 이용하면 간단하게 될 것 같네요. 

엮인글 :
List of Articles
제목 글쓴이 날짜 조회 수
인공지능이 가져올 변화에 대해 쉽게 설명하는 영상 깊은바다 2017-09-08 92
인공지능이 의식을 가질 수 있는가 file [2] 깊은바다 2017-09-05 400
ai.google [1] LegenDUST 2017-08-25 117
우리나라 AI 기업 현황 조사 보고서 [1] 깊은바다 2017-06-30 584
지대넓얕 팟캐스트 AI와 영생 - 특이점이 온다 깊은바다 2017-05-02 2058
인공지능이 인간의 직업을 대신할 것인가 깊은바다 2017-04-29 63
초인공지능의 등장과 인간의 영생 또는 멸망 깊은바다 2017-04-08 118
인공지능과 자의식 깊은바다 2017-03-19 207
간단히 정리하는 인공지능의 역사 file 깊은바다 2017-03-15 1546
김대식 교수 강의 - 뇌, 현실, 그리고 인공지능 깊은바다 2017-03-07 230
알파고를 만든 데미스 하사비스 깊은바다 2017-02-28 116
위키에 있는 인공지능 개요 깊은바다 2016-03-29 100
생각하고 있는 사람을 맞추는 인공지능 - 아키네이터 깊은바다 2016-03-25 202
공각기동대속의 인공지능 file 깊은바다 2016-03-25 145
퍼지를 이용한 인공지능 깊은바다 2016-03-25 2121