티스토리 뷰

반응형

출처 : http://www.ibm.com/developerworks/kr/library/j-robowrap.html


Robocode 대회는 끝났고 우승자가 가려졌다. 누가 우승컵을 가져갔는지 성공의 비밀은 무엇인지를 알아보자.

전 세계의 프로그래머들이 자신들의 코딩 기술을 발휘하여 가장 공포스러운 자바 "로봇"을 만들어 가상 전투장에서 전투를 벌였다. ArtofWar, BienatorII, SandboxLump, BulletMagnet, Cake 등의 이름을 가진 로봇들은 기존의 자바 객체들 보다 오락적 요소를 갖추었다. 네덜란드 프로그래머인 Enno Peters에게 전체 우승의 영예가 돌아갔다.

전략 결정과 코딩 등 챔피언 등극을 가능하게 했던 요소를 들어보기 위해 Peters를 비롯하여 4명의 우승자를 인터뷰했다. 필자가 알아낸 단 하나의 사실은 각 개발자 마다 자신만의 독특한 접근 방식이 있었다는 것이다.

Yngwie: 예측자(Predictor)

Robocode Rumble 우승자 Enno Peters(24)는 인공 지능을 공부하는 네덜란드 학생이다. 친구인 Martijn Muurman과 지난 4월, 학교(University of Groningen)에서 개최되는 대회 관련 이메일을 받고 Robocode를 알게 되었다. 게임에 대해 검토하고 난 후 둘은 그 게임에 매료되었다. Yngwie가 대학 토너먼트에서 우승한 뒤, Enno는 로봇을 업그레이드 하고 Robocode 대회에서 그 진가를 발휘했다.

Enno는 Robocode용 로봇을 설계할 때 많은 요소들이 작용했지만 핵심은 간단했다고 설명한다. "무엇보다도, 뛰어난 레이더 움직임이 매우 중요합니다. 왜냐하면 레이더 아크(arc)안에 있는 상대 로봇의 위치에 대해 업데이트 상황을 얻기 때문입니다. Yngwie는 어느 로봇이 가까이 있는지 또는 위험한지를 결정하고 종종 효과적으로 이것들을 탐지하기 위해 노력합니다." Enno의 로봇은 또한 "상대의 움직임과 액션에 대해 가능한 정확한 히스토리를 갖기 위해서 빼먹은 정보를 삽입했다. "Yngwie는 상대편 주위에서 예측할수 없는 속도와 방향으로 돌격했습니다. 하지만 남아있는 상대편이 많을 때에는 전투장에서 조용한 장소로 피합니다."

우승자

고급
우승자: Enno Peters (Yngwie), 네덜란드

2위: Steve Coope (Vapour), 영국

중급
우승자: Arun Kishore (Fermat), 싱가포르

2위: Daniel Johnsun (BigBear), 호주

초급
우승자: Manfred Schuster (Ares), 독일

Enno는 그의 전략은 특별한 것이 아니라고 강조한다. "내 로봇과 다른 사람들의 로봇 사이에는 많은 유사성이 있다는 걸 알았습니다. 많은 로봇들은 가능한 효과적으로 상대편을 검토하고 상대편 기록을 저장하고 일대일 전투와 다중 전투에 대해 다른 모드를 갖고 있습니다. 더욱이 대부분의 로봇들은 가능한 오랫동안 문제에서 벗어나 있으려 하며 쉬운 로봇을 가능한 빨리 죽이려고 시도합니다. 상대의 에너지와 거리에 기준하여 총알의 힘을 조정하고 등급이 정해진 소수의 Predictor를 사용합니다." Predictor들은 성공했을 때 포인트를 부여하고 실패했을 때 포인트를 깎는 식으로 등급이 매겨진다. 시간이 갈수록, 특정 predictor는 높은 점수를 기록하게 된다. 이렇게 되면 상대편에게 가장 치명적일 수 있는 predictor를 선택할 수 있다.

Enno는 다른 로봇과의 차이점은 바로 세부적인 것에 있다고 말한다. 예를 들어 적정량의 bullet power를 선택하는 책임이 있는 Predictor 클래스를 사용하면서 Gunner 클래스에게는 슈팅에 따른 포인트를 주었다. 상대편이 소량의 에너지로 달리면 이 predictor는 Yngwie가 이를 물리칠 수 있는 적량의 발사력(firepower)을 선택하도록 하면서 로봇의 에너지를 절약한다. 어떤 predictor는 Yngwie가 다른 로봇이 움직이는 방향에 대한 기록을 보유할 수 있도록 했다. "이 predictor가 선택되면 비슷한 상황에 대한 히스토리가 검색되고 (예를들어, 상대편 거리 또는 각도), 현재 위치에서 예측 가능한 편차를 기준으로 발포됩니다. 이 predictor는 대부분의 탄환 기피자(bullet dodgers)에 효과적이였습니다.

Yngwie 소스 코드 다운로드(참고자료).




위로


Vapour: 정확한 움직임

