Game AI

목표 지향 행동 - 2

tsyang 2022. 11. 24. 00:43

2022.11.20 - [Game AI] - 목표 지향 행동 (Goal-Oriented Behavior) - 1

 

목표 지향 행동 (Goal-Oriented Behavior) - 1

2022.11.13 - [Game AI] - 마르코프 시스템(Markov Systems) 개요 지금까지는 몇몇 인풋들이 캐릭터에게 제공되면 그에 따라 어떤 행동을 할지 결정했다. 이런 과정에서 캐릭터의 '목표'는 빠져있다. 심즈(Th

tsyang.tistory.com

 

이전 글에서 다음과 같이 문제를 언급했다.

 

두 가지 문제가 있는데, 하나는 행동을 하며 생기는  부수 효과(side effect)들을 무시한다는 것이고 다른 하나는 수행 시간을 무시한다는 것이다. 

 

이 둘을 해결해보자.

 

효용(Utility)


 

부작용을 무시한다는 게 뭐냐면, 다음과 같은 경우이다.

목표 :  음식 섭취 = 4, 화장실 = 3
행동 : 물 마시기 (음식 섭취 -2, 화장실 +3)
행동 : 화장실 가기 (화장실 -4)

물을 마시면 음식 섭취에 대한 요구는 줄지만 화장실에 대한 요구는 증가한다. 위 상황에서 각 목표 수치의 값은 5가 최대이고, 최대 값에 도달하면 굉장히 안 좋은 상황이 발생한다고 해보자. 예를 들어, 음식 섭취가 5가 되면 배고파서 기절하며, 화장실이 5가되면 바지에 오줌을 싼다.

 

기존 로직대로라면 음식 섭취에 대한 욕구가 가장 높으므로 음식 섭취를 해소해 주는 행동을 선택하게 된다. 그러면 물 마시기 행동을 수행하고 캐릭터는 바지에 오줌을 싸버린다. 기존 로직은 부수 효과를 포함하지 않기 때문에 이런 문제가 발생한다.

 

 

이런 부수 효과를 제어하기 위해 새로운 '불만족도'라는 개념을 추가한다.

 

불만족도는 다양한 방법으로 계산될 수 있는데 보통 목표 수치를 제곱해서 더하는 정도면 충분하다.

 

그 뒤에, 행동을 하고 난 뒤의 불만족도를 계산한 다음 가장 불만족도가 낮은 액션을 취할 수 있다.

 

예를 들어, 위에서 언급한 예에서는 다음과 같이 불만족도를 구할 수 있다.

목표 :  음식 섭취 = 4, 화장실 = 3
행동 : 물 마시기 (음식 섭취 -2, 화장실 +3)
 - 행동 후 : 음식 섭취 =2 , 화장실 = 5 (5가 최대) : 불만족도 = 29
행동 : 화장실 가기 (화장실 -4)
- 행동 후 : 음식 섭취 = 4, 화장실 = 0 : 불만족도 = 16

이제 새로운 로직은 먼저 화장실 가기를 선택한다. 똑똑해졌다. 

 

 

 

 

수행 시간


 

위에 언급한 문제점 중 수행 시간을 무시한다는 것은 뭘까?

 

캐릭터의 행동들은 수행하는 데 시간이 걸릴 수 있다. 이때 수행 시간을 고려하지 않는다면 어색할 수 있다.

 

예를 들어, 요리를 한 다음 밥을 먹는 행위는 식사 욕구를 크게 줄여주지만 1시간이 걸린다면 당장 굶어 죽을 상황에서 요리를 하는 행위를 해서는 안 될 것이다.

 

수행 시간 자체도 두 가지로 나뉠 수 있는데, 하나는 행동 자체의 수행 시간이고 다른 하나는 행동을 준비하는 시간이다. 예를 들어, 어떤 행동을 수행하기 위해서는 특정 장소로 이동해야 할 수 있고, 이동하는 데는 시간이 걸린다. 

 

이런 이동시간을 계산할 때는 정확하게 길찾기 알고리즘을 사용하거나, 휴리스틱한 방법으로 대략적인 값을 계산하는 방법을 사용할 수 있다. 그러나 모든 행동에 대해 매번 길찾기 알고리즘을 수행하는 것은 오버헤드가 매우 커 비현실적이다. 휴리스틱을 이용하여 근사값을 계산하는 방법이 좋다.

 

 

 

 

 

불만족도 계산 

수행 시간을 포함하여 불만족도를 계산해보자.

 

우선 수행 시간이 의미가 있으려면 시간에 따라 목표 수치가 변경되어야 한다. 가령 음식 섭취 욕구는 시간이 지남에 따라 증가하는 게 자연스럽다.

 

그러면 행동을 하는 동안에도 불만족도는 증가한다. 최종적으로 행동을 마친 다음의 불만족도를 계산할 수 있다.

 

시간 개념을 추가하여 불만족도를 계산한 예를 보자.

목표 :  음식 섭취 = 4,  시간당 +4
목표 : 화장실 = 3, 시간당 + 2
행동 : 과자 먹기 (음식 섭취 -2) : 15분 걸림
 - 행동 후 : 음식 섭취 =2, 화장실 = 3.5 : 불만족도 = 16.25
행동 : 밥 먹기 (음식 섭취 -4) : 1시간 걸림
- 행동 후 : 음식 섭취 = 0, 화장실 = 5 : 불만족도 = 25

시간을 고려하지 않는다면 밥 먹기 행동을 선택하겠지만, 시간을 고려하고 나면 과자 먹기를 선택한다. 사실 과자 먹기가 시간당 감소하는 음식 섭취 욕구가 더 높으므로 과자 먹기를 선택하는 것이 옳은 판단이다. 그리고 새로운 로직은 옳은 판단을 할 수 있게 됐다.

 

 

 

정확한 시간당 변화량을 구하기 힘든 경우

 

그러나 시간당 목표 수치의 증가량을 구할 수 없는 경우도 존재한다.

 

예를 들어, '공포'라는 수치가 존재하는데 적에게 피격될 때 마다 이 수치가 1씩 증가한다고 가정하자. 이런 경우에는 시간당 목표 수치를 정확하게 얻을 수 없다. 

 

따라서, 이런 경우에는 시간에 따른 목표 수치의 변화량의 근사값을 얻어내야 하고, 이는 최근 목표 수치의 변화량을 기록하면 쉽게 가능하다.

 

최근 수치 변화량의 계산은 다음과 같은 지수평활법(recency-weighted average)를 이용할 수 있다.

지난 시간 이후 변화율 = 지난 시간 이후 변화량 / 경과 시간
최종 변화율 = 0.95 * 최종 변화율 + 0.05 * 지난 시간 이후 변화율

이러면 최근에 많이 얻어맞은 캐릭터는 더욱 공포에 빠지기 쉽게 된다.

 


참고 : Ian Millington, AI for GAMES 3rd edition, CRC press, [Chapter 5.7]

'Game AI' 카테고리의 다른 글

Rule-Based System (1)  (0) 2022.12.12
목표지향 행동 - 3  (0) 2022.12.04
목표 지향 행동 (Goal-Oriented Behavior) - 1  (0) 2022.11.20
마르코프 시스템(Markov Systems)  (0) 2022.11.13
퍼지 상태 머신 (Fuzzy State Machine)  (2) 2022.11.02