더북(TheBook)

이제 에이전트를 구현합니다. 에이전트 클래스는 에이전트가 환경에서 취해야 할 행동들을 정의한 함수가 포함됩니다.

코드 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) ------ 큐-네트워크 훈련
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.