탄환을 피하는 로봇(bullet dodgers)중에는 Steve Coope의 Vapour도 있다. Steve(영국)는 이 대회에 참여한 친구로 부터 Robocode 소식을 접했다. Vapour의 디자인은 Steve가 처음 만든 에러가 많고 실험적인 로봇(Silver)에서 발전한 것이다. "Silver를 만드는 데 한달이나 걸렸지만 효과적이지는 못했습니다. 하지만 아키텍쳐를 실험할 수는 있었습니다." 기본 플랫폼에 만족한 Steve는 로봇의 움직임을 실험하기 시작했다. 결과는 퍼포먼스와 특질에 있어 큰 변화가 있었다. 이같은 향상을 보인 새로운 로봇은 Vapour라는 이름으로 다시 태어났다.

이름의 유래

"Yngwie는 록스타 Yngwie Malmsteen의 이름에서 따왔습니다. 그는 세계적인 기타리스트 이기도 했지만 내가 그를 좋아했던 이유는 그의 독특한 스타일이였습니다. Yngwie를 통해 그를 모방하려 했습니다." -- Enno Peters, 네덜란드

"주변을 닥치는 대로 헤매이는 대신, Vapour는 갑작스러운 연속적 움직직임으로 전투장의 조용한 지점으로 움직이려 했습니다. 나는 이러한 움직임이 연기 입자의 확산과 같다는 생각을 했고 "Vapour"의 개념과도 맞다고 생각했습니다" -- Steve Coope, 영국

"BigBear"라는 이름은 갑자기 떠오른 것이였습니다. 크고 귀여운 테디베어를 떠올린거죠." --Daniel Johnsun, 호주

"Fermat은 프랑스 수학자 Pierre de Fermat의 이름에서 따왔습니다." -- Arun Kishore, 싱가포르

"제 여자친구가 그리스의 전쟁 신 이름을 떠올렸고 Ares가 탄생했습니다." -- Manfred Schuster, 독일

Steve는 Vapour의 성공을 로봇의 유연성과 이를 가능하게 했던 실험으로 돌렸다. "Vapour는 매우 확장성있고 모드간 변환도 쉽습니다." Enno와 마찬가지로, Steve 역시 세부적인 부분에 특별한 주의를 기울였다. "완벽주의자 행세를 하면서 디버깅에 지겨울정도로 광적인 집착을 보인 결과, 전체 개발 과정은 느렸지만, 모든 것이 디자인 의도대로 접근해가고 있다는 확신이 섰고 특별한 상황에도 의연하게 대처할 수 있었습니다."

전략적 측면에서, Steve는 단순하고 명확한 방식을 택했다. "실제 구현은 그렇지 않더라도 알고리즘은 개념적으로 단순하게 유지하고 싶었습니다."

Vapour 성공의 또 다른 비밀은 움직임과 targeting 이다. "상대편이 여럿일 경우 움직임은 연속적인 linear waypoints로 했습니다. waypoint에 다다를 때 마다 새로운 waypoint들이 생성됩니다. 전투장 벽에 가까운 것들은 즉시 소멸됩니다. 움직임 솔루션을 만들 때, Steve는 대중적인 anti-gravity 전략을 무시했다. 해결에 필요한 많은 코딩과 불필요한 문제를 야기시킨다는 판단에서였다.

Targeting은 로봇의 단기 학습 능력에 의존한다. Vapour는 타겟 로봇의 160회 이상의 방향전환에 대한 모든 리스트를 사용하여 타겟의 움직임에 주기성이 있는지를 결정한다. Vapour가 같은 경우에 대한 시간 추이 유형에 대해 타겟의 움직임을 연관지을 수 있다면 타겟의 움직임에 가장 근접하게 매치되는 시간 변환이 타겟의 움직임 주기로 간주된다. 그렇지 않다면 그 움직임은 비주기적인 것이 된다.

"주기적인 타겟의 경우 주요 차이점은 Vapour가 타겟의 히스토리로 가서 움직임을 재생하는 반면 주기성이 없을 경우 제시간에 타겟의 움직임을 거꾸로 재생하는 단순함을 보입니다. Vapour의 정확성은 상당히 주기적인 타겟의 경우 탁월하게 작용합니다."

Vapour 소스 코드 다운로드 (참고자료).




위로


BigBear: a.k.a. "the Ram"

Vapour의 유연성의 요소는 Daniel Johnsun의 BigBear에 반영된다. Daniel은 경쟁에서 모든 다른 로봇들을 물리칠 수 있는 완벽한 전략은 없다는 것을 깨달았다. "그래서 제가 시도했던 것은 상황에 다라 전략을 바꿀 수 있는 프레임웍을 구현하는 것이였습니다."

그는 로봇 유연성을 조준 전략(aiming strategy)으로 설명하고 있다. "Enemy 객체가 InterceptManager 클래스의 인스턴스를 갖고있는 데 여기에는 다른 많은 조준 알고리즘이 저장됩니다." 각 로봇을 조사한 후에, InterceptManager는:

"InterceptManager는 지속적으로 각각의 조준 알고리즘의 정확성을 업데이트한다. 그래서 실제 탄환을 목표물에 발사하기 전에 InterceptManager는 가장 정확한 알고리즘을 선택한다.

