오늘은 교차작업과 돌연변이생성작업을 해 보도록 하겠습니다~^^*
공연 1 작품 편안하게 감상하고 계셔요~^^* 코딩 공부 정리해서 돌아올게요~^^* 쓩~~
네~^^* 와우…!! 교차작업을 코드해 보는 것도 내용이 참 많아지는 것 같아요….오늘은 우리 교차작업 공부만 해보면 어떨까요….?
아 네^^* 이해해 주셔서 감사합니다~^^*
그럼 교차작업 공부에만 집중해 볼게요~~^^*
하나. 함수 DNA()가 recursive 재귀 작용을 가질 수 있도록 바꾸어 보았습니다. 함수 DNA가 새로운 DNA 생성하기 위해 자기자신을 호출하도록 해 보겠습니다.
(1) 맨처음 생성되는 DNA는 무에서 창조되므로, 무작위벡터를 생성해서 크기를 0.1로 고정하는 기존의 방식으로 만들어 보고요.
(2) 교차 작업을 하여 만들어진 genes 정보를 가진 새로운 DNA를 만들기 위해서 자기 자신을 호출할 때는 genes를 argument로 전달하겠습니다. 그래서 자기자신이 자기자신으로부터 genes를 parameter로 전달받아 새로운 DNA의 genes인 this.genes에 저장하겠습니다.
이때, 교차작업은요…0과 genes 배열 전체 크기값 사이의 무작위 수를 생성하여, 그것을 교차중간점으로 삼아 앞부분은 this.genes의 내용을 뒷부분은 partner.genes의 내용을 새로운 배열 newgenes에 담겠습니다. 그런 후 이 newgenes의 내용을 담은 새로운 DNA를 생성해 보겠습니다.
function DNA(genes) {
if(genes) {
this.genes = genes;
} else {
this.genes = [];
for(var i = 0; i < lifespan; i++) {
this.genes[i] = p5.Vector.random2D();
this.genes[i].setMag(0.1);
}
}
this.crossover = function(partner) {
var newgenes = [];
var mid = floor(random(this.genes.length));
for(i = 0; i < this.genes.length; i++) {
if(i > mid) {
newgenes[i] = this.genes[i];
} else {
newgenes[i] = partner.genes[i]
}
}
return new DNA(newgenes);
}
}
둘. 함수 Rocket()도 dna 정보를 받을 수 있도록 수정해 보겠습니다.
(1) 로켓에 아직 dna 정보가 없는 경우, 함수 DNA()를 호출하여 dna를 생성하여 자신의 dna인 this.dna에 저장하구요.
(2) dna 정보를 전달받아 로켓을 생성할 경우 전달받은 그 정보를 this.dna에 담겠습니다.
function Rocket(dna) {
this.pos = createVector(width/2, height);
this.vel = createVector();
this.acc = createVector();
if (dna) {
this.dna = dna;
} else {
this.dna = new DNA();
}
this.fitness = 0;
.
.
.
}
셋. 함수 Population에 내부 함수 selection을 만들어 담아 보겠습니다.
(1) matingpool 후보자군에서 무작위로 뽑은 두 개의 로켓의 dna인 partnerA와 partnerB를 교차하여 만들어진 새로운 dna를 변수 child에 담겠습니다.
(2) 함수 Rocket을 호출하면서 child( 교차하여 만들어진 dna 정보)를 argument로 넘겨줍니다.
(3) 생성된 Rocket들을 배열 newRocket[]에 담습니다.
(4) 배열 newRocket을 this.rockets에 저장하여, rockets교체를 이루어 냅니다.
function Population () {
.
.
.
this.selection = function() {
var newRockets = [];
for (var i = 0; i < this.rockets.length; i++) {
var parentA = random(this.matingpool).dna;
var parentB = random(this.matingpool).dna;
var child = parentA.crossover(parentB);
newRockets[i] = new Rocket(child);
}
this.rockets = newRockets;
.
.
.
}
넷. 메인 함수인 draw()에서
(1) population.evaluate()를 호출하여, 로켓들의 fitness 값 계산과 maxfit값 계산과 fitness 값에 대한 normalize 작업과 matingpool 후보자군 생성을 하겠습니다.
(2) population.selection()을 호출하여, matingpool 후보자군에 들어간 rocket들의 dna를 교차하여 만든 dna를 가진 새로운 Rocket들의 집합을 만들겠습니다.
function draw() {
.
.
.
count++;
if (count == lifespan) {
population.evaluate();
population.selection();
count = 0;
}
.
.
.
}
네~^^* 교차작업만으로도 내용이 풍성한 것 같아요~~^^*
오늘 저와 함께 유전자 crossover 교차작업 공부를 마무리 해 주셔서 감사합니다~^^*!!
우리 내일은 과연 이 코드작업이 성공적으로 수행되는 지 실험을 먼저 해 볼까요? 궁금하시죠~~^^* 네~~^^* 저도 궁금해요~~^^*
그럼 우리~~^^* 내일 또 만나는 거예요~~^^* YEAH~~^^*
우와 지금 11:11이예요! 천사가 우리 곁에 있음을 다시 한 번 일깨워 주시네요~~^^*
오늘도 점심 맛있게 드시고요!
보람찬 하루 보내시고요!
편안한 저녁과 따듯한 밤 보내시기 바래요!!
네~^^* 꿈은 이루어 집니다~~^^*
댓글 남기기