네코동 AI 챌린지: Duragonball

AI 대회 소개

NDC 둘째날 점심시간, 딱 심심할 때, 네코동에서 AI 챌린지가 진행됩니다. 여러분이 직접 만든 자식같은 AI가 다른 AI들과 한판 붙는 것이죠. 룰도 친숙할 겁니다! 어릴 때 쎄쎄쎄 좀 해보셨던 분이라면요.

게임 룰은 O래곤볼 게임을 기반으로 만들어졌습니다. 기억 나시나요? '아' '파' '막기'(지역차이 有)만으로 승부를 내던 그것입니다.

네코동 AI 챌린지에서는, 여러분의 AI가 공룡이 되어 '듀'래곤볼 게임을 합니다.

참가하지 않으시더라도, AI 공룡들이 기를 모으며 결투하는 모습은 꽤 재밌을 거에요. 상품을 듣고 나면 출전하고 싶으시겠지만요.

1등 상은 플레이스테이션 4 pro입니다.


(출처: https://youtu.be/y9Zi-Ghk97Y?t=21)

이번에는 지난 대회보다는 약간 난이도가 높은 게임을 준비해보았습니다. 더 잘하기 위해 고민하고, 구현하고, 다시 더 나아지기 위해 고민하면서 AI를 만드는 것 자체가 엄청 재미있는 일이에요. 많은 참여 부탁드립니다.

미리 한 번 겨뤄보려면 http://necodong.com/duragonball를 참고해 주세요.

겨뤄보기 전에 자세한 룰이 궁금하시다면 아래의 룰을 확인해주세요.

게임 한 판을 이기기 위한 게임 룰과 대회에서 어떻게 AI를 평가하게 될지에 대한 대회 룰을 설명합니다.

게임 룰

대회 룰 (8강 결정까지)

대회 룰의 예

A, B, C가 AI를 제출했다고 해봅시다.
A:B, B:C, C:A 상대로 11판 6선승제로 풀 리그 대전을 합니다.
A:B = 6승 2패로 A가 대전을 승리(A는 3점, B는 0점 획득) - 6선승 시점에서 종료
B:C = 5승 4패 2무로 B가 대전을 승리(B는 3점, C는 0점 획득)
C:A = 5승 5패 1무로 대전 무승부(C, A 모두 1점씩 획득)
위와 같이 경기 결과가 나온 경우, 대전 결과를 종합하면
A: 1승 1무로 4점
B: 1승 1패로 3점
C: 1무 1패로 1점
A, B, C 순서대로 1, 2, 3등이 됩니다. 만약 점수가 같았다면 제출 순서를 따져 먼저 제출한 AI가 상위 등수를 차지합니다.

대회 룰 (8강)

직접 게임 경험해보기

PC나 폰으로 아래 주소로 접속하여 사람들과 붙어볼 수 있습니다.

necodong.com/duragonball

참가하는 방법

AI 함수를 작성한 후 압축해서 첨부파일로 메일로 necodong@gmail.com으로 전송하시면 됩니다! (자세한 제출방법을 참고 해주세요)

심사의 편의를 위해 참가 가능한 언어는 Javascript로 제한합니다. 불필요한 동작을 하는 코드의 경우 실격처리할 수 있습니다(파일 오픈, 외부와 통신, 해킹 시도, 특수한 기법으로 룰을 우회하는 등).
코드로 특정 파일을 읽어들이는 등의 일반적이지 않은 사용은 허용하지 않습니다.

다음 형태의 함수를 작성하시면 됩니다. 인자 설명은 아래에 있습니다.
만약 구현상 다른 함수를 추가해야할 경우 자유롭게 추가해서 구현해 주세요. 프로그래밍 초보이신 경우 아래의 return 부분을 수정하여 특정 순서로 내는 AI를 쉽게 만드실 수 있습니다.

// Javascript
// charge, attack, block(집중, 공격, 방어) 순서대로 내는 AI 예제입니다.
function think(hp, mp, you_hp, you_mp, history, old_games) {
	if (history.length % 3 == 0)
		return 'charge';
	if (history.length % 3 == 1)
		return 'attack';
	if (history.length % 3 == 2)
		return 'block';
}

think가 호출될 때 인자의 예

내가 block을 내고 상대가 attack을 내서 내가 상대의 공격을 막고 기를 1 흡수했고, 내가 charge를 내고 상대는 block을 내어 아무 체력 감소 없이 내 기가 두 번 모인 상태입니다. 한 번 더 charge를 해서 기를 모으거나(모험지향), attack을 해서 내가 모은기로 공격하거나(공격지향), 내가 기를 연속으로 모은 것을 파악한 상태가 공격할 것을 예상하고 block을 할 수 있습니다.(안전지향). old_games를 살펴서 어떤 수가 더 유리할지 더 고민해 볼 수 있습니다.

AI 테스트하기

아래 사이트에서 제작한 AI를 미리 만들어진 AI와 대전 해볼 수 있습니다. 제출 전에 동작하는지 테스트 용으로 사용하실 수 있습니다.

예제 AI나 제출시 공개 하기로 결정한 AI 와 대전해 볼 수 있습니다. 콤보 박스에서 선택 후 공개 AI 와 겨뤄보기를 눌러보세요.(공개 AI 제출 시 부터 제공)


http://necodong.com/test

휴대폰 보단 PC로 접속해주세요. 크롬 최신버전을 사용하시는 것을 추천드립니다. 코드가 동작하지 않는 경우 개발자 도구를 열어 콘솔을 확인하면 관련 메시지가 출력되어 있는 경우가 있습니다. 버그가 있으면 문의주세요.

제출 방법

제출은 necodong@gmail.com 으로 “[AI대회] AI이름” 제목으로 메일을 보내주세요. 작성한 AI 코드를 zip으로 압축하여 첨부파일로 제출하시면 됩니다.

제출은 4월 13일(토)부터 4월 21일(일)까지 받습니다.

압축파일에 포함되어야할 내용은 아래와 같습니다. 확장자를 기준으로 판단하므로 파일이름은 아래와 달라도 괜찮습니다.

필수

옵션: 8강에 진출한 경우 중계할 때 사용합니다. 8강에 진출했는데 설명이나 이미지가 없는 경우 다시 요청드릴 수도 있습니다.

만약 제출한 AI를 공개하여 웹에서 테스트로 겨루게하고 싶은 경우, 제목에 “- 공개” 라고 붙여주세요. 코드가 공개되지는 않습니다.
제출하는 코드는 16384 바이트 이하여야합니다.

예)
[AI대회] BigHead
[AI대회] LazyThinker - 공개

