Silverback9

#야생으로

Creative Coding 독학 제303일 2025년01년24일(금)

오늘은 fitness 적합성에 대해 고민해 보는 날이예요~^^*

Travelling Salesman Problem을 해결해 보기 위해서는~^^*

최.적.경.로.를 찾기 위해서는~^^*

어떤 fitness 적합성이 필요할까요~^^*?

우리 충분히 긴 시간을 두고 고민을 천천히 해 볼까요~~^^*

충분히 긴 시간을 고민해 보고 우리 오늘 밤에 다시 만날까요~~^^*

왜냐면요~~^^*

네~~^^*

제가 마법의 양탄자를 타야 해서요~~^^*

닫힌 곳에서도 공간감을 즐기고~^^*

오래된 소리에 신선한 요소를 담아서 즐기고~^^*

탁 트여 말문이 막히는 장관을 앞에 두고 여유롭게 건반을 두드리고~^^*

깊은 산 계곡은 오히려 아늑한 공간임을 새삼스럽게 느끼며~^^*

땅 위에서 하늘 위에서 물 위에서 지금 어디이든지 멋진 하루를 보내어 보는 거예요~^^*

오늘 멋진 아침 맛있는 점심 보람찬 하루 따듯한 저녁 누리시고요~^^*

저는 밤에 다시 돌아올게요~^^* 쓩우웅~~^^*

네~^^* 깊은 밤이 되어 가네요~^^* 즐거운 하루 보내셨나요~^^*?

낯선 창가에 앉아 코딩 공부를 시작합니다~^^*

꽃밭에 앉아서 예쁜 고양이와 놀고 계셔요~^^* 공부해서 돌아올게요~^^* 쓩우웅~^^*

네~^^* Travelling Salesman Problem을 Genetic Algorithm으로 해결해 보려고 할 때, fitness 적합성은 무엇에 대한 것일까요~^^*

음…우리가 최종적으로 최.적.경.로. 가장 거리가 짧은 여정을 찾는 것이니까요….

네!!! “거리”가 “적합성”에 관련되어 있는 것 같아요!!!

거리는 짧으면 짧을 수록 좋은 것이 되니까요….

거리값이 작을 수록 fitness 값이 클 수 있겠네요. 음…반비례 관계라고 할까요?

그러면~~^^* “적합성 = 1/ 거리값”의 관계를 설정해 보면 어떨까요?

아참!! 그리고…만의 하나…도시들을 무작위로 생성했음에도 불구하고 시들이 모두 같은 위치에 생성될 경우가 있을 수도 있으니…

그러면 도시들 사이의 거리는 “0”이 되어서 “1/0″은 “무한대”가 되어 버리게 되니…

그 경우를 대비하여~^^* 거리값에 1을 더한 후, 적합성과 반비례 관계로 설정하면 어떨까요?

fitness = 1 / (d + 1);

네~^^* 그럼 거리를 구하는 함수를 먼저 준비해 보겠습니다~^^*


function calcDistance(points, order) {
  var sum = 0;
  for (var i = 0; i < order.length - 1; i++) {
    var cityAIndex = order[i];
    var cityA = points[cityAIndex];
    var cityBIndex = order[i + 1];
    var cityB = points[cityBIndex];
    var d = dist(cityA.x, cityA.y, cityB.x, cityB.y);
    sum += d;
  }
  return sum;
}
//도시들의 모음 배열 points[]의 구성요소의 인덱스의 모음 배열 order[]의 구성요소인 order[i]가 가리키는 도시와 order[i+1]이 가리키는 도시 사이의 거리 d를 구하여, 총거리 sum에 더합니다. 
//모든 도시 간의 거리의 총합 sum을 반환합니다.  

이제 fitness 값을 계산하는 함수도 준비해 볼까요~^^*

const fitness = [];
//적합성 수치들의 모음 배열입니다. 

let recordDistance = infinity;
//recordDistance는 지금까지의 도시 경유 거리의 총합 중 가장 짧은 거리값을 의미합니다. 
//프로그램을 시작할 때, 도시들 사이의 거리의 총합 중 가장 짧은 거리값을 무한대로 설정해 놓겠습니다.
//최.적.경.로. 즉 거리의 총합이 가장 작은 경로를 찾아나가는 작업이라서,
//거리의 총합은 시작할 때 가장 크고, 점점 줄어들게 될 것 같습니다. 
//그러나, 도시들의 위치가 무작위로 생성되기 때문에, 최초의 거리의 총합값은 미리 알 수가 없습니다.
//가장 큰 값이지만 미리 알 수는 없는 값이기 때문에, infinity 무한대로 설정하고, 프로그램을 시작하겠습니다~^^*

let bestEver;
//현재 기준 도시들 사이 거리의 총합이 가장 짧은 도시 경로의 인덱스 모음 배열을 가리키도록 하겠습니다. 

function calcFitness() {
  for (let i = 0; i < population.length; i++) {
    const d = calcDistance(cities, population[i]);
    //도시들 사이이 거리의 총합을 계산하는 calcDistance를 호출하여 return받은 값을 변수 d에 저장합니다.
    
    if (d < recordDistance) {
      recordDistance = d;
      bestEver = population[i];
    }  
    //가장 짧은 경유 거리 기록이 갱신되면, 이때의 인덱스 모음인 population[i]를 bestEver로 저장합니다.
    
    fitness[i] = 1 / (d + 1);
    //이때의 fitnes[i]는 거리 d + 1과 반비례 관계입니다. 
  }
}

이제, 이 fitness 값이 상대적 값의 성격을 띄도록 해 보겠습니다~^^* Normalize~~^^*

function normalizeFitness() {
  let sum = 0;
  for (let i = 0; i < fitness.length; i++) {
    sum += fitness[i];
  }
  for (let i = 0; i < fitness.length; i++) {
    fitness[i] = fitness[i] / sum;
  }
}
//fitness 적합성 수치들을 모두 더하여 변수 sum에 저장합니다. 
//fitness[i]를 sum으로 나누어 다시 fitness[i]에 저장합니다.
//fitness[] 구성요소들 사이의 우열관계는 유지되지만, 서로의 값의 크기에 영향을 주고 받아 서로 상대적 값을 가지게 될 것 같습니다. 

네~^^* 오늘 저와 함께 fitness 적합성에 대해 고민해 주셔서 감사합니다~^^* normalize 작업까지 함께 해내어 주셔서 더욱 감사합니다~^^*

내일 우리 한 발짝 더 나아가 볼까요, 함께요~^^*?

밤이 많이 깊었네요~^^*

오늘 하루도 수고 많으셨어요~^^*

새근새근 거리며 꿈꾸는 가슴을 토닥토닥 안고서, 코~^^*하셔요~^^*

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

댓글 남기기