Silverback9

#야생으로

Creative Coding 독학 제247일 2024년11월29일(금)

오늘은 To be or not to be 문장 만들기(찾기) 프로그램을 알고리즘 단계별로 따라가며 이해해 보는 시간을 가져 보겠습니다~^^*

Genetic Algorithm의 Step 1 !!!

<SETUP>

Initialize: Create a population of N elements, each with randomly generated DNA

초기화 : 무작위로 생성된 DNA를 가진, N 개의 요소들의 군집을 하나 만들다

=> 하나의 군집 안에 N개의 개체들이 있는데, 이 각각의 개체들은 무작위로 생성된 DNA을 가지고 있습니다~~^^*

그럼 우리 함수 setup()의 Step 1 부분을 살펴 볼까요~^^*

function setup() {

  target = "To be or not to be."; //목표 문구입니다.
  popmax = 200;  //군집 크기는 200입니다.
  mutationRate = 0.01; //돌연변이 확률은 1퍼센트입니다.

  population = new Population(target, mutationRate, popmax);

}
네~^^* 메인 파일 sketch.js의 setup함수에서~^^* target 목표 문구, popmax 군집 크기, mutaionRate 돌연변이 확률을 클래스 Population 생성을 위한 argument로 넘겨 주어서, 새롭게 생성된 클래스 Population을 변수 population에 저장하게 되네요~^^*

클래스 Population의 구성체를 한 번 살펴 볼까요~~^^*

class Population {
  constructor(p, m, num) {
    this.population; // 현재의 군집
    this.matingPool; // 짝짓기 대상 후보자 모음
    this.generations = 0; // 세대
    this.finished = false; // 진화 종료 상태 표시 진리값
    this.target = p; // 목표 문구 
    this.mutationRate = m; // 돌연변이 확률
    this.perfectScore = 1; //  1점이 만점~^^*
    this.best = ""; //생성된 문구들 중 가장 좋은 문구

    this.population = []; //군집은 배열 형태로 준비합니다.

    for (let i = 0; i < num; i++) {
      this.population[i] = new DNA(this.target.length);
      //목표 문구의 길이를 가진 새로운 DNA를 population 군집 배열에 저장합니다.
    }

    this.matingPool = [];
     //짝짓기 대상 후보 모음도 배열 형태로 준비합니다.

    this.calcFitness();
     //적합도를 계산합니다.
  }
목표 문구 p와 돌연변이 확률 m과 군집 크기 num을 parameter로 넘겨 받아서 
클래스 population을 생성하는 구성체가 만들어 지네요^^*  

어머 그런데~^^* 클래스 DNA를 생성해서 population 배열의 구성요소로 저장하는군요!!

그럼 우리~~^^* 클래스 DNA의 구성체도 함께 살펴 볼까요~~^^*

class DNA {
  constructor(num) {
    this.genes = [];  // genetic sequence를 담는 배열입니다.
    this.fitness = 0; //적합도 입니다.
    for (let i = 0; i < num; i++) {
      this.genes[i] = newChar(); // 문자 Char를 무작위로 pick하여 this.genes의 i번째 구성요소로 저장합니다.  
    }
  }
네~^^* 클래스 Population 군집이, 목표 문구의 길이 this.target.length를 argument로 넘겨주며 클래스 DNA 생성을 호출하고, 클래스 DNA는 이 값 num을 parameter로 받네요.

num 수 만큼의 구성요소를 가진 배열 genes[]를 생성하게 되구요. genes[]의 구성요소들은 함수 newChar()를 호출하여 생성된 문자를 담게 됩니다. 

정리해 보면~^^* 목표 문구 길이를 가진 무작위 문자들의 배열이 클래스 DNA의 this.genes이네요^^*
 

네~^^* Setup에서 N개의 클래스 Population 군집을 호출 생성합니다. 이 N개의 클래스 Population 군집 각각은 또 M개의 DNA를 호출 생성합니다. 이 M개의 DNA 각각은 목표 문구 길이의 무작위 문자 배열을 생성합니다.

오늘 저와 함께 Genetic Algorithm Step 1 <<Initialize 초기화>>에 대한 코드 부분을 살펴봐 주셔서 감사합니다~^^*

내일은 우리, 클래스 Population 군집 구성체의 this.matingPool 배열과 this.calcFitness() 함수도 마저 살펴 볼까요~^^*

이미 완성된 코드를 분석한다는 것이 좀 막막했는데~~^^* 꼬리에 꼬리를 물고 이어지는 메인 파일과 클래스 파일들의 연결고리를 찾아~~^^* 차근차근 따라가니~~^^* 조금 이해가 되기 시작하는 것 같아서 다행스럽고 감사한 마음이 들어요~^^*

추운 겨울이 왔습니다~^^* 따뜻한 온기를 신기하게도 잘 찾아내어 귀여운 코를 코~하는 고양이들처럼~~^^* 따뜻한 점심~~^^* 따뜻한 차~~^^* 따뜻한 핫팩~~^^* 따뜻하게 하루 보내시기 바래요~~^^*

오늘도

점심 맛있게 드시고요!

멋진 하루 보내시고요!

우리 내일 또 만나요~~~^^*

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

댓글 남기기