Похоже, у вас есть несколько неправильных представлений о том, какую проблему решает код. Я постараюсь прояснить вопрос о скидках.
Давайте сначала предположим, что мы не обесцениваем вознаграждения. Ценность выполнения действия в данном состоянии определяется как сумма наград, которые агент должен получить, когда он выполняет это действие и затем следует фиксированной политике.
Мы могли бы использовать это определение и узнать функцию значения. Но одна проблема в том, что если агент живет вечно, он, возможно, получит бесконечное вознаграждение. Кроме того, агент не будет вынужден действовать. Он с радостью пройдет через миллион плохих состояний, если поможет медленно войти в хорошее состояние, в котором он может остаться навсегда. Труднее выучить такие ценности действия (и заставить их стабилизироваться), если мы посмотрим вперед на миллионы временных шагов.
Так что это решается за счет скидок. Цель агента изменена таким образом, чтобы максимизировать не сумму вознаграждений, а немедленное вознаграждение плюс 0,9 раза следующего вознаграждения, плюс 0,9 * 0,9 раза следующего и т. Д., Поэтому дисконтированное вознаграждение после миллиона временных шагов является для всех практических целей означает, не имеет значения для текущего решения агента. Это не имеет ничего общего с началом или концом эпизода. Дисконтирование вознаграждения всегда начинается с текущего состояния.
Эта строка, которую вы смотрите:
target = reward + self.gamma * np.amax(self.model.predict(next_state))
рассчитывает лучшую оценку значения действия. Это стандартная формула учебника (см., Например, «Обучение усилению» Саттона и Барто). Он использует сам предиктор (который все еще обучается) для оценки стоимости (суммы дисконтированных вознаграждений) действий, которые совершаются позднее в будущем, с дисконтированием на один временной шаг с гаммой.