Silverback9

#야생으로

Creative Coding 독학 제273일 2024년12월25일(수)

오늘은 Fitness 적합성 수치가 가장 높은 꽃의 특성이 다음 세대 꽃들의 전반적인 특성이 되는 과정을 코드를 통해 살펴 보기로 해요~~^^*

오늘은 크리스마스 되기 0일 전이예요~^^* 크리스마스 된 지 0일 후예요~^^*

0은 전과 후의 중심이 되는 신기한 수이기도 한데요~^^*

크리스마스 0일 전 크리스마스 0일 후인 오늘~~^^* 바로 크리스마스~~^^*

크리스마스 아침을 음악과 함께 여유있게 누리고 계시면, 코드 공부 정리해서 곧 돌아 올게요~^^* 쓩~~^^*

class Population {
  constructor(mutationRate, size) {
    this.mutationRate = mutationRate; // 돌연변이 확률
    this.flowers = []; // 현재 세대의 꽃들의 군집을 담는 배열
    this.matingPool = [];
    this.generations = 0; // 세대 표시
    for (let i = 0; i < size; i++) {
      this.flowers[i] = new Flower(new DNA(), 40 + i * 80, 120);
    }
  }

  show() {
    for (let i = 0; i < this.flowers.length; i++) {
      this.flowers[i].show();
    }
  }
  //모든 꽃들을 보여줍니다. 


  rollover(mx, my) {
    for (let i = 0; i < this.flowers.length; i++) {
      this.flowers[i].rollover(mx, my);
    }
  }
  // 군집 내 어느 꽃의 사각형 틀 영역 안에 마우스가 들어오면~~ 그 꽃의 fitness 적합성 수치를 올리는~~ 함수 this.flower.rollover()를 호출하네요~^^*
  // 군집 내 모든 꽃의 this.flower[i].rollover()를 호출하고 있네요~^^* 

  weightedSelection() {
    
    let index = 0;
    let start = random(1);
  
    while (start > 0) {
      start = start - this.flowers[index].fitness;
      index++;
    }
   
    index--;
    return this.flowers[index];

  }
  //군집의 구성요소들의 fitness 적합성 수치에 따른 가중선택을 합니다~^^*
  // 가중선택 알고리즘 복습이 필요하시다면~~ 클릭해 보셔요~~^^* 
  
 

  selection() {
  
    let totalFitness = 0;
    for (let i = 0; i < this.flowers.length; i++) {
      totalFitness += this.flowers[i].fitness;
    }
 
    for (let i = 0; i < this.flowers.length; i++) {
      this.flowers[i].fitness /= totalFitness;
    }

  }
  // 마우스가 꽃의 사각틀 영역 안에 들어있는 동안 fitness 값이 계속 증가하잖아요~^^* this.flowers[i].rollover()에 의해서요~^^*
  //이때의  fitness 적합성 수치는 절대값일텐데요. 
  //다른 꽃들의 fitness 적합성 수치에 비해서 얼마나 크나? 비교를 해서~
  //가장 fitness 적합성 수치가 큰 꽃의 특성을 다음 세대 꽃들의 전반적인 특성으로 물려주어야 하잖아요~^^*
  //그래서 꽃의 fitness 적합성 수치가 상대값 성격을 가질 필요가 있는 것 같아요~^^*
  //그래서요~~^^* 모든 꽃들의 fitness 적합성 수치를 합하여 totalFitness 값을 구하고요~~^^*
  // 꽃의 fitness 값을 totalFitness 값으로 나누어서 다시 꽃의 fitness 값에 저장을 해 보는 것이죠~^^*
  // 그러면 절대값 성격의 꽃의 fitness 값이 상대값 성격으로 바뀌게 될 것 같아요~^^* 


  reproduction() {
    let nextFlowers = [];
    // 자녀 세대를 담을 배열입니다. 
    
    for (let i = 0; i < this.flowers.length; i++) {
     
      let parentA = this.weightedSelection();
      let parentB = this.weightedSelection();
      //가중선택에 의해 부모 A, B를 뽑습니다. 
      
      let child = parentA.dna.crossover(parentB.dna);
      // 유전자 교차 작업을 하여 그 결과를 변수 child에 저장합니다. 
     
      child.mutate(this.mutationRate);
      //돌연변이를 일으킵니다. 

      nextFlowers[i] = new Flower(child, 40 + i * 80, 80);
      //child 유전자를 가진 Flower 객체를 생성하여 다음 세대 꽃 군집의 구성요소 nextFlowers[i]로 저장합니다. 

    }
    
    this.flowers = nextFlowers;
    // 다음세대 꽃 군집을 지금 세대 꽃 군집으로 삼습니다. 세대교체~
    
    this.generations++;
    //세대 표시 수치를 1 증가시킵니다~
  }
}

네~^^* 마우스가 오래 머무는 사각틀 영역 안의 꽃의 특성이 다음 세대 꽃의 전반적인 특성이 되는 과정을 코드를 통해 살펴 보았습니다~^^*

메인 함수는 간단하네요~^^*


let population;

function setup() {
  createCanvas(640, 240);
  colorMode(RGB, 1);
  let populationSize = 8;
  let mutationRate = 0.05;
  population = new Population(mutationRate, populationSize);
  button = createButton("evolve new generation");
  button.mousePressed(nextGeneration);
  button.position(10, 10);
}

function draw() {
  background(1);
  population.show();
  population.rollover(mouseX, mouseY);
  textAlign(LEFT);
  text("Generation " + population.generations, 12, height - 10);
}


function nextGeneration() {
  population.selection();
  population.reproduction();
}

우리 다시 프로그램을 플레이 해 볼까요~^^* 뭔가…눈에 보이지는 않지만~~ 화면 이면에서 작동되는 어떤 장치들이 어떻게 맞물려 돌아가고 있는지 이제 조금 느껴지지 않으셔요~^^*? 프로그램의 함수들이 서로를 호출하고 값을 return 반환하고 그 값을 또 자신의 일에 사용하고~~^^* 시계 이면에서 서로 긴밀하게 맞물려 부지런히 돌아가고 있는 수많은 톱니바퀴들처럼~~^^* 보이지는 않지만 마음으로 느껴지는 어떤 풍경이 이제 조금 느껴지는 것 같아서 신기해요~~^^*

와우! 우리가 또 하나의 동영상 강의를 마무리해내었어요~^^* 이 동영상 강의에서는 얼굴 모양에 대한 프로그램을 보여주고 있지만~^^* 그 작동원리는 우리가 공부한 프로그램의 것과 같아서 편안하게 시청하실 수 있을 것 같아요~~^^*

오늘 저와 함께~^^* Weighted Selection 가중선택과 Interactive Selection 상호작용선택 알고리즘을 기반한 프로그램 공부를 마무리해 주셔서 감사합니다~^^*

크리스마스 날 공부 한 편을 마무리하니, 뜻 깊게 느껴져서 신기하기도 하고 많이 많이 감사한 마음도 들어요~~^^*

응애응애~ 이 세상 속으로 힘차게 태어나신 예수님처럼~^^*

우리도 힘차게 또 새로운 한 해 속으로 태어나면 좋겠어요~^^*

오늘도~^^* 새 날 누리시며~^^*

큰 기쁨 나누는 보람찬 하루 되시기 바래요~^^*

따뜻하고 편안한 밤 코~ 보내시고요~^^*

우리 내일 또 만날까요~~^^* 새로운 도전 또 해보는 거예요~~!!! YEAH~~!!!

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

댓글 남기기