상품

1등 - 소니 플레이스테이션 4 Pro
2등 - 애플 에어팟
3~4등 - AI 스피커 (구글 홈 미니, KT 기가지니 버디) (3등이 먼저 선택합니다.)
5~8등 - Sandisk Z73 128G USB

현장 추첨 - SYMA X8 PRO 드론

8등까지 제출하신 코드가 공개됩니다. 추가적인 소감이나 알고리즘 설명을 요청드릴 수 있습니다.

16등까지 NDC 참관권이 지급 됩니다.(거래, 양도 불가) 경품 지급은 NDC 참관객만 가능하므로 꼭 사용 후 대회장에 참석해주세요.

중간 집계

제출 기간 동안 전날까지 제출 완료 된 AI들끼리 대전을 하여 제출 마감 전날까지 공개합니다.

ex) 4/13일 23시59분59초까지 제출된 AI들로 결정된 순위를 4/14일중에 공개

제출 마감 당일에 제출된 AI 순위는 공개하지 않습니다.

중간 집계

2019. 04. 13.

이름 승점
BIGEYEFROG_01 12
(예제) 닥공보다 쪼끔더 똑똑한 기본AI 9
bronto 6
Super Attack BoB 3
(예제) 닥공 기본AI 0

총 3분이 제출해 주셨습니다. AI를 비교해 볼 수 있게 간단한 전략을 구현한 예제 AI를 몇 개 넣어보았습니다. 예제 AI들은 최종 등수를 평가할 때 제외됩니다.

