• [일반] 경우의 수 구하는법 이게 맞나요?2019.04.22 PM 09:00

게시물 주소 FONT글자 작게하기 글자 키우기


 


GIF

 

 

 


GIF

 

격투게임에서 A와 B라는 캐릭터가 약 90개의 기술을 사용한다면 경우의 수는 90*90=8100 이렇게 계산하는거 맞죠? 가물가물해서...(철권이 평균적으로 90개 이상)

 

 

머신러닝(강화학습)으로 게임 ai만드는걸 학위논문으로 잡고 있습니다.

 

교수님들이 이게 왜 필요한지에 대한 설명이 부족하다고 하셔서 요구분석 내용을 좀 보강할려고 하는데 FSM의 단순함을 이야기 할려고 합니다.

 


 

머신 러닝을 사용하는 이유

 

1. FSM과 같은 상용화된 게임 AI기법들은 격투게임과 같이 경우의수가 많은 게임에서는 사용자가 파훼하기가 너무 쉽다.

ㄴ 각 기술마다 올바른 대응법을 구사하는 상태 전이를 만드는건 사실상 불가능하다.

ㄴ 캐릭터 A와B가 사용할 수 있는 기술이 서로 90개면 90*90 = 8100개의 경우의수가 나온다.

ㄴ 8100개의 경우의수를 직접 코딩하는건 사실상 불가능하다. 이후 발생할 디버깅도 생각하면 마찬가지


 

2. 철권처럼 인기가 많고 성공한 격투 게임도 난이도 최고로 올려도 진 앞 오른발(뻥발)만으로 어려움 없이 클리어가 가능하다

ㄴ 게임의 파훼가 쉬울수록 게임의 흥미를 쉽게 떨어트린다.

ㄴ 단순한 AI는 결과적으로 격투 게임 뿐만 아니라 게임의 싱글플레이 콘텐츠의 흥미를 쉽게 떨어트린다.

ㄴ 싱글플레이가 단순해 멀티플레이를 하자니 네트워크, 유저들간의 실력 격차가 큰 게임들이 존재하며 특히 격투게임 같은 경우 초심자들의 적응이 쉽지 않다.

 

 

3. 머신러닝을 이용해 FSM보다 더 발전된 AI를 제공하면 기존 초보 유저들 상대로 좋은 상대가 될 수 있을거라고 생각한다.

ㄴ 한가지 기술만 사용하여 게임을 클리어하는 단순함을 해결할 수 있다.

ㄴ 네트워크 없이 싱글플레이로 멀티플레이와 같은 재미를 제공할 수 있다.(학습한 ai실력이 사람수준이라는 가정하에)

ㄴ 머신러닝은 환경에 적응 능력이 있기 때문에 새로운 캐릭터나 기술이 추가되도 FSM처럼 상태 전이 코딩을 새로 짤 필요없이 AI에게 새로운 기술의 실행 명령만 추가하면 AI가 스스로 학습해 변화된 환경에 적응해 기술을 적재적소에사용한다.

 

 

머신 러닝 사용후 발견한 별개의 장점

ㄴAI의 캐릭터 컨트롤 방식이 사람이 키보드와 조작하는 방식과 매우 유사해 학습 과정중 자동으로 버그를 찾는다.(이건 프로토타입 돌려보면서 발견한 사항)

 

 

이거 말고 또 내용 추가할만한게 있을까요

 

 

위에 본문이 간단한 환경에서 구현한 프로토타입인데(이후 재대로된 환경에 적용해볼 예정)

 

1. 선빵 때리면 거의 필승이기 때문에 거리조절에 신경 엄청씀

2. 거리가 가까워지면 공격이 제일 빠른 하단 공격을 많이 쓴다.

3. 하단공격 1대라도 덜맞겠다고 방방 뛴다.

4. 공격과 점프를 아주 칼같은 타이밍에 따닥 누르면 점프 공격을 하는 버그를 사용한다.

5. 오른쪽 애는 도망가면서 싸우는 니가와 스타일 왼쪽애는 쫓아가는 스타일입니다.

6. 모르고 오른쪽 끝에 갈 수 없는 벽이 있다는걸 안알려줘서 계속 뒤로 튈려고함 

 

댓글 : 12 개
단순한 조합으론 90 by 90으로 8100이 맞는데, 격투게임이라는 점을 고려하면 그게 맞나 싶네요.

전 프로그래밍 전공은 아니지만, 논리로직만 고려했을 때
서로 동시에 90개 중 1개의 커맨드를 입력한다고 하는 전제를 언급하셔야 할 것 같고(아마 전제로 하신 부분 같은데 없어서 썼습니다.) 이게 없다면 서로 다른 타이밍 즉, 시간 변수까지 고려해야 하므로 경우의 수가 엄청나게 증가할 것 같습니다.

