Silverback9

#야생으로

Creative Coding 독학 제260일 2024년12월12일(목)

오늘은 표현형 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에 대한 기본 이해가 조금씩 단단해 지면 좋겠어요~~^^*

그러면 우리 스스로 멋진 프로그램을 만들어 볼 수도 있겠지요?

그때까지 코드 분석 공부를 계속 이어나가 보면 어떨까요~~^^*

끈기있게 기초 공부를 하다 보면 더 높은 봉우리도 올라갈 수 있을 거예요~~^^*

오늘도 멋진 아침 여시고요~!

맛있는 점심 드시고요~!

즐거운 하루 보내시고요~!

따뜻하게 코~~^^* 하셔요~~^^*

네~~^^* 꿈은 이루어 집니다~~^^*

댓글 남기기