2019. 04. 14.

이름승점
Champagne 24
BIGEYEFROG_01 21
(예제) 닥공보다 쪼끔더 똑똑한 기본AI 16
Duravis 13
bronto 12
DoomGuy 12
Super Attack BoB 4
참가에의의 2
(예제) 닥공 기본AI 1

2019. 04. 15.

이름승점
BIGEYEFROG_01 40
Champagne 39
듀방이 38
콤피의앞발 36
(예제) 닥공보다 쪼끔더 똑똑한 기본AI 32
DoomGuy 28
bronto 27
V0 27
화성시 21
Duravis 19
prototype 19
Super Attack BoB 10
옆동네AI 8
(예제) 닥공 기본AI 7
네코네코네 3
IReum 0

2019. 04. 16.

이름승점
BIGEYEFROG_01 46
Champagne 45
듀방이 44
콤피의앞발 42
(예제) 닥공보다 쪼끔더 똑똑한 기본AI 38
DoomGuy 34
bronto 33
V1 33
화성시 27
prototype 25
Duravis 25
Super Attack BoB 18
팡요봇 13
(예제) 닥공 기본AI 13
Dogfight 9
듀라곤볼 AI 대회 참여 희망합니다! 6
네코네코네 3
IReum 0

대전이 정상적으로 진행되지 않고 있는 일부 AI가 발견되었습니다. 제출 방법을 참고하여 참가 부탁 드립니다. 메일을 전송하시면 자동으로 코드가 갱신됩니다.

2019. 04. 17.

이름승점
Champagne 60
BIGEYEFROG_01 53
듀방이 48
Dogfight 48
AIIA 47
페나코의앞발 39
IReum 36
V2 36
(예제) 닥공보다 쪼끔더 똑똑한 기본AI 33
DoomGuy 32
bronto 31
테스트 2개만 이기자 27
Duravis 25
prototype 22
네코네코네 22
화성시 19
후훗야레아레 19
Super Attack BoB 10
(예제) 닥공 기본AI 7
눈큰왕눈이-공개.zip 3
듀라곤볼 AI 대회 참여 희망합니다! 0

2019. 04. 18.

이름승점
AI이름: 이어팟주세요 108
Champagne 100
V2 94
disabled bot 93
BIGEYEFROG_01 87
스밀의앞발 84
AIIA 80
듀방이 79
Dogfight 75
(예제) 닥공보다 쪼끔더 똑똑한 기본AI 69
bronto 68
테스트 2개만 이기자 63
네코네코네 63
IReum 61
DoomGuy 58
덜덜 52
슈랜코 52
Duravis 50
김로봇(29세,무직) 49
네코동에미인이많다고들었습니다 49
업무시간에 만든 AI 49
후훗야레아레 48
박박구 48
디바 48
화성시 47
풍뎅1호 46
핫산AI 45
prototype 43
SF 34
Super Attack BoB 32
치밥이는 떡상할꺼야 29
(예제) 닥공 기본AI 24
모르쇠 21
Hajiman Onichan Geuleohgelado hajianUmyeon 9
미적공부시렁~ 6
눈큰왕눈이-공개.zip 3
듀라곤볼 AI 대회 참여 희망합니다! 0

대회 참여 인원이 늘어 전체 대전 시간이 다소 증가했습니다.

2019. 04. 19.

