오늘은 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();
}
와우! 우리가 또 하나의 동영상 강의를 마무리해내었어요~^^* 이 동영상 강의에서는 얼굴 모양에 대한 프로그램을 보여주고 있지만~^^* 그 작동원리는 우리가 공부한 프로그램의 것과 같아서 편안하게 시청하실 수 있을 것 같아요~~^^*
오늘 저와 함께~^^* Weighted Selection 가중선택과 Interactive Selection 상호작용선택 알고리즘을 기반한 프로그램 공부를 마무리해 주셔서 감사합니다~^^*
크리스마스 날 공부 한 편을 마무리하니, 뜻 깊게 느껴져서 신기하기도 하고 많이 많이 감사한 마음도 들어요~~^^*
응애응애~ 이 세상 속으로 힘차게 태어나신 예수님처럼~^^*
우리도 힘차게 또 새로운 한 해 속으로 태어나면 좋겠어요~^^*
오늘도~^^* 새 날 누리시며~^^*
큰 기쁨 나누는 보람찬 하루 되시기 바래요~^^*
따뜻하고 편안한 밤 코~ 보내시고요~^^*
우리 내일 또 만날까요~~^^* 새로운 도전 또 해보는 거예요~~!!! YEAH~~!!!
네~~!!! 꿈은 이루어 집니다~~!!!
댓글 남기기