오늘은 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);
}
}
오늘 저와 함께 선조 개체와 매우 닮았지만 살짝쿵 다른 후세를 탄생시키기 위해 dna 복제-돌연변이 작업을 해 주셔서 감사합니다~^^*
내일은~^^* 우리~^^* 좀더 많은 선조들이 오래 살아가고 그래서 좀더 많은 후세들이 대를 이어 자신들의 서식처를 누릴 수 있도록 환경 요소들을 개선해 볼까요~^^* 그리고~^^* 필요에 따라서 인식범위 레이더를 볼 수도 있고 안 볼 수도 있도록 프로그램을 개선해 보면 어떨까요~^^*
네~^^* 좋아요~^^* 고마워요~^^*
삶의 터전을 열심히 가꾸어 내신 선조들의 얼을 본받아,
때때로 힘들 땐 서로 돕고,
매일 열심히 자신의 꿈을 향해 씩씩하게 나아가며,
자신이 누리게 된 이 자유로움을 굳건히 지켜내는,
멋진 후세들을 내일 우리 또 만나보면 좋겠어요~^^*
오늘도 멋진 아침, 맛있는 점심, 따뜻한 저녁 드시고요!
보람찬 하루 끝,
피곤 녹이는 깊고 편안한 잠 코~^^* 하시기 바래요~^^*
네~! 꿈은 이루어 집니다~!!!
댓글 남기기