이름승점
AI이름: 이어팟주세요 125
V2 120
disabled bot 112
스밀의앞발 111
BIGEYEFROG_01 110
치밥이는 떡상할꺼야 103
Dogfight 99
박박 99
듀방이 97
초사이어사우루스 갓 90
테스트 2개만 이기자 87
패턴브레이커 87
에부부 83
IReum 82
(예제) 닥공보다 쪼끔더 똑똑한 기본AI 82
DoomGuy 78
bronto 76
슈랜코 73
업무시간에 만든 AI 72
4IF 72
네코동에미인이많다고들었습니다 69
AI, THE PLAYLIST 69
덜덜 66
Duravis 61
네코네코네 61
Javascript는 처음입니다 58
박박구 56
prototype 55
화성시 53
핫산AI 51
디바 51
후훗야레아레 46
Super Attack BoB 41
SF 40
풍뎅2호 36
(예제) 닥공 기본AI 36
김로봇(29세,무직) 33
모르쇠 21
Champagne 15
허이짜짜 12
Hajiman Onichan Geuleohgelado hajianUmyeon 9
미적공부시렁~ 6
눈큰왕눈이-공개.zip 3
듀라곤볼 AI 대회 참여 희망합니다! 0

2019. 04. 20.

이름승점
AI이름: 이어팟주세요 150
V2 137
맘모스의앞발 135
disabled bot 130
Champagne 128
눈큰왕눈이-공개.zip 126
코비 126
박박구v2 121
BIGEYEFROG_01 120
chicken 120
듀방이 117
치밥이는 떡상할꺼야 117
로봉 111
초사이어사우루스 갓 111
박박 108
Dogfight 105
바보미니언.zip 105
에부부 94
HOMURA 92
미쳤습니까 휴먼? 86
IReum 85
DoomGuy 84
테스트 2개만 이기자 84
그냥코드 83
패턴브레이커 81
bronto 80
네코동에미인이많다고들었습니다 79
(예제) 닥공보다 쪼끔더 똑똑한 기본AI 76
4IF 75
덜덜 72
디바 69
후훗야레아레 64
네코네코네 63
Duravis 60
prototype 56
화성시 55
핫산AI 54
Javascript는 처음입니다 54
오이오이 인생은 도박이라구 51
어공격을그렇게많이하면 48
풍뎅2호 43
SF 40
Super Attack BoB 35
김로봇(29세,무직) 34
으아악 32
(예제) 닥공 기본AI 28
모르쇠 24
gpman 12
허이짜짜 9
Hajiman Onichan Geuleohgelado hajianUmyeon 6
미적공부시렁~ 3
듀라곤볼 AI 대회 참여 희망합니다! 0

마지막 중간 집계 공개 입니다. 오늘(4/21) 자정까지 제출한 코드로 최종 순위가 결정됩니다.

상위권 코드 공개

대회 최종 본선이 끝나고 우수한 성적을 거둔 1위~8위까지의 AI의 설명 및 코드를 공개합니다.

1위

Champagne

나 혹은 상대의 마나가 2~3이 되면 공격, 그 이외엔 방어만 하는것을 기본으로 상대의 연속집중이 많으면 공격조건을 1~3으로 바꾸고 방어가 많으면(46회이상) 다음라운드부터 45턴이후 집방집방하는 AI.
코드: code.js


2위

이어팟주세요

상대방이 낼 액션을 확률적으로 예측하고 예측된 액션에 따른 최적의 액션을 선택합니다. 

1. 현재 턴에서 상대방이 낼 액션을 확률적으로 예측합니다.
2. 예측한 액션에 따라서 해당 상황에 맞는 최적의 액션을 선택합니다.
   (mp, hp, you_mp, you_hp, 예측의 정확성도 어느정도 고려함)
3. 끝

## AI 세부 설명 

