[퍼지논리를 사용한 속도제어 구현]

- 우종하(deepseas(AT)sogang.ac.kr)

 


    - 마우스로 화면을 클릭한 후 키보드 커서키로 사용자 배의 속도 조절

    - 소스코드 [Down]

    - 자바 Runtime [Down] : 애플릿이 실행이 안될 경우 설치, 설치후 익스플로어 재실행

 

'애매함'을 다루는 퍼지 논리(Fuzzy Logic)

기존의 논리는 '참/거짓' 또는 '온/오프", "예/아니오", "부정/긍정"이라는 이분법적인 개념에 기반한다. 하지만 퍼지 논리는 그러한 이분법적인 개념이 아닌 "애매함"을 기반으로 한다. "어느정도"라던가 "얼마나" 같은 말로써 수식되는 것들에 대한 논리인 것이다.

예를 들어서 퍼지 논리는 기존의 논리에서는 다룰 수 없는, "상당히 큰", "매우 작은", "중간 정도", "엄청난" 같은 말들로 수식될 수 있는 양 또는 자료를 수학적으로 다룰 수 있게 한다.

퍼지 논리를 게임 AI에 적용할 수 있는 가능성은 무궁무진하다. 예를 들어서 NPC의 감정을 흉내내는 데 퍼지 논리를 사용할 수도 있다. 게임의 NPC가 단순히 "화났음",과 "화나지 않았음"이라는 이분법적인 감정을 가지는 것이 아니라, "짜증남", "약간 거슬림", "매우 화남" 같은 애매한 감정을 가질 수 있다면 기존의 "모 아니면 도" 방식의 논리를 사용한 감정 시스템보다 훨씬 더 인간적인 행동을 보일 수 있을 것이다.

 

퍼지 논리의 개요

퍼지 논리의 작동 방식을 설명하려면 기존의 논리가 어떻게 작동하는지부터 되짚어봐야 될 것이다. 기존 논리학은 "깐깐한 집합(crisp set)"을 대상으로 한다. 깐깐한 집합이란 주어진 요소가 집합에 속하거나 속하지 않는 단 두가지 상태만을 가지는 집합을 말한다.

예를 들어 5에서 10사이의 모든 실수들을 원소로 하는 M이라는 깐깐한 집합을 생각해 보자. 이는 임의의 실수가 집합 M의 원소이거나 원소가 아니라는 두 가지 상태 중 하나만을 가진다. 즉, 주어진 실수가 5와 10사이에 있으면 집합 M의 특성함수는 1(참)을 돌려주며, 그렇지 않으면 0(거짓)을 돌려준다.

깐깐한 집합은 흑백 논리에 대해서는 완벽하게 작동하지만, 실세계에서는 흑백논리를 적용할 수 없는 상황이 더 많다. 예를 들어서 모든 키 큰 사람들의 집합을 만든다고 하자. 180센티를 '크다'라고 결정했다면, 키 큰 사람들의 집합은 "키가 180센티 이상인 사람들의 집합"이라고 정의할 수 있다. 하지만 179센티인 사람인 경우 대부분 키가 크다고 생각하겠지만 여기서 정한 키 큰 사람들의 집합에는 속하지 않는다.

이처럼 깐깐한 집합으로는 "대충 이 정도"라는 말로써 집합을 규정할 수 없다. 반면 퍼지 집합에서는 그러한 것이 가능하다. 퍼지 집합에서는 "집합에 속한다"와 "집합에 속하지 않는다" 사이의 분리를 유연하게 만들 수 있다.

퍼지 집합의 특성함수는 오직 0 또는 1만을 돌려주는 것이 아니라 0과 1사이의 임의의 실수값을 돌려준다. 이는 집합에 어느정도 속하는가를(소속도) 의미한다. 예를 들어 키 큰 사람들의 퍼지 집합에서 특성함수의 값이 0이면 "크지 않다", 1은 "크다", 0.5는 "어느 정도 크다", 0.01은 "아주 조금 크다"를 의미하게 된다.

 

