Я бы предположил, что этот подход проблематичен c, потому что, несмотря на изменение функции вознаграждения, вы не включили количество шагов в пространство наблюдения. Агенту нужна эта информация в пространстве наблюдения, чтобы иметь возможность различать, в какой момент он должен врезаться в цель. На самом деле, если ваш агент находится рядом с целью и все, что ему нужно сделать, это повернуть направо, но пока все, что он сделал, - это пять ходов, это точно такое же наблюдение, как если бы он сделал 19 ходов. Дело в том, что вы не можете кормить агента в одном и том же состоянии и ожидать, что он будет выполнять другие действия, потому что агент не видит вашу функцию вознаграждения, он получает вознаграждение только на основе состояния. Поэтому вы противоречите действиям.
Подумайте, когда вы приступите к тестированию производительности агентов. Больше нет награды. Все, что вы делаете, передаете сеть в состояние, и вы ожидаете, что она выберет различные действия для одного и того же состояния.
Я предполагаю, что ваше пространство состояний - это некий 2D-массив. Должно быть просто изменить код, чтобы он содержал количество шагов в пространстве состояний. Тогда функция вознаграждения будет выглядеть примерно так, если наблюдение [num_steps] = 20: вознаграждение = 10. Спросите, нужна ли вам дополнительная помощь для ее кодирования