오늘은 2025년 첫 평일이네요~^^*
어제의 휴식이 새로운 에너지를 주는 날이기를 바래요~^^*
씩씩한 행진곡 한 곡 듣고요~~^^*
신년 음악회 공연 1 작품 편안히 감상하고 계셔요~^^* 코딩 공부해서 다시 돌아올게요~^^* 쓩~~^^*
네~~^^* 어제 함수 map()이 최소 – 최대 구간 설정 범위를 넘어선 수를 어떻게 처리하는지 궁금해 하며 공부를 마쳤는데요~^^*
오늘 이렇게 테스트를 해보았어요~^^*
function setup() {
createCanvas(400, 400);
var a = map (-3, 0, 10, 10, 0);
var b = map (0, 0, 10, 10, 0);
var c = map (10, 0, 10, 10, 0);
var d = map (13, 0, 10, 10, 0);
print(a, b, c, d);
var e = map (0, 0, width, width, 0);
var f = map (100, 0, width, width, 0);
var g = map (400, 0, width, width, 0);
var h = map (500, 0, width, width, 0);
var i = map (800, 0, width, width, 0);
print(e, f, g, h, i);
}
function draw() {
background(220);
}
그랬더니 결과가요~^^*
13 10 0 -3
400 300 0 -100 -400
지정된 범위를 넘어선 수는, 수의 사이 간격을 유지하면서 지정된 범위를 넘어서서 mapping 작업을 해 주는 것 같아요~^^*
그래서, 화면 밖으로 사라지는 로켓의 경우, fitness 수치가 마이너스 값이 나올 수 있을 것 같아요… 우리가 설정한 width의 값보다 더 큰 값의 거리값이 생길 수도 있을 것 같거든요…
var d = dis(this.pos.x, this.pos.y, target.x, target.y);
this.fitness = map( d, 0, width, width, 0);
나중에 이 fitness 값을 가장 큰 fitness 값인 maxfitness 값으로 나누어서 normalize 정규화를 해 보려고 하는데요… 마이너스 값의 fitness의 경우는 여전히 마이너스 상태를 유지하게 될 것 같아요… 그런데 이 normalized 정규화된 fitness 값을 바탕으로, 후보자 군집에 몇 번 반복해서 넣을 것인가를 결정할 예정이라… 마이너스 값이 입력 반복 횟수를 결정하는 확률로 작용한다는 것이 좀 그런 것 같아요…
음…그래서…저는 함수 map에 구간을 정해줄 때 <<0에서 width*2 사이 구간>>을 지정해 보겠습니다. 그러면, 화면 밖으로 사라져서 목표물과의 거리가 width보다 더 크게 되는 로켓의 경우도 fitness 값이 양수일 수 있을 것 같거든요.
그래서~~^^*
var d = dis(this.pos.x, this.pos.y, target.x, target.y);
this.fitness = map( d, 0, width*2, width*2, 0);
이렇게 되면, fitness값 추출과정에서 normalize 정규화 작업도 함께 이루어진다고는 말할 수 없을 것 같네요~^^*
그냥, 목표물과 가까운 로켓은 fitness 적합성 값이 크고 목표물과 먼 로켓은 fitness 적합성 값이 작아지는 효과만 있을 것 같습니다…
일단 저는 이렇게 가보겠습니다~~^^*
function Rocket() {
.
.
.
var this.fitness = 0;
.
.
.
this.calcFitness = function () {
var d = dist(this.pos.x, this.pos.y, target.x, target.y);
this.fitness = map( d, 0, width*2, width*2, 0);
}
.
.
.
}
그럼 이제,
(1) 전체 로켓들의 fitness 값들을 비교해 보면서, 최대값을 찾아 maxfitness로 만들어 보겠습니다.
(2) 각 로켓들의 fitness 값을 maxfitness 값으로 나누어 다시 fitness값으로 저장하여, fitness 값이 0에서 1 사이의 상대값을 갖도록 하겠습니다. Normaize!! 정규화!! YEAH!!
(3) 후보자들을 저장하는 배열 matingpool을 준비하여,
(i) 후보자군을 한 번 만들 때마다 새롭게 깨끗하게 비운 후 작업을 시작하겠습니다.
(ii) 각 로켓의 fitness 값에 100을 곱하여 그 값만큼 반복해서 후보자군 배열 matingpool에 더하겠습니다. fitness 값이 0이면 0개 fitness 값이 1이면 100개가 matingpool에 들어가겠네요~^^* 그럼 나중에 무작위로 뽑더라도, fitness 값이 선택확률 역할을 하는 효과가 생기겠지요~~^^*
function population () {
.
.
.
this.matingpool= [];
.
.
.
this.evaluate() = function(){
var maxfit = 0;
for(var i = 0; i < popsize; i++) {
this.rocket[i].calcFitness();
if (this.rocket[i].fitness > maxfit) {
maxfit = this.rocket[i].fitness;
}
//fitness 값 중 최대값을 maxfit에 저장합니다.
for(var i = 0; i < popsize; i++) {
this.rocket[i].fitness /= maxfit;
}
//각 로켓의 fitness 값을 maxfit 값으로 나누어 다시 저장하여, 0에서 1사이 범위로 normalize 정규화하겠습니다.
this.matingpool = [];
for(var i = 0; i < popsize; i++) {
var n = this.rocket[i].fitness * 100;
for(var j = 0; j < n; j++) {
this.matingpool.push(this.rocket[i]);
}
}
//후보자군 만들기 작업할 때마다 후보자군 배열 matingpool을 깨끗하게 비워서 사용하겠습니다.
//각 로켓들의 fitness 값에 100을 곱하여, 0 - 1 범위를 0 - 100 범위로 늘여보겠습니다.
//0 - 100 범위의 fitness 값만큼 반복해서 rocket[i]을 후보자군 matingpool에 녛어보겠습니다.
.
.
.
}
네~~^^*
오늘 함수 map()가 지정 구간 범위를 넘어선 수를 어떻게 처리하는 지를 확인해 보았습니다~^^*
그리고, fiteness 값을 normailze 정규화하여 이 값이 선택확률로 작용할 수 있도록, 후보자군 배열에 fitness*100회 반복하여 담아보았습니다~^^*
오늘도 저와 함께 함수 map()에 대한 고민을 마무리해내고, normalized 정규화된 fitness 적합성 수치를 바탕으로 후보자군 배열 matingpool에 로켓들을 담아주셔서 감사합니다~^^*
오늘도 점심 맛있게 드시고요~!
2025년 첫 평일 활기차고 보람있게 보내시고요~! Reboot~~!!!
편안한 저녁과 따뜻한 밤 보내시기 바래요~!
우리 내일 또 만나서 코딩공부 이어갈까요~~^^*
네~~^^* 꿈은 이루어 집니다~~^^*
댓글 남기기