오늘은 표현형 Phenotype에 대해 공부해 보겠습니다~~^^* YEAH~~^^*
근데 참 신기한 것은요~~^^*
13일의 금요일이 내일인데요~~^^*
13이라는 숫자가 으스스하게 다가오지 않는 12일이예요~~^^*
크리스마스가 있는 12월의 12일이라서 그런 것 같아요~~^^*
달의 숫자와 날의 숫자가 같을 때, 우리 곁에 천사가 있다는 것을 알려주는 날이라고 하던데요~^^* 오늘도 우리 곁에 천사가 앉아 있을 것 같아요~~^^*
귀에 익숙한 노래를 입술에 익숙하게 담으며~^^*
오늘의 공부 Phenotype 표현형 시작해 볼까요~~^^*
Genotype 유전형은 클래스 DNA 의 genes[ ]에 새겨진 벡터 정보였었지요?
이 벡터 정보를 클래스 Rocket에서 표현하게 되는 것 같은데요~^^*
클래스 Rocket의 내장 함수 run()에서 그 작업이 이루어 지는 것 같아요~^^*
클래스 DNA의 genes[ ]의 구성요소의 정보 즉 회전각과 크기를 가진 벡터값을 실제 힘에 적용하는 것이죠~^^*
Rocket의 가속도 값을 변화시켜 Rocket의 움직임에 영향을 주게 될 것 같아요~^^*
그러면 Rocket의 움직임의 변화가 우리 눈에 보이기 때문에~^^*
DNA 내부의 유전 정보가 외부로 표현되었다~^^*가 되는 것 같구요~^^*
class Rocket {
constructor(pos, dna, totalRockets) {
this.acceleration = createVector();
this.velocity = createVector();
this.position = pos.copy();
this.r = 4;
this.dna = dna;
this.finishTime = 0;
this.recordDist = 10000;
this.fitness = 0;
this.geneCounter = 0;
this.hitObstacle = false;
this.hitTarget = false;
}
calcFitness() {
if (this.recordDist < 1) this.recordDist = 1;
this.fitness = 1 / (this.finishTime * this.recordDist);
this.fitness = pow(this.fitness, 4);
if (this.hitObstacle) this.fitness *= 0.1;
if (this.hitTarget) this.fitness *= 2;
}
run(os) {
if (!this.hitObstacle && !this.hitTarget) {
this.applyForce(this.dna.genes[this.geneCounter]);
this.geneCounter = (this.geneCounter + 1) % this.dna.genes.length;
this.update();
this.obstacles(os);
}
if (!this.hitObstacle) {
this.display();
}
}
checkTarget() {
let d = dist(
this.position.x,
this.position.y,
target.position.x,
target.position.y
);
if (d < this.recordDist) this.recordDist = d;
if (target.contains(this.position) && !this.hitTarget) {
this.hitTarget = true;
} else if (!this.hitTarget) {
this.finishTime++;
}
}
obstacles(os) {
for (let i = 0; i < os.length; i++) {
let obs = os[i];
if (obs.contains(this.position)) {
this.hitObstacle = true;
}
}
}
applyForce(f) {
this.acceleration.add(f);
}
update() {
this.velocity.add(this.acceleration);
this.position.add(this.velocity);
this.acceleration.mult(0);
}
display() {
let theta = this.velocity.heading() + PI / 2;
fill(200, 100);
stroke(0);
strokeWeight(1);
push();
translate(this.position.x, this.position.y);
rotate(theta);
rectMode(CENTER);
fill(0);
rect(-this.r / 2, this.r * 2, this.r / 2, this.r);
rect(this.r / 2, this.r * 2, this.r / 2, this.r);
fill(175);
beginShape(TRIANGLES);
vertex(0, -this.r * 2);
vertex(-this.r, this.r * 2);
vertex(this.r, this.r * 2);
endShape();
pop();
}
getFitness() {
return this.fitness;
}
getDNA() {
return this.dna;
}
stopped() {
return this.hitObstacle;
}
}
이제 우리는 적합성 Fitness 유젼형 Genotype 표현형 Phenotype이 로켓 프로그램에서 어떻게 적용되었는지를 모두 살펴 본 것 같아요~~^^*
코드 분석 작업 하나를 우리가 마무리 해내었네요~~^^* YEAH~~^^*
오늘 저와 함께 표현형 Phenotype에 대해 살펴봐 주셔서 감사합니다~~^^*
내일은 적합성 Fitness를 개선하는 방법에 대한 코드 분석 공부를 해 보도록 할게요~^^*
이미 만들어진 프로그램의 코드 분석을 계속 이어가고 있는데요~~^^* 이 과정을 통해 Genetic Algorithm에 대한 기본 이해가 조금씩 단단해 지면 좋겠어요~~^^*
그러면 우리 스스로 멋진 프로그램을 만들어 볼 수도 있겠지요?
그때까지 코드 분석 공부를 계속 이어나가 보면 어떨까요~~^^*
끈기있게 기초 공부를 하다 보면 더 높은 봉우리도 올라갈 수 있을 거예요~~^^*
오늘도 멋진 아침 여시고요~!
맛있는 점심 드시고요~!
즐거운 하루 보내시고요~!
따뜻하게 코~~^^* 하셔요~~^^*
네~~^^* 꿈은 이루어 집니다~~^^*
댓글 남기기