BOARD_ROWS=3# grid world 세로BOARD_COLS=3# grid world 가로GAMMA=1.0POSSIBLE_ACTIONS=[0,1,2,3]# 좌, 우, 상, 하ACTIONS=[(-1,0),(1,0),(0,-1),(0,1)]# 좌표로 나타낸 행동REWARDS=[]
classPolicyIteration:def__init__(self,env):self.env=env# 환경에 대한 객체 선언self.value_table=[[0.0]*env.heightfor_inrange(env.width)]# 가치함수를 2차원 리스트로 초기화self.policy_table=[[[0.25,0.25,0.25,0.25]]*env.widthfor_inrange(env.height)]# 각 방향 동일 확률self.discount_factor=GAMMA# 할인율defpolicy_evaluation(self):# 벨만 기대 방정식을 통해 다음 가치함수를 계산하는 정책 평가next_value_table=[[0.0]*self.env.widthfor_inrange(self.env.height)]# 다음 가치함수 초기화forstateinself.env.get_all_states():# 모든 상태에 대해서 벨만 기대방정식을 계산value=0.0# 벨만 기대 방정식foractioninself.env.possible_actions:next_state=self.env.state_after_action(state,action)reward=self.env.get_reward(state,action)next_value=self.get_value(next_state)value+=(self.get_policy(state)[action]*(reward+self.discount_factor*next_value))next_value_table[state[0]][state[1]]=valueself.value_table=next_value_tabledefpolicy_improvement(self):# 현재 가치 함수에 대해서 탐욕 정책 발전next_policy=self.policy_tableforstateinself.env.get_all_states():#if state == [2, 2]: # 마침 상태# continuevalue_list=[]result=[0.0,0.0,0.0,0.0]# 반환할 정책 초기화# 모든 행동에 대해서 [보상 + (할인율 * 다음 상태 가치함수)] 계산forindex,actioninenumerate(self.env.possible_actions):next_state=self.env.state_after_action(state,action)reward=self.env.get_reward(state,action)next_value=self.get_value(next_state)value=reward+self.discount_factor*next_valuevalue_list.append(value)# 받을 보상이 최대인 행동들에 대해 탐욕 정책 발전max_idx_list=np.argwhere(value_list==np.amax(value_list))max_idx_list=max_idx_list.flatten().tolist()prob=1.0/len(max_idx_list)foridxinmax_idx_list:result[idx]=probnext_policy[state[0]][state[1]]=resultself.policy_table=next_policydefget_action(self,state):# 특정 상태에서 정책에 따라 무작위로 행동을 반환policy=np.array(self.get_policy(state))returnnp.random.choice(4,1,p=policy)[0]defget_policy(self,state):# 상태에 따른 정책 반환returnself.policy_table[state[0]][state[1]]defget_value(self,state):# 가치 함수의 값을 반환returnself.value_table[state[0]][state[1]]