Silverback9

#야생으로

Creative Coding 독학 제308일 2025년01월29일(수)

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

코딩 공부 업로드를 기다려 주셔서 감사합니다~^^*

아우! 정오가 다 되어 가네요~^^*

오늘도~^^* 반가운 만남 기쁨 나누는 보람찬 하루 보내시고요~^^*

뿌듯한 가슴 토닥토닥 코~^^* 하시기 바래요~^^*

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

댓글 남기기