import numpy as np
# 환경 설정
# 예: 1x5 그리드 월드
# 상태: 0, 1, 2, 3, 4 (S, F, F, F, G)
# 행동: 0 (왼쪽), 1 (오른쪽)
# 보상: 목표 도달 +1, 그 외 0 (간단화)
num_states = 5
num_actions = 2
# Q-테이블 초기화
q_table = np.zeros((num_states, num_actions))
# 하이퍼파라미터
learning_rate = 0.1 # 학습률 (α)
discount_factor = 0.9 # 감가율 (γ)
epsilon = 1.0 # 초기 epsilon 값
max_epsilon = 1.0 # 최대 epsilon 값
min_epsilon = 0.01 # 최소 epsilon 값
epsilon_decay_rate = 0.001 # epsilon 감쇠율
num_episodes = 1000
# 보상 정의 (간단화)
# rewards = { (state, action, next_state): reward_value }
# 또는 함수로 정의: get_reward(state, action, next_state)
# 여기서는 간단하게 목표 상태 도달 시 +1
goal_state = 4
# Q-러닝 알고리즘
for episode in range(num_episodes):
state = 0 # 시작 상태 (S)
done = False
while not done:
# Epsilon-greedy 행동 선택
exploration_exploitation_tradeoff = np.random.uniform(0, 1)
if exploration_exploitation_tradeoff < epsilon:
action = np.random.choice(num_actions) # 탐험: 무작위 행동 선택
else:
action = np.argmax(q_table[state, :]) # 활용: Q값이 가장 높은 행동 선택
# 행동 수행 및 다음 상태, 보상 관찰 (환경과의 상호작용)
# 이 부분은 환경 모델에 따라 달라짐
if action == 0: # 왼쪽
next_state = max(0, state - 1)
else: # 오른쪽
next_state = min(num_states - 1, state + 1)
reward = 0
if next_state == goal_state:
reward = 1
done = True
# Q-테이블 업데이트
q_table[state, action] = q_table[state, action] + learning_rate * \
(reward + discount_factor * np.max(q_table[next_state, :]) - q_table[state, action])
state = next_state
# Epsilon 감쇠
epsilon = min_epsilon + (max_epsilon - min_epsilon) * np.exp(-epsilon_decay_rate * episode)
print("학습된 Q-테이블:")
print(q_table)
# 학습된 정책 테스트
state = 0
path = [state]
while state != goal_state:
action = np.argmax(q_table[state, :])
if action == 0:
state = max(0, state - 1)
else:
state = min(num_states - 1, state + 1)
path.append(state)
if len(path) > 10: # 무한 루프 방지
print("경로를 찾지 못함 또는 너무 김")
break
print("최적 경로 (추정):", path)