1. 현재 턴에서 상대방이 낼 액션을 예측합니다.
  
  1.1 YOU_MP 기반으로 예측
    YOU_MP가 n 이라고 할때 상대방이 주로 어떤 액션을 취하는지를 예측합니다. 
    
    1) 예를들어 현재 턴에서 YOU_MP가 1이라면, 
       oldgames와 history에서 YOU_MP가 1일때 냈던 상대방의 액션의 빈도수를 계산합니다.
       상대가 이전 턴들에서 YOU_MP가 1일때, 
       상대가 attack 을 8번내고, block을 1번내고, charge를 1번냈다면,
       d = {"attack": 9, "block": 2, "charge": 2} 형태로 빈도수가 저장이 됩니다. 
    
    2) d에 저장된 액션들의 빈도수 합을 d_sum이라고 할때 (d_sum*0.75) 보다 
       한 액션의 빈도수가 더 많을경우에는 이를 상대방이 낼 액션이라고 예측하며 accuracy 를 high라고 지정합니다.
    
    3) 2)의 경우에 해당이 되지않는 경우에는 d 에 저장된 빈도수를 
        랜덤함수의 가중치로 설정하여 상대방이 낼 액션을 예측합니다. 
       (*부가 설명: 위의 예시의 경우에는 [어택,어택,어택,어택,어택,어택,어택,어택,어택,블락,블락,차지,차지] 
        이런식의 배열이 만들어지고,랜덤함수를 통해 (0~마지막요소인덱스)중에 하나의 인덱스값이 선택된다.)
  
  1.2 바로 이전턴의 액션 기반 예측
    바로 이전 턴에서 (나: ACTION1, 상대: ACTION2)을 냈을때 상대는 이번턴에서 어떤 선택을 할것인지 예측합니다.
    1) 세부적인 알고리즘은 1.1의 예측 모델의 알고리즘과 유사함. (빈도계산->바로예측 또는 가중치 랜덤)
  
  1.3 accuracy가 high인 액션이 우선적으로 선택되며, 둘다 accuracy가 high 가 아닐경우에는 1.1 에 의해 예측된 액션이 선택됩니다.

2. 예측한 상대의 액션에 따른 최적의 액션을 합니다. 
    예측한 액션과 accuracy, hp,mp,you_mp,you_hp 등을 고려했을때의 최적의 선택을 수행함
  2.1 상대의 액션이 charge 로 예측되었을때, counter_action_for_charge 함수 참고
  2.2 상대의 액션이 block  로 예측되었을때, counter_action_for_block 함수 참고
  2.3 상대의 액션이 attack 로 예측되었을때, counter_action_for_attack 함수 참고
코드: code.js


3~4위

맘모스의앞발

Greedy하게 다음에 상대가 낼 것을 예측해서 카운터를 냅니다.

Depth를 3으로 했더니 랜덤한테 발려서 1로 했습니다.
코드: code.js


CBG(씨비지)

Main 함수 think를 제외하고 4개의 함수를 만들었습니다.

첫번째, 처음(first) 함수의 경우 Old_Games의 각 라운드의 1턴 통계자료로 3가지 Action에 우선 순위를 할당하여 리턴 합니다.

만약 1라운드 1턴인 경우 3가지 Action 모두 동일한 우선 순위로 리턴 합니다.

두번째, 분석(analyze) 함수는 각 라운드 1턴을 제외한 모든 턴에 상대의 Action을 예측하여 3가지 Action의 우선 순위를 정의하여 리턴 합니다.

세번째, 선택(choice) 은 처음(first) 또는 분석(analyze) 함수의 결과를 가지고 최종적으로 나의 Action을 선택하는 함수 입니다.

만약 두가지 이상 동일한 우선순위를 가진다면 미리 정의한 Action 우선 순위를 나의 Action으로 선택합니다.

마지막으로, 선택(choice)을 무시한 힘(force) 함수는 상대의 Action이 attack이라고 예측한 상황에서 나의 기가 상대의 기보다 많다면 동일한 Attack 을 선택하여, 내 피해보다 상대의 피해를 더 높이는 함수입니다.

가장 중요한 분석(analyze) 함수를 추가로 설명 드리면 총 9가지 경우의 수에 3가지 Action으로 수집된(Old_Games) 데이터를 대입하여 총 27가지 우선순위를 만들어 다음 상대의 Action을 예측합니다.
AI 코드: code.js


5~8위

V2

우디르입니다.
거북이 모드로 방어를 하고 있다가, 이건 아니다 싶으면 피닉스모드로 변해서 공격합니다.
코드: code.js


방밀전사v3

ver 1

