Silverback9

#야생으로

Creative Coding 독학 제268일 2024년12월20일(금)

오늘은 Weighted Seletion 가중선택 두 번째 삽을 뜨는 날이예요~^^*

그런데요~^^*

제가 지금 이동을 하고 있어서요~^^*

코딩 공부 정리는 오늘 밤에 올리도록 할게요~^^*

와우! 아주 멋진 Friday Night 금욜밤이 될 것 같은데요~~^^*

이동하면서 우리 음악 같이 들을까요~~^^* Live로 우리 함께 해요~~^^*

오늘은 크리스마스가 되기 5일 전이네요~^^*

숫자 5는 힘! 완전함!을 의미한다고 해요~^^*

숫자 5! 사랑과 존중의 힘! Power of Love! 으로 가득찬 크리스마스가 되면 좋겠어요~^^*

힘 있는 하루 보내시고요~^^* 저는 밤에 다시 돌아올게요~^^* 쓩~~

즐거운 금요일 보내셨나요~^^* 벌써 밤이 많이 깊어졌어요~^^*

이제 코딩 공부 해 볼게요~^^*

어쩌면 좀 있다 밤 12시 종이 칠지도 모르겠어요~^^*

지금 신데렐라는 유리구두를 신고 왈츠를 추고 있겠네요~~^^* Friday Night~~^^*

호박마차가 잘 대기하고 있기를 바라며, 우리는 코딩 공부를 해 볼까요~^^*

네~^^*

오늘은 무작위 수를 뽑았는데 확률을 반영한 선택을 하게 되는 새로운 알고리즘을 공부해 볼까해요~^^*

이 알고리즘은~^^* 군집 배열을 새로 만들지 않아도 되고요~^^* 무작위 수를 두 번 생성하지 않아도 된다고 해요~^^*

방법은 엄청 간단한데요~~^^* 왜 이렇게 하면 확률에 기반한 선택이 되는지는 쉽게 이해되지 않을 수도 있을 것 같아요…

그래도 일단~^^* 이 알고리즘을 핵심 코드를 이해해 볼게요~^^*

function pickOne(list) {

  let index = 0;
  //변수 index는 군집의 몇 번째 구성요소인지를 나타내는 기능을 합니다. 
  
  let r = random(1);
  //0과 1 사이 무작위 수를 뽑아 변수 r에 저장합니다. 

  while (r > 0) {
    //r이 0보다 클 동안 아래 작업들을 반복합니다.  
   
    r = r - list[index].prob;
    //r에서 군집의 index번째 구성요소의 확률을 빼어 다시 r에 저장합니다. 
    
    index++;
    //index에 1을 더합니다. 
  }
  //r이 0보다 작거나 같으면 반복구문을 빠져 나옵니다. 

  index--;
  //index에 1을 뺍니다.
  //반복문을 빠져나오기 직전에 
  //index를 1 증가시키고 아무 일도 없었기 때문에,
  //반복문을 빠져 나온 후 
  //index를 1 감소시켜야 올바른 순번표시 역할을 할 수 있을 것 같습니다.  
 
  return list[index];
  //군집의 index번째 구성요소를 return 반환합니다. 
}   

너무 간단해서 많이 헷갈릴 수도 있을 것 같아요…

그래서…손으로 과정을 따라가 보았는데요…오우..정말..확률대로 선택이 되는 것 같아요.

한 번 살펴 보실까요~^^*

그럼 전체 코드를 우리 함께 살펴 볼까요~^^*

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

function setup() {
 
  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;
  }

  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];
}

콘솔창에 나오는 통통한 삼각형 모양 화살표를 누르시면~^^* 각 Object 객체 별 Score, Prob, Count 를 보실 수 있어요. 확률에 따라 선택이 되어 Prob와 Count가 비례 관계인 것이 보이시나요~^^*

왜 이렇게 작동되는지는 잘 모르겠지만, 작동이 되는 것을 손으로 따라가며 확인해 보니, 많이 신기하기도 하구요. 맨처음 누가 어떻게 생각해낸 알고리즘인지도 궁금해 지네요~^^*

와우~~^^* 우리가 또 하나의 도전을 해낸 것이기도 하네요~^^*

9 – 8 Genetic Algorithm: Improved Pool Selection 동영상 강의 내용을 마무리 해내었습니다~~^^*

밤 열두 시가 넘었네요. 신데렐라가 무사히 집에 도착했기를 바래요~^^*

무도회의 기억을 가슴에 품고 눈 말똥말똥 뜨고 침대에 누워 있을 것 같아요~^^*

호박마차를 몰고 온 생쥐 마부들도 쥐구멍에 들어가 코~ 단잠에 들겠네요^^*

우리도 이제 하루를 마무리 해 볼까요~~^^*

오늘 저와 함께 Weighted Selection 가중선택 알고리즘을 살펴봐 주셔서 감사합니다~^^*

따뜻한 밤 조용한 밤 보내시고요~^^*

그리고 우리 내일 또 만나요~^^* 네~^^* 새로운 도전이 또 우리를 기다리고 있어요~^^*

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

댓글 남기기