1

저는 인간의 플레이어가 유전 알고리즘과 신경 네트워크로 구동되는 인공 지능 제어 로봇에 배치되는 게임 (기본적으로 Agar.io 클론)을 만들었습니다.유전 알고리즘을보다 효율적으로 만들려면 어떻게해야합니까?

문제는 제 알고리즘이 효율적이지 않다고 생각합니다. 나는 그들의 체력 기능으로 랭킹 된 10 개의 봇을 가지고 있는데, 그것은 살아남습니다. 그들의 유전자는 -1과 1 사이의 실수로 구성됩니다.

최저 체력부터 최고 체력까지 n 개의 봇을 5 개 봇으로 가져 와서 현재 가중치를 취하여 가우시안 수에 (10^-n). 부동 소수점 숫자로 크로스 오버를 수행하는 데 어려움을 겪었습니다. 따라서 나는 이런 종류의 돌연변이만을했습니다.

분명히, AI는별로 지능이 없습니다.

알고리즘을 개선하려면 어떻게해야합니까? https://github.com/jadenyjw/evo/blob/master/core/src/com/evo/game/stages/GameStage.java

+1

이것은 주제가 아닙니다. 어쩌면 http://codereview.stackexchange.com/ 시도하십시오 – httpNick

+0

@httpNick 감사합니다 그것을 밖으로 시도합니다. –

+0

작업 코드 (이 게시물에 포함되지 않음)에 대한 동료 검토를 요청하기 때문에이 질문을 주제와 관련이없는 것으로 닫으려고합니다. [codereview.se]에 더 적합 할 수 있지만 여기서는 코드 자체에서 코드를 기대합니다. 오프 사이트 위치의 코드는 향후 오프라 인 위치가 오프라인, 이동, 삭제 등의 이유로 사용할 수없는 경우 향후 독자에게 가치가 없습니다. –

답변

0

Agar.io 마리오 AI와 같은 다른 인공 지능 대회에 필적 : 필요한 경우 소스 코드의 대부분이있는 곳 여기

이다. 문제는 많은 다른 문제 해결 기법이 허용되며, 신경 진화, 유전 프로그래밍 및 매 쉬인 학습은 초보자를 위해 매우 쉽게 구현할 수 있다는 것입니다. 불행히도 이러한 봇을 일정 수준 이상으로 지능적으로 확장 할 수는 없습니다. 왜냐하면 유전 프로그래밍 자체가 잘못된 길이기 때문입니다. 더 나은 솔루션은 모든 지능 수준까지 확장 할 수있을뿐만 아니라 "진화의 인공 지능"이라고 불리는 CPU 전력을 덜 사용하는 Scripting AI입니다.

소스 코드에 대해 자세히 살펴 봅니다. 처음에는 수입 진술에 따르면 "Encog Framework"가 사용되었습니다. 저것은 GPU 계산을 지원하고 저 pybrain와 유사한 저명한 기계 학습 도서관이다. 최상의 매개 변수를 사용하더라도 Encog는 사람 플레이어를 상대로 승리 할 준비가 된 에이전트를 처음부터 생성 할 수 없습니다. 그러나 이러한 종류의 최적화 알고리즘이 실제 문제에 적합하지 않다는 것을 증명하는 것이 좋습니다.

+0

예, 진화하는 AI를 스크립팅하는 것이 옳습니다. 그러나 신경 네트워크에 대한 몇 가지 비디오에 흥미를 느낀 후에 이것을 학습 경험으로 다루고 싶었습니다. –

+0

'''가장 좋은 매개 변수를 가지고 있더라도 Encog는 인간 선수를 상대로 승리 할 준비가되어있는 에이전트를 처음부터 생성 할 수 없습니다 .''' 나는 이것을 매우 의심합니다! 매우 일반적인 (그리고 유명한) [심지어 "깊이있는 학습을 통한 아타리 놀이"논문] (* https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf)은 일부 게임에 대한 인간적인 놀이를 능가했습니다 * (아마도 agar.io보다 더 복잡합니다).나는 GP에 대한 열렬한 팬이 아니지만 Q- 학습의 일부 형태 (근사 함수로서 encog-NN을 사용하는 것조차도)는 당신의 주장을 위조 할 잠재력이있다. – sascha

0

실제 숫자의 벡터를 사용하면 Differential Evolution을 시도 할 수 있습니다.

GA는 진화 알고리즘 계열의 일부입니다. DE는 솔루션 공간의 고가 영역을 효과적으로 탐색하지만 (로컬 미니 마에 붙어있는 일반적인 문제가 있습니다).

DE는 솔루션과 정보를 교환하므로 성능이 향상 될 수 있습니다.

마지막으로 DE에 대한 접근 방식을 변경하는 것은 비교적 간단합니다. 특정 돌연변이/교차 연산자 만 코딩하면됩니다.

0

두 봇 사이에 십자가를 수행하고 봇의 유전자 반을 무작위로 선택하고 다른 봇의 유전자 반을 반대로 선택하여 유전자 값을 보존 할 수 있습니다.예를 들어

, n와 유전자 :

For i from 0 to n-1 
    r = random interger number 
    If(r modulo 2 == 0) 
    gene[i] of new bot = gene[i] of bot number 1 
    Else 
    gene[i] of new bot = gene[i] of bot number 2 
    EndIf 
EndFor 

또한 두 개의 실수의 중간 값을 계산하여 "크로스"유전자 자체가 수

gene[i] of new bot = ((gene[i] of bot 1) + (gene[i] of bot 2))/2 

인구가 너무 될 수있다 아마도 100 개가 아닌 10 개가 아닌 더 나은 결과를 얻게 될지도 모르겠다. 아마 게임에서 허용하지 않으므로 아마도 더 많은 세대의 로봇을 위해 유전자 알고리즘을 실행할 필요가있을 것이다.

돌연변이에 대해서, 당신은 작은 돌연변이를하고 있습니다. 두 번째 돌연변이 형을 도입 할 수 있습니다. 완전히 새로운 무작위 실수로 완전히 새로운 유전자를 만들 수 있습니다. 즉, 이전의 유전자 값에 영향을받지 않습니다. 독립 변이 율에 의해 통제되는 거대한 변이.

일부 알고리즘은 돌연변이를 일으킬 수있는 유전자에 의해 제어되는 가변 돌연변이 속도를 가지고 있습니다. 따라서 작고 거대한 돌연변이에 대한 돌연변이 속도를 제어하는 ​​2 개의 유전자를 도입함으로써이를 테스트 할 수 있습니다. 그러나 그것이 작은 인구에 대한 효율적인 결과를 낼 수 있는지는 나는 알지 못합니다.

신경망에 관해서는 봇을 효율적으로 제어하기에 너무 많거나 충분한 뉴런이 없기 때문에 다른 레이아웃을 테스트 할 수 있습니다. 숨겨진 레이어의 수와 동일한 문제입니다.