기존에 사용한 점수 메커니즘이 결국 무조건 attack을 반환하게 되어있었고,
변수창출 함수에 의지해서 랜덤하게 승리를 가져가고 있었습니다...
이제와서 과거 히스토리를 분석하는 쪽으로 전환하기엔 틀린 것 같아서
애초에 상대의 행동을 예측해야 쓸모있는 charge는 배제해 버리고 attack과 block 위주로 안정성을 노려보았습니다.
목표는 턱걸이! 

ver 2

...라고 생각했는데
charge 배제시에 생기는 문제는 둘째치고 패턴이 굉장히 단순해져서 읽히기 쉬운것을 발견하고
그냥 수동 강화학습 한다고 치고 변수를 이리저리 바꾸어 최대한 승률이 높은 함수로 만들었습니다.
차라리 그냥 히스토리 분석할걸...

코드: code.js


코비

방어를 우선시 하다가 상대가 집중하려 하면 방해합니다.
하지만 유연성 있게 움직이면서 결정적 순간에 예상 밖의 플레이를 보여줍니다.
마치 코비처럼요.
코드: code.js


disabled bot

그냥 직접 게임을 해보면서 제가 어떻게 생각하는지
보고 그대로 if문 넣어서 만든 AI입니다.
코드: code.js

ipkn의 특별상

예선전 결과 ipkn님이 선정해주신 특별상 목록을 공개합니다.
많은 분들이 해당 코드를 공개해줄수 없냐고 요청하셔서, 참가자분의 동의를 받고 코드를 공개합니다.
코드: code.js












NDC 네코동 AI 대회에 참여해주신 모든 분들께 감사 드립니다! 4/25(목) 오프라인 중계도 많은 참여 부탁 드립니다.

성능 측정

클라우드 서비스를 제공하는 서버에서 테스트를 진행하고 있어, 정확한 CPU 속도를 제공하기 어렵습니다. 아래 코드를 참고해서 성능 비교에 사용해주세요.

javascript:

let f = () => {
const t = Date.now();
i = 0;
while(1) {
i ++;
if (Date.now()-t > 1000)
break;
}
return i
};

let s = 0;
for(let i = 0; i < 10; i ++) {
s += f();
}
console.log(s/10);

let g = (n) => {
const t = Date.now();
i = 0;
while(i < n)
i++;
return Date.now() - t;
}

console.log(g(f())/1000);

실행결과:

12043876.3
0.044

개인정보 수집 이용과 관련된 안내

AI 챌린지 코드 제출을 위해 보내주신 이메일은 대회 운영 목적으로만 이용하며, 대회 종료 후 30일 이내에 모두 삭제합니다.

문의

대회와 관련된 문의는 necodong@gmail.com 으로 보내주십시오. 이 페이지는 문의에 따라 내용 수정이 일어날 수 있습니다. 변경 사항은 아래 버전을 확인하세요.

버전 17

2019-03-31: 페이지 준비
2019-04-05: 룰 설명, 소개글 수정 완료. 이미지 추가
2019-04-07: AI 테스트 페이지, 데모 게임 페이지 추가
2019-04-08: 대회 페이지 외부 공개
2019-04-10: 공격 설명에 모호한 부분 수정
2019-04-14: 승리 대사 글자수 제한 명시
2019-04-14: 04.13 중간 집계 결과 업데이트
2019-04-15: 04.14 중간 집계 결과 업데이트
2019-04-16: 04.15 중간 집계 결과 업데이트
2019-04-16: 인자 설명의 오타 수정, 라이브러리 관련 설명 수정
2019-04-17: 04.16 중간 집계 결과 업데이트
2019-04-18: 04.17 중간 집계 결과 업데이트
2019-04-19: 04.18 중간 집계 결과 업데이트
2019-04-20: 04.19 중간 집계 결과 업데이트
2019-04-21: 04.20 중간 집계 결과 업데이트
2019-04-24: 예선전 특별상 공개
2019-04-26: 본선 결과 및 8등까지 코드 공개