Silverback9

#야생으로

Creative Coding 독학 제328일 2025년02월18일(화)

오늘은 vehicle 부족의 후세에 대해 공부하기 시작하는 날~^^* Yeah~^^*

선조의 자취를 부드럽게 섞어 만든 상큼한 음악 스무디를 마시며 아침을 시작하고 계셔요~^^* 공부 정리해서 돌아올게요~^^*

네~^^* 이제 후세를 만들어 보겠습니다~^^*

이번에는, 전체 후세 군집을 생성하는 것이 아니라 개별 선조 vehicle을 복제한 vehicle을 만들어 보도록 하겠습니다~^^*

복제? 그렇죠~~^^* clone 클론~~~^^* 이라는 용어가 떠오르네요~^^*

태초의 vehicle 부족의 개체가 0.002의 확률로 자신을 복제하여 후손을 생산하도록 해 보겠습니다.

 clone() {
    if (random(1) < 0.002) {
      return new Vehicle(this.position.x, this.position.y, this.dna);
    } else {
      return null;
    }
  }

음…clone() 함수를 만들고 보니, class Vehicle 정의의 argument 인자를 개선해야 할 것 같네요. 함수 clone()을 호출할 때, 위치좌표 뿐만 아니라 dna도 parameter 매개변수로 넘겨주어야 하니까요!

그러면, 이제 class Vehicle은 dna를 선조로부터 물려 받을 수도 있고, 자신이 태초의 선조가 되어 dna을 처음 구성해 낼 수도 있어야 하겠네요~^^*

그럼, class Vehicle의 argument 인자 정의 부분과 dna 생성 부분을 개선해 보겠습니다!

class Vehicle {
  constructor(x, y, dna) {
      .
      .
      .

    this.dna = [];
    if (dna === undefined) {
      //dna가 정의되어 있지 않으면, 즉 자신이 태초의 vehicle이면
    
      this.dna[0] = random(-2, 2);
      this.dna[1] = random(-2, 2);
      this.dna[2] = random(0, 100);
      this.dna[3] = random(0, 100);
      //food와 poison에 대한 감정기억, food와 poison에 대한 인식 범위를 설정합니다. 
    } else {
      //그렇지 않다면, 즉 이미 정의된 dna을 받았다면
      //즉, 선조 vehicle의 clone 복사체라면 
     
      this.dna[0] = dna[0];
      this.dna[1] = dna[1];
      this.dna[2] = dna[2];
      this.dna[3] = dna[3];
      //선조가 가지고 있던 
      //food와 poison에 대한 감정기억과 인식범위를 그대로 물려받겠습니다. 
     
    }
  }
   .
   .
   .
}

와우!!! Evolution 진화 끝~~~~^^*!!!!

이라고 개운하게 외치기에는….

음…..

네???

아….

그렇네요!!!!

mutation 돌연변이 과정이 아직 남아있네요!!!

그래요!!! 선조랑 많이 닮았지만 살짝 다른 후세가 나와야 더 자연스러울 것 같아요!!!

네~^^* 그럼 mutation rate 돌연변이 확률을 0.01로 잡아보겠습니다~^^*

0.01 확률로 dna구성요소들이 선조의 dna 구성요소들과 살짝 달라지도록 해 보겠습니다!

그럼, dna 정의 부분을 한 번 더 개선해 볼게요~~^^*

var mr = 0.01;
//mutation rate 돌연변이 확률을 0.01로 설정해 보겠습니다. 

class Vehicle {
  constructor(x, y, dna) {
    

    this.dna = [];
    if (dna === undefined) {
    
      this.dna[0] = random(-2, 2);
      this.dna[1] = random(-2, 2);
      this.dna[2] = random(0, 100);
      this.dna[3] = random(0, 100);

    } else {
      //선조로부터 미리 정의된 dna을 물려 받으면
      this.dna[0] = dna[0];
      if (random(1) < mr) {
        this.dna[0] += random(-0.1, 0.1);
      }
      this.dna[1] = dna[1];
      if (random(1) < mr) {
        this.dna[1] += random(-0.1, 0.1);
      }
      this.dna[2] = dna[2];
      if (random(1) < mr) {
        this.dna[2] += random(-10, 10);
      }
      this.dna[3] = dna[3];
      if (random(1) < mr) {
        this.dna[3] += random(-10, 10);
      }
      //선조의 dna 구성요소들을 그대로 물려받되
      //dna 구성요소들을 각각 0.01 확률로 살짝 변화시켜 보겠습니다. 
    }
        .
        .
        .
  }
        .
        .
        .
}

그럼 이제 무한반복 메인 함수인 draw()에 복제 작업문을 첨가해 보겠습니다~!

function draw() {
   .
   . 
   .
  for (let i = vehicles.length - 1; i >= 0; i--) {
    vehicles[i].boundaries();
    vehicles[i].behaviors(food, poison);
    vehicles[i].update();
    vehicles[i].display();

    const newVehicle = vehicles[i].clone();
    if (newVehicle != null) {
      vehicles.push(newVehicle);
    }
    //복제 함수 clone()을 호출하여 반환된 값이 null이 아니면, \
    //즉, 복제된 후세 vehicle이 생성되었다면
    //이 복제된 vehicle을 vehicle 부족에 넣습니다. 

    if (vehicles[i].dead()) {
      const x = vehicles[i].position.x;
      const y = vehicles[i].position.y;
      food.push(createVector(x, y));
      vehicles.splice(i, 1);
    }
}

네~^^* 태초의 vehicle 부족 개체들이 개별적으로 0.002 확률로 자신의 dna와 위치 좌표를 그대로 복제하여 후세에게 전해주는데, 이 후세는 전달받은 dna의 각 구성요소를 각각 0.01 확률로 살짝쿵 돌연변이 하여, 선조와 매우 닮았지만 살짝 다른 자신만의 dna을 갖추고, vehicle 부족의 생태계 안에 태어납니다~^^* 귀여운 후세님들을 만나러 저와 함께 가 보시죠~~^^*

오늘 저와 함께 선조 개체와 매우 닮았지만 살짝쿵 다른 후세를 탄생시키기 위해 dna 복제-돌연변이 작업을 해 주셔서 감사합니다~^^*

내일은~^^* 우리~^^* 좀더 많은 선조들이 오래 살아가고 그래서 좀더 많은 후세들이 대를 이어 자신들의 서식처를 누릴 수 있도록 환경 요소들을 개선해 볼까요~^^* 그리고~^^* 필요에 따라서 인식범위 레이더를 볼 수도 있고 안 볼 수도 있도록 프로그램을 개선해 보면 어떨까요~^^*

네~^^* 좋아요~^^* 고마워요~^^*

삶의 터전을 열심히 가꾸어 내신 선조들의 얼을 본받아,

때때로 힘들 땐 서로 돕고,

매일 열심히 자신의 꿈을 향해 씩씩하게 나아가며,

자신이 누리게 된 이 자유로움을 굳건히 지켜내는,

멋진 후세들을 내일 우리 또 만나보면 좋겠어요~^^*

오늘도 멋진 아침, 맛있는 점심, 따뜻한 저녁 드시고요!

보람찬 하루 끝,

피곤 녹이는 깊고 편안한 잠 코~^^* 하시기 바래요~^^*

네~! 꿈은 이루어 집니다~!!!

댓글 남기기