퍼지 논리의 응용 - 퍼지 제어(Fuzzy Control)

퍼지 논리를 응용할 수 있는 분야는 다양하지만 그 중 가장 대표적으로 퍼지 제어를 들 수 있다.

예를 들어 교통의 흐름에 퍼지 논리를 적용한다고 하자. 도시 경영 시뮬레이션 게임을 만드는데, 작은 차들이 도시 안에서 실감나게 움직이게 하고 싶다. 도로를 따라 늘어선 차들이 마치 진짜 사람이 운전 하고 있는 것처럼 가속하거나 감속하도록 만들어야 한다. 즉 어떤 차도 앞 차의 뒤를 받지 말아야 하며, 각 차들은 앞 차와 적당한 거리를 유지할 수 있어야 한다.

이러한 교통흐름 제어를 퍼지 논리로 모델링 하는 것은 다음과 같다.

 

첫 번째로 , 퍼지 논리에서 고려해야할 언어 변수(linguistic variable)을 설정한다. 여기서는 두 차 사이의 "거리"와 두 차 사이의 "거리변화", 두 가지 변수면 충분하다.

 

두 번째로, 실제 도로 상의 차들을 자세히 관찰한 결과로 앞에서 정한 언어 변수 사이의 규칙을 결정한다.

 

세 번째로, 거리와 거리변화를 설명하는 데 사용하는 모든 용어들로부터(언어 변수) 실제 수치적인 계산을 위해 사용하는 퍼지 집합들을 만들어 낸다. 여기서는 "거리", "거리변화" 그리고 그에 따른 차의 "행동"에 대해 각각 다섯 개의 퍼지 집합들을 만든다.

 

이제 이렇게 만든 퍼지 시스템을 이용해서 어떻게 차의 속도제어를 수행하는지 살펴보자. 특정 시점에서의 어느 한 차의 앞차와의 거리가 1.3, 앞 차와의 거리변화가 0.25라고 하자. 이때 이에 속하는 "거리"와 "거리변화" 집합의 소속도를 구하면 다음과 같이 각각 두 개의 집합에 속함을 알 수 있다.

위의 그래프처럼 거리값이 1.3일 때는 "작음"에 0.75, "완벽"에 0.1이 속하고, 거리변화값이 0.25일 때는 "안정"에 0.6, "증가"에 0.3의 소속도를 갖는 것을 알 수 있다.

 

현재 거리와 거리변화에 값에 속하는 집합들의 규칙을 미리 설정해 놓은 퍼지규칙에서 찾아보면 다음과 같이 모두 4개의 규칙들이 가능하다. 각 규칙들의 참인 정도는 두 퍼지 집합의 AND연산을 적용해서 양쪽 모두를 만족할 수 있는 가장 큰 값으로 결정한다. 예를 들어 거리가 작고(0.75) 거리변화가 증가(0.3)이라면 0.75 AND 0.3 = 0.3이 규칙의 참 정도가 된다.

 

이제 마지막으로, 이렇게 얻은 결과로부터 하나의 최종적인 값을 얻어야 하는데 이러한 방법을 역퍼지화(defuzzification method)라고 한다. 역퍼지화 방법에는 여러 가지가 있는데 여기서는 단순하게 가장 참 정도가 높은 규칙을 선택하였다.

역퍼지화 결과로 나온 최종 규칙은 "거리가 작고 거리변화가 안정"이고 퍼지규칙에서 이에 따른 행동은 "감속"임을 알 수 있다. 여기에 참 정도가 0.6이므로 현재 차의 속도는 speed -= (speed/2)*(0.6)으로 계산할 수 있다.

이러한 과정을 모든 차들에 대해 적용하면 도로를 일렬로 달리는 차들이 매우 현실적인 방식으로 적절히 속도를 변화시키는 모습을 볼 수 있을 것이다.

 

[참고자료]

    - Game Programming Gems 1권, p.416 ~ p.428
    - 인공지능 개념 및 응용, 도용태, 사이텍미디어, p.97 ~ p.123

 

[1]