82 플래피 버드 AI (Flappy Bird AI)
플래피 버드(Flappy Bird) 게임을 위한 인공지능(AI)을 설계해 봅시다. Q-Learning, NEAT(NeuroEvolution of Augmenting Topologies) 등 다양한 강화 학습 알고리즘을 사용하여 새가 파이프 사이를 완벽하게 통과하도록 훈련시키는 것이 목표입니다.
이 프로젝트는 머신러닝의 기초와 게임 환경에서의 의사 결정 과정을 익히기에 최적입니다. 사람보다 훨씬 더 정교하게 게임을 플레이하는 AI를 만들어 보면서, 신경망(Neural Network)이 어떻게 학습하고 진화하는지 직접 경험해 보세요.
82.1 주요 개발 포인트
- 강화 학습 알고리즘: Q-Learning이나 NEAT를 활용하여 보상과 벌칙을 기반으로 학습시킵니다.
- 게임 환경 시뮬레이션: AI가 학습할 수 있도록 게임의 물리 엔진(중력, 충돌 등)을 구축합니다.
- 입력 데이터 (Sensor Data): 새의 높이, 다음 파이프와의 거리, 파이프 사이의 간격 등을 AI의 입력값으로 제공합니다.
- 보상 시스템 설계: 파이프를 통과하면 보상을, 충돌하면 벌칙을 주어 점수를 최적화합니다.
- 세대 진화 (Evolution): NEAT 알고리즘을 사용할 경우, 가장 우수한 개체를 선택하고 번식시켜 성능을 개선합니다.
82.2 Python 구현 예시 (NEAT-Python을 이용한 신경망 입력 구조)
# 실제 실행을 위해서는 neat-python 라이브러리가 필요합니다.
# import neat
class FlappyBirdAI:
"""
플래피 버드 AI의 학습과 실행을 관리합니다.
"""
def __init__(self, bird_pos, pipe_pos, pipe_gap):
self.bird_y = bird_pos[1]
self.pipe_x = pipe_pos[0]
self.pipe_y_top = pipe_pos[1]
self.pipe_y_bottom = pipe_pos[1] + pipe_gap
def get_inputs(self):
"""
AI 신경망에 전달할 입력 데이터를 계산합니다.
"""
# 1. 새의 Y 좌표
# 2. 위쪽 파이프와 새의 거리
# 3. 아래쪽 파이프와 새의 거리
inputs = (
self.bird_y,
abs(self.bird_y - self.pipe_y_top),
abs(self.bird_y - self.pipe_y_bottom)
)
return inputs
def decide_jump(self, output):
"""
신경망의 출력값에 따라 점프 여부를 결정합니다.
"""
# 출력값이 0.5보다 크면 점프(Jump) 실행
if output > 0.5:
print("AI: 점프 수행!")
return True
return False
if __name__ == "__main__":
# 가상의 게임 데이터로 테스트
bird = (50, 200) # (x, y)
pipe = (300, 150) # (x, y_top)
gap = 100
ai = FlappyBirdAI(bird, pipe, gap)
data = ai.get_inputs()
print(f"AI 입력 데이터: {data}")
# 가상의 신경망 출력값 (학습이 완료되었다고 가정)
test_output = 0.7
ai.decide_jump(test_output)