오늘은 Cross Over 교차 작업 하는 날~~^^* YEAH~^^*
빛와 어둠이 교차하며 흑백으로만으로도 화려함을 빚어내는 멋진 조명~^^*
밤의 어둠과 낮의 빛이 교차하는 아침을 시작하고 계셔요~^^*
저는 공부 정리해서 돌아올게요~^^* 쓩우웅~^^*
네~^^* 이번에 우리가 해내어 볼 Cross Over 교차작업은 이전의 교차작업과는 좀 다를 것 같아요.
이전 프로그램에서는…배열 A과 배열 B를 어떤 기준점 crossOverPoint 앞부분은 배열 A의 내용( 배열 A[0] ~ A[crossOverPoint] )으로 채우고 뒷부분은 배열 B의 내용( 배열 B[crossOverPoint + 1] ~ B[B.length – 1] )으로 채웠었지요?^^*
그래서 Cross Over 교차된 새로운 배열은~^^*
A[0], A[1] ..., A[crossOverPoint], B[crossOverPoint + 1], ..., B[B.length-1]
를 구성요소로 가지게 되었던 것 같아요.
근데요…
이때 A[0] ~ A[crossOverPoint] 부분과 B[crossOverPoint+1] ~ B[B.length – 1]사이에 같은 내용이 중복되어 있을 수도 있을 것 같아요.
이전 프로그램에서는 그런 중복 항목 발생이 문제가 되지 않았던 것 같구요…
그렇지만,
우리가 해결해 보려는 Travelling Salesman Problem은…배열의 구성요소의 내용이 중복되면 안될 것 같은 느낌이 들어요…
왜냐하면…배열 order의 구성요소의 내용은 도시의 인덱스를 가리키는데요…이것이 중복되면, 같은 도시를 또 찾아가는 경로 그러면서도 어떤 도시는 찾아가지 않는 경로가 만들어 질 것 같거든요…
그러면, 우리 Travelling Salesman! 소중한 보부상!의 사업에 지장이 있을 것 같아요!!!
그래서!!!
배열 A와 B를 교차하고자 할 때,
(1) 새로운 배열에 넣고자 하는 배열 A의 구성요소들을 먼저 선택한 후,
(2) 배열 B에서 이 구성요소들을 제외한 구성요소들을 선택하여
(3) 새로운 배열을 완성해 보겠습니다.
이때, 어떤 배열에 어떤 내용이 포함되어 있는가를 확인하는 단계가 필요할 것 같은데요. 이 작업을 해 줄 함수 includes()를 사용해 보겠습니다.
function crossOver(orderA, orderB) {
const start = floor(random(orderA.length));
const end = floor(random(start + 1, orderA.length));
const neworder = orderA.slice(start, end);
for (let i = 0; i < orderB.length; i++) {
const city = orderB[i];
if (!neworder.includes(city)) {
neworder.push(city);
}
}
return neworder;
}
// < 배열 orderA의 총 구성요소 갯수(orderA.lengrh) >와 < 0 > 사이의 무작위 값을 뽑아서 정수 부분만 취하여 변수 start에 저장합니다.
// < start + 1 >과 < 배열 orderA의 총 구성요소 갯수(orderA.length) > 사이의 무작위 값을 뽑아서 정수 부분만 취하여 변수 end에 저장합니다.
// 배열 orderA의 start번째 구성요소부터 시작해서 총 end 개의 구성요소를 복사하여 배열 neworder에 저장합니다.
// 배열 orderB의 구성요소를 orderB[0]를 변수 city에 저장합니다.
// 만약 새로운 배열 neworder에 변수 city의 값이 포함되어 있지 않다면, 이 city를 새로운 배열 neworder에 넣습니다.
//이 과정을 orderB의 모든 구성요소에 대해 작업합니다.
//이렇게 하면, 새로운 배열 neworder안에는 내용이 동일한 구성요소는 없게 되겠네요~^^*
//완성된 neworder를 return 반환합니다.
이 과정의 예시를 손그림으로 표현해 보겠습니다.

네~^^*
오늘 저와 함께 Cross Over 교차작업을 해내어 주셔서 감사합니다~^^*
우리 내일은 전체 코드를 모아서 프로그램을 한 번 가동시켜 볼까요~^^* 그리고, 좀더 다듬으면 좋은 부분이 보이면 성능도 향상시켜 볼까요~^^*
네~^^*
노트북 전원 문제로 노트북을 좀 쉬게 해 준 뒤 Reboot 하였더니, 아주 훌륭하게 잘 작동이 되네요~^^*
다시 생생해진 노트북 덕분에 공부 정리를 마무리 하였습니다~^^*
노트북아~~^^* You are so fresh~~^^*
코딩 공부 업로드를 기다려 주셔서 감사합니다~^^*
아우! 정오가 다 되어 가네요~^^*
오늘도~^^* 반가운 만남 기쁨 나누는 보람찬 하루 보내시고요~^^*
뿌듯한 가슴 토닥토닥 코~^^* 하시기 바래요~^^*
네~^^* 꿈은 이루어 집니다~~^^*
댓글 남기기