오늘은 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 작업까지 함께 해내어 주셔서 더욱 감사합니다~^^*
내일 우리 한 발짝 더 나아가 볼까요, 함께요~^^*?
밤이 많이 깊었네요~^^*
오늘 하루도 수고 많으셨어요~^^*
새근새근 거리며 꿈꾸는 가슴을 토닥토닥 안고서, 코~^^*하셔요~^^*
네~^^* 꿈은 이루어 집니다~^^*
댓글 남기기