Silverback9

#야생으로

Creative Coding 독학 제281일 2024년01월02일(목)

오늘은 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~~!!!

편안한 저녁과 따뜻한 밤 보내시기 바래요~!

우리 내일 또 만나서 코딩공부 이어갈까요~~^^*

네~~^^* 꿈은 이루어 집니다~~^^*

댓글 남기기