← AI 놀이터 홈으로

🧬 유전 알고리즘 — 진화로 답 찾기 (Genetic Algorithm)

정답도 기울기도 모를 때, 자연의 방법: 잘하는 놈을 골라(선택) 섞고(교배) 가끔 실수하게(변이) 두면 답이 진화합니다.

📖 따라하기 가이드 — 1 / 7 단계

Step 1. 다윈의 방법을 컴퓨터로

정답도 모르고 기울기도 없을 때, 자연은 어떻게 답을 찾을까요? 잘하는 개체를 골라 살리고(선택), 섞고(교배), 가끔 실수하게(변이) 두면 답이 진화해요. 경사하강법과 달리 기울기가 전혀 필요 없다는 게 핵심! 화면에서 맨 위 큰 글자는 지금 세대의 1등 문장이에요 — 초록은 목표와 맞은 글자, 빨강은 틀린 글자예요. 그 아래에는 상위 8개체, 맨 아래 그래프는 세대별 적합도(맞은 글자 수)예요.
🏆 지금 세대의 1등 (목표: 인공지능은 정말 재미있다!)
···
👥 인구 미리보기 — 상위 8개체
(인구 생성 중...)

가로축은 세대, 세로축은 적합도(목표와 맞은 글자 수)예요. 초록 선은 세대별 최고 적합도, 회색 선은 인구 평균이에요. 초록 선이 점선(만점)에 닿으면 완성! 변이율이 0%면 어느 높이에서 딱 멈추고, 너무 높으면 만점 근처에서 요동치는 걸 볼 수 있어요.

🎛️ 진화 조종하기

목표 문구14/30자

2~30자. 바꾸면 처음부터 다시 진화해요.

📊 지금 상태

세대 수
0
최고 적합도
0 / 14
평균 적합도
0.0
돌연변이율
3%

적합도는 목표와 같은 위치에 같은 글자가 있는 개수예요. 최고 적합도가 글자 수와 같아지면 진화 완료!

🧮 수식과 파이썬

선택 → 교배 → 변이 → 반복
미분도 수식도 없이, '더 나은 것을 남긴다'는 규칙 하나로 답을 찾아요
🐍 파이썬 코드로 보면? (펼치기)
import random

TARGET = "인공지능은 정말 재미있다!"
POOL = list(set(TARGET + "가나다라마바사아자차카타파하 !?.,"))  # 목표 글자가 꼭 들어가야 해요
POP, MUT = 120, 0.03

def fitness(ind):                        # 적합도 = 위치가 맞는 글자 수
    return sum(a == b for a, b in zip(ind, TARGET))

pop = ["".join(random.choices(POOL, k=len(TARGET))) for _ in range(POP)]

for gen in range(100000):
    pop.sort(key=fitness, reverse=True)          # ① 선택: 잘하는 순 정렬
    if fitness(pop[0]) == len(TARGET):           # 완성되면 종료
        print(f"{gen}세대: {pop[0]}"); break
    elite = pop[: POP // 4]                      # 상위 25%만 생존
    children = list(elite)
    while len(children) < POP:                   # ② 교배: 부모 둘 섞기
        a, b = random.sample(elite, 2)
        cut = random.randrange(1, len(TARGET))
        children.append(a[:cut] + b[cut:])
    pop = ["".join(random.choice(POOL) if random.random() < MUT else c
                   for c in ind) for ind in children]   # ③ 변이: 가끔 실수