BigBear 전략의 다른 부분은 예외라고 할 수 있다. "BigBear의 초기 전략은 순환적인 targeting을 사용하여 자신에게 발사되었다는 가정하에 총알을 피하는 것이였습니다. 여러 번의 개정 후에 나는 마침내 피하기 전략을 예상한대로 작동하게 했지만 퍼포먼스는 떨어진다는 것을 발견했습니다. 나의 이전 미완성 코드가 더 나은 것 처럼 보였고, 결국 그것 으로 전환하여 전체 움직임에 몇몇 엘리먼트를 추가했습니다."

Daniel의 로봇은 분명한 이득을 갖고 있는 다른 로봇들을 공격적으로 격돌하도록 설계되었다. BigBear는 Ram Bonus 포인트를 얻게된다.

BigBear 소스 코드 다운로드 (참고자료).




위로


Fermat: 노련한 도망자

Arun Kishore는 Singapore의 Nanyang Technological University에서 컴퓨터 엔지니어링을 공부하는 학생이다. 그는 그의 로봇 Fermat을 설계할 때 움직임과 targeting에 초점을 맞췄다. 그는 Fermat에게 승리를 안겨주었던 전략은 경쟁에 참여했던 다른 많은 로봇들과 비슷하다고 했다. 그의 전략은 "Secrets of the Robocode masters" 시리즈(참고자료)에 설명된 전략들이였다. 이를 테면, linear targeting, circular targeting, anti-gravity movement 등이다. 다만, Arun은 Fermat의 movement 디자인을 성공 요인으로 말한다. 다음 Arun의 코드에서 DodgeBullet 클래스에 대한 주석을 보자.

Fermat은 탄환의 이동 라인을 확인하고 그 라인에 수직력 (force perpendicular)을 적용하여 탄환을 피한다. 로봇은 다섯개의 모든 발사 전략에 대해 충격 포인트를 계산하기 때문에전략에 상관없이 발사를 피할 수 있다.(참고자료).

Fermat 소스 코드 다운로드 (참고자료).




위로


Ares: 초심자의 승리

자바 프로그래밍 초보자라면 위에 열거된 전략이 복잡하게 느껴질 수 있다. 하지만 비교적 기본적인 코드로 강력한 로봇을 만들 수 있다는 것을 기억하라. 초급 부문에서 우승을 차지한 Manfred Schuster는 Robocode를 시작하기 전에는 한번도 자바 코드를 작성한 적이 없었다. RamFire 같은 샘플 로봇을 실험하고 Robocode Repository에서 다른 로봇을 다운로드하여 그들이 어떻게 작동하는지를 보았다. Robocode Rumble를 위해 Ares를 만들어가면서 강력한 로봇을 만드는 방법을 알게되었다.

"일대일 전투에서 단 한발도 쏘지 않고 승리할 수 있습니다." 즉, 상대편의 모든 탄환을 피하고 생존 보너스를 얻어서 점수를 올리는 트릭이다. "이를 위해, 저는 네 개의 movement 알고리즘을 구현했습니다." 만약 이 알고리즘 중 하나가 상대편에게 패배하면 네 로봇 중 다른 로봇을 시도한다. 이 알고리즘은 Ares에게 90도 회전을 지시하고 무작위 속도와 거리로 앞뒤로 지속적으로 움직이도록 명령한다. 이러한 움직임 때문에 Ares는 플랫폼 매칭을 사용하는 상대에게 있어 어려운 목표물이 된다.

공격피하기(Evasion)는 소극적인 방법이다. Manfred가 설명하는 바에 따르면, 10 라운드에서 살아남는 것으로 승자가 되기에는 충분치 않다고 한다. 승리하기 위해서는 좀더 공격적인 전략이 필요하다고 생각한 그는 Ares가 네 개의 목표 알고리즘을 시도하고 그중 하나를 선택하도록 설계했다. 공격 기회를 늘리기 위해 발사하기 전에 상대편을 향해 움직이는 과감한 전략을 선택했다. 이는 포인트가 늘어나는 장점이 있지만 Ares를 쉬운 목표물이 되게 하는 단점도 있다.

Ares 소스코드 다운로드 (참고자료).




위로


결론

인터뷰에 응한 우승자 대부분은 입증된 전략과 혁신의 조화가 로봇을 승리로 이끌었다고 입을 모은다.

우승자 탄생의 장막뒤엔 유연성이라는 보물이 숨어있었다. Arun Kishore는 이전의 프로그래밍 방법과는 다르게 로봇을 코딩했다고 설명한다. "이전 프로그래밍은 스팩에 고정되어 있었고 프로그래머에게는 많은 자유가 없었습니다. Robocode 에서, 프로그래머는 생각을 조합하고 그것들을 로봇에 맞게 설계하여 구현해야 합니다. 이렇게 되면 더욱 많은 만족과 즐거움을 얻게됩니다."

Mat는 여러 새로운 기능들을 추가하여 게임용 API의 재디자인 작업을 하고 있다.




위로


참고자료

반응형
댓글