이런 가정(서로 동시에 입력)에서 출발했을 때, 8100가지의 경우의 수가 성립한다고 생각합니다.
네 저 90*90은 그냥 단순하게 입력가능한 기술수만 가지고 계산한거에요
타이밍까지 늘어나는 경우의수는 말이안되는 수준으로 증가하죠
네. 그런 의미에서 실제 격투게임딥러닝으로 학습시키는게 무슨 의미가 있을까 하는 생각이 들어서 언급을 드려 본 것 입니다. 실제 격투게임은 시간을 고려하지 않고는 성립할 수가 없으니까 그렇습니다.
실제와는 상관 없는 격투게임 딥러닝 머신을 개발하는게 목표라면 의미가 있겠지만, 이공계 쪽에선 그런거 교수님들이 별로 안 좋아하시던 것 같아서 말씀드려 보았습니다.
다행이 주제에 대한 문제점 지적은 없었고 당위성 유용성 개선을 주로 언급하셔서
제가 말씀 드린 부분이 당위성 부분이라 생각합니다.
당위성이란게 '왜 이 연구를 해야하는가?'에 대한 답이기 때문에, 이러한 머신러닝을 왜 해야하는지 설명이 필요한데, 실질적인 격투게임에 적용할 수 없는 가상의 격투게임에서만 적용 가능한 AI를 개발해야 한다고 설명한다면 설득력이 부족할 것 같습니다.
유용성 부분도 이와 연결되는 부분이 될 것 같습니다. 연구자분께서 해당 AI의 개발을 다른 방향에도 접목해서, 즉 위와 같은 AI 학습방식을 다른 분야에서 활요할 때 이 데이터의 결과값 내지는 학습방법을 유용하게 이용할 수 있을 것이다 라는 부분을 밝혀주셔야 할 것인데, 지나가던 제3자의 입장에선 알기가 어렵습니다.
무슨뜻인지 알겠네요 감사합니다
FSM이 대표적으로 많이 쓰이고 많이 알려져서 비교군으로 쓴거에욤

저 AI의 결정주기를 늘리면 반응속도가 느려져서 난이도 조절이 생각보다 쉽더라구요

아니면 AI의 관측 정보값에 약간의 허수를 추가하거나요
격투게임에서의 AI는 구현하기가 어렵거나 파훼하기가 쉬워서라기 보다는 사람같지 않아서 어려웠던 것 같습니다.
전략 시뮬레이션은 지금 선택한 행동이 점점 빌드업되어서 나중에 되돌릴수 없는 큰 차이를 만들기 때문에 ai가 복잡한 상황의 수를 계산해야하지만
격투게임의 경우 1번 스킬이 15프레임이라면, 내가 1프레임을 보고 스킬 파악을 했다면 이 스킬보다 빠른 약손으로 끊는다거나, 아니면 마지막 분기가 나뉘는 프레임까지 보고 판단할 수 있어서 그리 어렵지 않을것 같습니다.
그리고 머신 러닝이라고 하는 것이 이기는 것에 목표를 두고 학습을 시킨다면 이 AI는 지지는 않겠지만 재미는 없어질 거라 생각되요. 아니라면 반대로 유저측에서 공격을 하지 않고 무조건 ai가 선 공격을 하게 해서 제일 프레임이 짧은 공격으로 대응을 하는 방식으로 이기던가요.
교수님께서 이게 왜 필요한지 물어보셨을때, 정확히 어떤 부분이 부족하다고 느꼈었는지 한번 여쭤보시는것도 좋을것 같아용
머신러닝의 흥미로웠던점은(제컴문제일지도 모르겠지만)
기존의 명시적인 알고리즘 처럼 칼같은 반응속도로 움직이고 그러는게 아직은 잘 안되더라구요
관측 -> 관측된 값과 이전 관측상황을 비교-> 판단
이 과정이 1프레임이라는 엄청 짧은 시간안에 되는게 아니더라구요

플래피 버드 같은 단순한 게임같은경우에는 칼같이 반응합니다만 좀 움직임이 많아지면 엄청난 반응속도로 움직이지는 않습니다

오히려 이게 더 사람같아서 마음에 들더라구요
음 그러니깐 머신러닝을 왜 사용하느냐? 라는 것이죠
1. 관측에 걸리는 시간이 오래 걸린다
2. 비교에 시간이 오래 걸린다
그러면 지금 연구하시는 쪽은 이 두개중 어느쪽이 더 좋아지는 것인가요?
게임 개발사측에서는 사실 상대방 캐릭터가 어떤 상태에 들어가 있는지 즉시 알 수 있는 정보가 있습니다.
심지어 인풋값도 알고 있어요. 이 두가지를 향상시키기 위한 머신러닝이 되면 그냥 가까운길을 놔두고 먼길을 돌아가는 것 같고. 이 부분이 머신 러닝 특성상 어느정도 데이터를 축적하게 되면 기형적으로 발전할거에요. 이기기 위한 짠손 남발. 아니면 시간 끝날때까지 굴러서 피하기 등등?
위에 본문의 짤도 상대방이 어떤 인풋을 입력했는지 다 알려주고 있어요

FSM의 단순한 패턴말고 더 다양한 경험을 사용자에게 제공해주자가 첫번째고
머신러닝을 격투게임과 같은 게임에서도 사용이 가능하다가 두번째

격투게임에서 이기기 위해 짠손 남발하면 리치가 긴 기술들 때문에 쉽게 파훼가 가능합니다.

시간끝날때까지 뻐튕기는건 실시간으로 처벌값을 줘서 가만히 있으면 손해보도록 세팅해서 이미 사전에 방지했습니다.
저 ai도 핵쓰는 것처럼 보고 막을수 있는 그런 반응속도는 없어요
사람처럼 이전에 학습한 데이터를 보고 ~~이런 인풋이 발생할것이다 예상하고 움직여야 해요
친구글 비밀글 댓글 쓰기

user error : Error. B.