[게임 AI만들기 3. 세상에서 가장 어려운 게임 6편] '세상에서 가장 어려운 게임'을 AI가 클리어 하는 것을 목표로 합니다. 일단 내가 깰 수 있어야 AI도 깰 수 있다는 생각을 가지고, 우선 내가 게임을 클리어 한 후 AI를 만들어 AI가 클리어 하는 과정을 보여드리겠습니다.
7:50 그러면 보상을 계속 연산하지말고 처음에 연산한 뒤에 그 값을 저장해서 보상해야 할때마다 그 값을 불러오면 이미 연산 되어 있으니 연산시간은 안걸리겠고 불러오는 시간과 그걸로 결론 내리는 시간정도만 걸릴텐데 그럼 보다 빨라지지 않을까요? //아 근데 보상체계 바꾸셨네 의미 없겠군 ㅋㅋ 14:12 님 보상체계상 실시간으로 보상하는데 이렇게 보상을 짜면 깨려고 움직이는 A.I는 처벌받아서 A.I는 걍 아무 움직임도 안하거나(=가만히 있어도 처벌x) 왔다 갔다만하면서 무의미한 움직임(=가만히 있을때도 처벌)만하고 결국 학습은 망할거 같음. 근데 이걸 해결하려고 다음과 같은 방법을 도입하면... 1. 다른 보상방식(거리, A*, etc)을 도입하면 역팩맨 보상이 의미 없음 2. 코인을 일정갯수까지는 가산을 주고 그 이후부턴 감점->A.I가 뻘짓하며 의미 없는 짓을 그대로 할 가능성이 있음. A.I에게 DNA 개념과 돌연변이 개념을 부여하고 그에 따라 행동하겠끔하면(=신경망을 유전) 돌연변이를 통해 해결할 가능성이 높지만, 시뮬 시간이 미쳐 날뛸 가능성이 높음. 심지어는 이 '일정갯수'라는것도 시작할때 연산해야 하는데 "이건 또 어떻게 연산할건데?" 라는 문제가 발생함. 3. 코인을 많이 먹게 하는식으로 반전시켜버리면 A.I가 맵의 모든곳을 돌아다닐거임. 물론 그러면 공맞고 죽을 가능성이 높으며 깰수는 있어도 매우 비효율적으로 깰거임. 근데 님은 이걸 원하지 않을거임. 4. 반복동작을 일정 횟수 이상 연속으로 하면 감점->이 경우 A.I가 뻘짓하다 쬐끔 움직이고 뻘짓하다 움직이고 그럴거임(=가만히 있는것도 동작으로 취급), 이는 깰 가능성이 존재는 하지만 매우 비효율적이고(=님은 이걸 원하지 않음) 죽을 가능성이 극도로 높음(Why? 움직이고 멈추니까. 파란공 지대로 간 뒤에 멈추면 죽을거임.) 5. 기타 등등의 방식-> 내가 아이디어를 떠올리지 못해서 다른 방법이 있으면 "그게 이 보상체계에 의미가 있는가?" 와 "이 보상체계의 특징인 'A.I가 움직이지 않거나 뻘짓함'을 해결 할수 있는가?" 그리고 "그게 효율적인 움직임을 이끌어 내는가?"를 모두 따져야 할것임. 왜냐면 해결방안은 이 보상체계의 단점을 보완하고자 하는것이기 때문. 1~4번중 가장 가능성 높은것은 2번임... 이상 지나가는 중2였고 시뮬레이션 잘 되시길 바라며 이 의견은 지극히 주관적인 뇌피셜임을 밝힙니다.
13:58 이 부분을 좀 더 다듬어서 하면 다른 걸 추가하지 않고 AI로 가능하지 않을까 싶네요. 보상 = (움직인 거리 - 죽음 패널티 * 죽은 횟수 + 클리어 점수)/측정 시간 이렇게 잡는다면 클리어 점수를 크게 잡으면 점점 죽지 않고 최대한 빠르게 클리어 하는 방향으로 학습되지 않을까 싶습니다. 초반엔 그냥 아무렇게나 움직이기만 해도 점수가 오르니까 개꿀 할 수 있는데 그러다가 1번 클리어를 하면 그때부턴 그 클리어 했을 때의 점수를 그냥 움직이는 것 만으론 따라 잡을 수 없게 될테니 그때부턴 최대한 짧은 시간으로 클리어 하는 방향으로 학습이 시작 될거라 생각해요. 중간중간 코인을 먹어야 하는 구간에선 코인을 먹으면 점수를 주고, 모든 코인을 먹고선 목적지에 도달 해야 점수가 오르게 하면 될 거 같네요.
모든 영상 구경 하고 왔네요. 보면서 좀 더 다듬어 봤는데 1. 있던 곳에 머물고 있을 경우 패널티(한 곳에 최대한 오래 있지 못하도록 하는 설계) 2. 갔던 곳을 다시 갈 경우 패널티(지속적으로 같은 곳을 오락가락 하는 걸 막기 위한 설계) 3. 코인을 먹을 경우 이동했던 부분 초기화(돌아가야 하는 맵도 존재 하기 때문에 이를 위한 설계) 4. 최종 점수는 걸린 시간으로 나누기(장시간 생존 할 경우 점수가 낮아지게 하는 설계) 5. 이동 거리가 길수록 점수 증가(최대한 많이 이동하도록 설계) 6. 클리어 보상을 크게 줄 것(클리어를 최종 목표로 잡게 하기 위한 설계) 7. 죽을수록 패널티 증가(이 부분은 정확한 이유가 있진 않지만 추측으로 넣은 것으로 사망 패널티가 초기에 낮게 설정 되어 있다면 그냥 맞아 죽더라도 멀리 가도록 학습이 될 수도 있는데 여기서 점점 패널티가 커진다면 그렇게 학습 된 모델이 현재의 방식을 반복 해봤자 점점 점수가 낮아지니 다른 방향으로 진행하지 않을까 싶어서 넣어봤습니다.)
우연히 영상 보고 재미있는 것 같아서 두서없이.. 의견 몇개 남겨봅니다..! 실제 구현이 가능한지는 모르게써여 헤헤 1. 공간분석 매 라운드마다 패턴이 반복되어 가능합니다만, 새로운 단계에 들어서면 움직이지 않고 2가지 공간분석을 합니다. 첫 번째로 공간 종류를 정하고, 두번째로 공간에 점수를 스스로 부여합니다. 첫 번째, 공간 종류는 [벽, 가만히 있어도 죽지 않는 세이프존, 위험존]으로 나뉩니다. 두 번째, 공간에 점수를 스스로 부여하는데 위험존에만 점수를 할당합니다. 위험존 내 인게임 격자 한 칸마다 각각 점수를 부여합니다. 이 때, 점수가 실시간으로 변동되는 것이 포인트입니다. 점수를 할당할 칸은 위험존이기 때문에 필연적으로 파란 공이 지나가게 되는데, 각 칸에서의 점수는 파란공이 지나간 후 제일 높고, 서서히 점수가 떨어지게 세팅합니다. 한 칸에서의 점수는 일정한 주기를 가지며 매겨질 것입니다. 2. 움직이기 모든 칸의 점수가 일정한 주기로 파악되었다면 움직일 수 있습니다. 이때, ai는 세이프존 - 위험존 - 세이프존 - 위험존 순서로 움직여야 합니다. 와리가리 하지 않도록 방금 탈출한 세이프존은 벽이 됩니다. 큰 목표는 모든 세이프존을 밟는 것입니다. 위험존에서 움직일 때는 주변 8칸중에 현재 자신이 있는 칸의 점수보다 높은 칸으로 이동하며, 특정 점수 이하의 칸에 있지 않도록 합니다.(확킬당하기때문) 3. 클리어? 패턴이 반복되는 게임에서 ai라면, 헬퍼처럼 절대 죽지 않는 경로를 알고 무빙이 가능하지 않을까 하여 고민해봤습니다. 빠르게 클리어 하는 것 보다, 일단 클리어를 해야 기록 단축이 가능할거같다는 그런생각이 들었습니다..! 화이팅!!
해외 학습 알고리즘 영상들 보니까 처음 테스트 돌릴때 수백개를 동시에 무작위 방법으로 이동을 시키고 오래 살아남거나 멀리간 애들은 학습이 되어 살아남은 애들 기준으로 새로운 테스트를 해서 무작위 수백개 돌리고 또 살아남은걸로 돌리고 하던데 아마 마지막까지 살아남은걸 채택하는게 보상에 관한게 아닐까 하는데 그 보상이란거를 매 움직임이 아니라 마지막 도착지 기준으로 하면 어떨까요
저도 그렇게 하면 좋겠지만, 그런 방법은 게임을 코드 단에서 제어가 가능할 때 가능한 방법이라고 생각해요! 지금 제가 하는 방식으론 불가능한 방법이라 ㅜㅜ.. 세상에서 가장 어려운 게임 자체가 현재 활성화되어 있는 게임만 움직여지는 거라 1개를 키건, 10개를 키건 움직일 수 있는건 활성화되어있는 창 1개이고, 그리고 창을 100개를 키더라도 키보드로 하나를 움직이면 100개가 모두 똑같이 움직일거고 그래서 코드단에서 제어가 가능해서 100개를 따로따로 움직이게 할 수 있는게 아니면 조금 힘들더라고요ㅠㅠ
경기에서 각 수마다 실시간 보상을 주지 않고, 경기가 끝난 후 전체 스텝에 해당한 보상을 역전파해주는 건 어떨까요? 노란 코인 먹는 거는 차원을 다르게 해서 (안전구역과의 최대한 가까워진 거리, 코인 먹었는지 유무, 얼마나 많은 스텝을 소비했는지)에 차원에 따라서 다르게 보상을 주면, 모델은 무조건 코인을 먹는 방향으로, 최단 스텝 출력으로 손실을 최소화할 테구요. 목표구역에 도달해서 거리를 최소화하고, 코인 먹고, 최단 스텝으로 클리어 하게요.
길찾기 알고리즘을 먼저 계산한 이후, 일직선으로 갈수 있는 지점을 계산하는 식의 방법은 어떨까요? 예를들어, 길찾기 알고리즘을 이용하여 계산한 경로에서 아래로 내려간 후 오른쪽으로 전진한다면, 우선적으로 오른쪽으로 꺾이는 그 지점까지는 일직선으로 갈 수 있으니, 그 지점을 목표로 하여 학습을 수행하고, 그 지점이 근접한다면 다음 지점으로 향하도록 한다면 벽이나 장애물에 의해 거리측정에 오류가 생기지 않을 것 같네요. 실시간 처리가 아닌 한번만 길찾기를 하여도 되니 시간적인 딜레이도 문제가 없을 듯 하구요. 그렇게 학습하도록 기본적으로 유도한 후, 코인 또는 파란색 장애물 등의 계산을 추가적으로 수행하게 한다면 길찾기 관련 문제는 없을것 같다는 생각이 드네요. 예 : ■ | •------------◇ | | • ----------• 네모가 시작위치, 선이 경로, 마름모가 최종 목적지라고 하고, 경로가 다음과 같이 계산됬다면, 우선 첫번째 "•" 가 있는 위치로 이동하도록 학습을 진행합니다. 거리에 따른 보상 등의 결과도 여기에 포함되겠죠. 만약 첫번째 지점까지 도달하는 안전한 경로를 학습하는데 성공하였다면, 그다음 일직선으로 갈 수 있는 지점을 목표로 학습합니다. 이런식으로 순차적인 목표를 둔다면, 목적지까지와의 거리가 반드시 멀어져야 하는 구간도 큰 영향 없이 학습할 수 있을 것입니다. 코인이 있다면 경로 알고리즘을 이용하여 코인을 획득하는 최단 경로를 계산하면 되겠죠. 저도 학습 관련해서는 만져본적 없는 사람입니다만, 이렇게 의견 남깁니다. 꼭 좋은 결과가 있길 바라며, 제 의견이 도움이 되었으면 좋겠습니다.
좋은 의견 감사합니다! 사실 저도 생각했던 방법이 이거였어요!! 1탄 기준으로 A*알고리즘을 사용해서 90도 꺾인 부분을 거쳐서 가는걸 학습하자고 생각했었는데 하지 않은 이유가 뭐냐면 2탄 같은 경우 시작점, 코인, 도착점이 일직선상에 있는데, 2탄은 일직선상으로 경로를 짜면 클리어가 불가능하기 때문에... 2탄과 같은 문제가 생겨서 포기했었어요 ㅜㅜ