*본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
|내용 정리|
<Value Iteration 코드 연습>

예제 환경 구성
- 그리드 크기: 3x3 (가로 3칸, 세로 3칸)
- 에이전트 시작 위치: (0,0) (좌측 상단)
- 목표 위치: (2,2) (우측 하단)
- 행동 공간: 4가지 방향 이동
- 0: 상 (↑)
- 1: 우 (→)
- 2: 하 (↓)
- 3: 좌 (←)
전이 모델
- 에이전트가 선택한 방향으로 80%의 확률로 이동
- 미끄러짐 효과로 20%의 확률로 제자리에 머무름
- 그리드 경계를 벗어나는 이동 시도 시 제자리에 머무름
보상 체계
- 목표(G)에 도달하면 +10 보상
- 그 외 모든 이동에는 0 보상
할인율(감마)
- γ = 0.9
이 그리드 환경에서는 Value Iteration 알고리즘을 사용하여 에이전트가 시작 위치(A)에서 목표 위치(G)까지 가장 효율적으로 이동하는 최적 정책을 찾는다.
Value Iteration은 각 상태의 가치를 반복적으로 업데이트하면서 최적 가치 함수를 계산하고, 이를 기반으로 최적 정책을 도출한다. 여기서는:
- 모든 상태에서 가능한 모든 행동의 기대 가치를 계산
- 각 상태에서 최대 가치를 가진 행동을 선택
- 상태 가치의 변화가 충분히 작아질 때까지 반복
코드로 보기
- ENV

- transition_probability

- reward 함수

- value_iteration


- main 실행함수 샘플

- 실행 예시


[1] 최초 설정:
- 에이전트는 (0,0) 위치에서 시작
- 목표는 (2,2) 위치에 있음
- 행동 공간은 상(0), 우(1), 하(2), 좌(3)
- 감가율(γ)은 0.9
- 목표 도달 시 +10의 보상
- 의도한 방향으로 80% 확률로 이동, 20% 확률로 제자리에 머무름
[2] 첫 번째 반복:

- 처음에는 목표 위치 (2,2)만 10의 가치를 가지고 있음 (보상).
- 그 주변 셀 (1,2)와 (2,1)은 이미 8의 가치를 가짐. 이는 목표로부터 한 칸 떨어져 있기 때문에 감가된 가치(10 * 0.9 * 0.8 = 7.2)와 제자리에 머무를 확률을 고려한 값.
[3] 열 번째 반복 (마지막):

- 에이전트는 (0,0) 위치에서 시작
- 목표는 (2,2) 위치에 있음
- 행동 공간은 상(0), 우(1), 하(2), 좌(3)
- 감가율(γ)은 0.9
- 목표 도달 시 +10의 보상
- 의도한 방향으로 80% 확률로 이동, 20% 확률로 제자리에 머무름
가치의 전파:
- 처음에는 목표 위치와 그 인접 셀만 가치를 가짐
- 반복을 거듭할수록 그리드 전체로 가치가 전파됨
- 가까운 셀에서 먼 셀로 가치가 점점 감소하며 전파됨
- Delta(가치 함수의 최대 변화량)가 점점 감소하며 알고리즘이 수렴
알고리즘 코드 구현 부분

수식 설명

- 𝑉[𝑘+1](𝑠):
- 의미: 상태 𝑠에서의 새로운 가치 함수 (k+1 번째 반복에서의 값).
- 목적: 현재 상태 𝑠의 가치를 업데이트.
- max𝑎:
- 의미: 모든 가능한 행동 𝑎 중에서 최댓값을 선택.
- 목적: 최적의 행동을 선택하여 가치를 극대화.
- ∑𝑠′𝑝(𝑠′∣𝑠,𝑎:
- 의미: 상태 𝑠에서 행동 𝑎를 취했을 때 다음 상태 𝑠′로 전이할 확률의 합.
- 목적: 모든 가능한 다음 상태 𝑠′에 대한 기대값을 계산.
- 𝑟+𝛾𝑉𝑘(𝑠′):
- 의미: 보상 𝑟과 할인된 다음 상태의 가치 𝛾𝑉𝑘(𝑠′)의 합.
- 목적: 현재 보상과 미래 가치를 고려하여 총 기대 보상을 계산.
- 전체 수식:
- 의미: 현재 상태 𝑠의 가치를 모든 가능한 행동과 다음 상태에 대한 기대 보상으로 업데이트.
- 목적: 가치 함수를 반복적으로 개선하여 최적 정책을 서치.
코드 설명

- for i_s, s in enumerate(env.state_space)::
- 의미: 모든 상태 𝑠를 순회합니다. i_s는 상태의 인덱스.
- 목적: 각 상태의 가치를 업데이트하기 위해 반복.
- action_values = np.zeros([len(env.action_space)]):
- 의미: 각 행동에 대한 가치를 저장할 배열을 0으로 초기화.
- 목적: 행동별 기대 보상을 계산하기 위한 임시 저장소.

- for a in env.action_space::
- 의미: 모든 가능한 행동 𝑎를 순회.
- 목적: 각 행동에 대한 기대 보상을 계산.
- action_value = 0:
- 의미: 현재 행동 𝑎에 대한 기대 보상을 0으로 초기화.
- 목적: 누적값을 계산하기 위한 변수.

- for i_s_next, s_next in enumerate(env.state_space)::
- 의미: 모든 가능한 다음 상태 𝑠′를 순회합니다. i_s_next는 다음 상태의 인덱스입니다.
- 목적: 각 다음 상태에 대한 전이 확률과 보상을 고려합니다.
- p_s_next = env.transition_probability(s, a, s_next):
- 의미: 상태 𝑠에서 행동 𝑎를 취했을 때 다음 상태 𝑠′로 전이할 확률 𝑝(𝑠′∣𝑠,𝑎)를 가져옴.
- 목적: 전이 모델을 반영.
- reward = env.reward(s, a, s_next):
- 의미: 상태 𝑠에서 행동 𝑎를 취하고 𝑠′로 전이했을 때의 보상 𝑟을 가져옴.
- 목적: 즉각적인 보상을 반영.
- action_value += p_s_next * (reward + gamma * value_vector[i_s_next]):
- 의미: 기대 보상에 전이 확률 𝑝(𝑠′∣𝑠,𝑎)와 할인된 다음 상태 가치 𝛾𝑉𝑘(𝑠′)를 곱한 값을 누적.
- 목적: 수식 ∑𝑠′𝑝(𝑠′∣𝑠,𝑎)[𝑟+𝛾𝑉𝑘(𝑠′)]를 코드로 구현한 부분.

- action_values[a] = action_value:
- 의미: 행동 𝑎에 대한 기대 보상을 배열에 저장.
- 목적: 모든 행동에 대한 기대 보상을 비교하기 위해 임시로 저장.

- new_value_vector[i_s] = np.max(action_values):
- 의미: 모든 행동에 대한 기대 보상 중 최댓값을 선택하여 새로운 가치 함수로 저장.
- 목적: 수식 max𝑎를 코드로 구현한 부분으로, 최적의 행동을 반영.
|인증|




-------
패스트캠퍼스 링크