이제 에이전트를 구현합니다. 에이전트 클래스는 에이전트가 환경에서 취해야 할 행동들을 정의한 함수가 포함됩니다.
코드 12-3 에이전트 구현
class Agent:
def __init__(self, env, optimizer): ------ 상태와 행동을 초기화
self._state_size = env.observation_space.n ------ 환경 속성 observation_space를 초기화
self._action_size = env.action_space.n ------ 환경 속성 action_space를 초기화
self._optimizer = optimizer ------ 옵티마이저 초기화
self.expirience_replay = deque(maxlen=2000) ------ 과거 행동에 대한 기억을 초기화
self.gamma = 0.6 ------ 할인율 초기화
self.epsilon = 0.1 ------ 탐험 비율 초기화
self.q_network = self.build_compile() ------ build_compile() 함수를 사용하여 큐-네트워크 구성
self.target_network = self.build_compile() ------ build_compile() 함수를 사용하여 타깃 큐-네트워크 구성
self.target_model()
def store(self, state, action, reward, next_state, terminated):
self.expirience_replay.append((state, action, reward, next_state, terminated))
def build_compile(self): ------ 네트워크 구성을 위한 함수
model = Sequential()
model.add(Embedding(self._state_size, 10, input_length=1)) ------ ①
model.add(Reshape((10,)))
model.add(Dense(50, activation='relu'))
model.add(Dense(50, activation='relu'))
model.add(Dense(50, activation='relu'))
model.add(Dense(self._action_size, activation='linear'))
model.compile(loss='mse', optimizer=self._optimizer)
return model
def target_model(self): ------ 가중치를 적용하기 위한 함수
self.target_network.set_weights(self.q_network.get_weights())
def act(self, state): ------ 탐험을 위한 함수
if np.random.rand() <= self.epsilon: ------ ②
return env.action_space.sample()
q_values = self.q_network.predict(state)
return np.argmax(q_values[0])
def retrain(self, batch_size): ------ 큐-네트워크 훈련에 대한 함수
minibatch = random.sample(self.expirience_replay, batch_size) ------ 리플레이 메모리에서 랜덤한 데이터 선택
target = self.q_network.predict(state)
if terminated:
target[0][action] = reward
else:
t = self.target_network.predict(next_state)
target[0][action] = reward + self.gamma * np.amax(t)
self.q_network.fit(state, target, epochs=1, verbose=0) ------ 큐-네트워크 훈련