[박테리아]학습중

이 프로젝트는 인공지능 커뮤니티 Gurugail(http://gurugail.com )에서의 개인프로젝트로 진행하는 것입니다.
========================================================================================================

학습을 시켜봤습니다.

아직 완전히 마음에 드는 성능은 안나오지만.. 대충 비슷한 형태는 나오는 군요.

#인터페이스

전체적인 인터페이스입니다.

아래쪽 화면에는 시간, 전체성능, 최고점수로봇의 성능, 선택된 로봇의 성능,
그리고 선택된 로봇의 유전자정보가 나옵니다.

각행은 로봇의 상태이고,
각열은 그 상태에서 다른 로봇의 신호에 대해 어떻게 반응할건지에 대한 가중치들입니다.

행방향으로 순서대로 검은색, 빨간색, 초록색, 노란색 상태를 나타내며
열방향으로 순서대로 검은색, 빨간색, 초록색, 노란색 상태의 다른 로봇에 대한 가중치와, 랜덤벡터에 대한 가중치, 관성벡터에 대한 가중치를 나타냅니다.


#유전자알고리즘
-돌연변이
전체 로봇군집의 점수가 낮을 수록 돌연변이가 많이 일어나며, 각 로봇의 돌연변이율은 해당로봇이 전체의 점수에 얼마나 기여했는가에 따라서 한번 더 계산됩니다. 즉, 점수가 낮을 수록 돌연변이가 많이 일어납니다.
돌연변이는 자신의 현재상태에 대한 가중치들에만 나타나도록 했습니다.

돌연변이확률은 다음과 같이 계산됩니다.
Mutation(MaxMutateRate*(exp(-(double)totalscore/(double)(NumBot*10000))*(1-(double)score/(double)totalscore)));

-교배
교배의 확률은 로봇의 나이가 많고 점수가 낮을 수록 다른 로봇과 교배할 확률이 높도록 하였으며,
교배를 하기로 결정된 로봇은 로봇군집의 전체점수에 대한 각 로봇들의 점수의 비율이 높을 수록 높은 확률을 갖도록 교배대상를 선택합니다.
교배방식은 두 로봇의 유전자값에 각 로봇의 점수와 나이를 가중치로 주어 평균내는 식으로 처리하였고,
교배된 로봇은 새로운 유전자로 교체된 뒤 나이가 1이 됩니다.

교배확률은 다음과 같이 계산됩니다.(exp_const는 exponential함수에 의한 감쇠정도를 조절하기 위한 상수값)
MaxReconRate*(1-exp(-age)) * (exp(-score/totalscore/exp_const));

#결과
바닥에 놓여진 목표물의 총수는 1000개이며,
이 중 90%가 획득되면 목표물과 로봇의 위치를 초기화시키는 식으로 학습을 진행하였습니다.
다음은 각 환경상태에 따른 로봇의 행동특성이 잘 보이게 화면을 캡쳐한 모습입니다.


Group 1, Spread 200 에 대한 학습결과


Group 3, Spread 100 에 대한 학습결과


Group 10. Spread 50 에 대한 학습결과


Group 30, Spread 1000 에 대한 학습결과


목표물이 뿌려진 정도에 따라 적당한 크기의 그룹을 이루는
그럭저럭 원하는 형태의 모습을 보여주고 있습니다만,
직접 값을 지정했을 때에 비해서 약간 낮은 정도의 효율을 보이고 있습니다.


#문제점
돌연변이, 교배의 확률이 너무 높아서인지 학습을 오래진행하다보면 로봇의 행동이 다시 엉터리가 되는 경우가 자주 발생하는군요.
그렇다고 확률을 낮추면 학습속도가 떨어지기 때문에
적당히 학습률을 가변시켜갈 수 있는 방법을 고려해보아야할 것 같습니다.

그리고 가끔 검은색의(아무것도 발견하지 못한) 로봇들이 서로 뭉쳐있는 경우가 있고,
경우에 따라서는 초록색들이 뭉쳐있는 상태에서 몇대의 로봇만이 목표물을 획득하고 다시 초록색의 덩어리로 돌아오는 식으로 행동할 때가 있습니다.


이런식으로, 혼자 살짝 먹고 무리로 돌아와서 안먹은척하는 -_- 모습을 보일 때가 종종 있는데요,

이런식으로 동작하는 유전자가 전체에 퍼지게 되면 몇대의 로봇만이 계속 목표물을 먹기 때문에..
유전자알고리즘이 어디까지나 '상대적으로' 점수가 높은 로봇을 좋은 유전자로 고려하기 때문에 생기는 문제라고 할 수 있겠습니다.

이 문제 때문에
돌연변이율을 전체 군집의 점수에 따르게 했고,
로봇이 목표물을 획득했을 때 외에도 초록색이거나 빨간색일때에 대해서도 약간의 점수를 부여해봤지만,
근본적인 해결책은 못되는 것 같더군요.

지금은 처음에 비해서 이런 경우가 많이 줄었지만 아직도 가끔은 이럴 때가 있습니다.


해결방법 중 하나는 벡터에 대한 가중치들의 방향은 고정시키고 크기만 학습시키는 건데... 그러면 동작의 자율성이 떨어질 것 같아서 좀 망설여지는군요.

핑백

  • 狂工之道 : 사기꾼의 유전자. 2008-07-11 19:21:44 #

    ... 박테리아 수준의 상호관계의 창발을 시뮬레이션하는 겁니다만, 이 원시적인 수준의 상호관계에서도 이미 '사기꾼'이 생겨난다는 경악할만한 결과가 나왔지요. 관련 포스팅은 여기 -> 링크 위의 그림을 보시면.. 기본적으로 어떤 로봇이 목표물(화성에서 물이나 금속이라든가.. 청소로봇이라면 쓰레기 정도)의 덩어리를 찾았을 때, 로봇이 다른 로봇을 불러들여서 ... more