Silverback9

#야생으로

Creative Coding 독학 제306일 2025년01월27일(월)

네~^^* 푸르스름한 아침입니다~^^*

노랗게 밝아지기 전에 얼른! 공부를 시작하겠습니다~^^*

푸른 공기를 노란 입자들이 조금씩 채워나가는 소리에 몸을 풀며 기다리고 계셔요~^^*

공부 정리해서 돌아올게요~^^* 쓩우웅~^^*

네~^^* fitness 적합성 수치가 선택 확률의 작용을 하는 함수를 예전에 만들어 보았던 기억을 되짚어 볼게요~^^*

아침이니까요~^^* 신선한 과일 드실래요~~^^*? 망고? 블루베리? 체리? 멜론? 사과?

이 프로그램을 공부하면서…왜 그런지 모르겠지만…정말…잘 작동된다는 것을…손으로 따라가 본 적이 있었어요…


const fruits = [
  { name: 'mango', score: 5 },
  { name: 'blueberry', score: 3 },
  { name: 'cherry', score: 1 },
  { name: 'melon', score: 7 },
  { name: 'apple', score: 1 }
];

function setup() {
  createCanvas(400, 300);
  background(0);
  let sum = 0;
  for (let i = 0; i < fruits.length; i++) {
    sum += fruits[i].score;
  }
  for (let i = 0; i < fruits.length; i++) {
    fruits[i].prob = fruits[i].score / sum;
    fruits[i].count = 0;
  }

  let melonCount = 0;
  for (let i = 0; i < 100000; i++) {
    let fruit = pickOne(fruits);
    fruit.count++;
  }
  //console.log(fruits);
}

function pickOne(list) {
  let index = 0;
  let r = random(1);

  while (r > 0) {
    r = r - list[index].prob;
    index++;
  }
  index--;
  return list[index];
}

이 때 우리가 공부했던 함수 pickOne()을 Travelling Salesman Problem에 맞게 수정하여 사용해 보면 어떨까요?

function nextGeneration() {
  var newPopulation = [];
  for (var i = 0; i < population.length; i++) {

    var order = pickOne(population, fitness); 

    newPopulation[i] = order;
  }
  population = newPopulation;
}
function pickOne(list, prob) {
  let index = 0;
  let r = random(1);

  while (r > 0) {
    r = r - prob[index];
    index++;
  }
  index--;
  return list[index].slice();
}
도시들을 모은 배열 cities의 구성요소의 인덱스를 모은 배열 order의 구성요소를 무작위로 섞어서 만든 population[i]들을 모든 배열 population과 각 population[i]의 적합성 값 fitness[i]를 모은 배열 fitness는 함수 pickOne()를 호출할 때 parameter가 되어 함수 pickOne() 내부에서 listprob로 작동합니다.  
그러면, 참 신기하게도, fitenss 값이 선택 확률로 작용하여, fitenss 수치가 높은 population[i]가 좀 더 자주 pick되어 newPopulation[i]에 저장될 것 같습니다. 
그러면~^^* fitness 수치가 전체적으로 좀 더 높은 newPopulation이 될 것 같은데요~^^*
그리고 이 newPopulation이 population으로 저장되어, 지금 세대보다 다음 세대는 전반적으로 fitness 수치가 높아질 것 같습니다~^^*

와우!!!

fitness 적합성 수치 향상이 이루어지는 세대교체!!! 완료!!!

네?

아!

음…

네..그렇네요…!!!

이전 세대 중 fitness 적합성 수치가 높은 개체가 좀더 많이 복사되어 새로운 세대를 이루게 되는 것이라서요~^^*, 새로운 세대의 fitness 적합성 수치는 전반적으로 높아지겠지만~^^*, 결국 이전 세대의 개체와 동일한 개체가 새로운 세대를 구성하고 있는 것이겠네요~^^*.

fitenss 값이 선택 확률로 작용하여~^^* 세대의 구성 비율이 달라질 뿐~^^*, 개체의 내부 속성은 동일할 것 같네요~^^*

음…~^^* 하…~^^*

그렇다면…~^^*

우리가 이제 해야 할 일은~~^^*???

그렇죠!!!!

mutation!!!! 돌연변이!!!!

개체의 내부 속성이 달라져야!!! 진정한 세대 변화!!!

오늘의 아쉬움은 내일을 추구할 동력!!!이 되어 줄 것 같아요~~^^*

오늘은, 구성 비율이 달라진 세대를 만들었고요~^^*

내일은, 개체 내부 속성도 달라진 세대를 만들어 볼까요~^^*

오늘 저와 함께 fitness 값이 선택 확률로 작용하는 weighted selection 가중선택 작업을 해내어 주셔서 감사합니다~^^*

내일은 개체 속성을 변화시키는 mutation 돌연변이 작업도 도전해 볼까요, 우리~~^^*

네~^^* 좋아요~^^* 고마워요~^^*

와우!

내일의 해가 뜨기를 기다리게 되네요!

개체 내부 속성도 변화된 순수한 세대 교체가 이루어 지는 날이 될테니까요!

네~^^*

오늘도 멋진 아침! 맛있는 점심!

해시계 한 바퀴 보람차게 도는 멋진 하루 보내시고요!

따뜻한 저녁 냠냠!

포근하고 깊은 밤 코~^^* 하셔요!

네~^^*

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

댓글 남기기