У NEAT AI нет стимула добывать еду
Я пытаюсь создать искусственный интеллект змеи, используя библиотеку NEAT в Python. Но по какой-то причине змея не хочет получать пищу. Я передал их в систему как данные, а также представил систему, в которой, если змея не получает еды, она теряет очко пригодности, но змея либо ничего не делает, либо продолжает быстро перемещаться влево и вправо, поэтому что он остается на том же месте и продолжает оставаться в живых.
Как мне заставить змею хотеть добыть еду? код движения змейки:
for index, snake in enumerate(snakes):
output = nets[index].activate(snake.getData())
i = output.index(max(output))
xChange = 0
yChange = 0
print(i, index)
if i == 0:
xChange = 10
elif i == 1:
xChange = -10
elif i == 2:
yChange = 10
else:
yChange = -10
snake.definePosChange(xChange, yChange)
snake.game()
код для добавления фитнеса в змейку
remainSnake = 0
for i, snake in enumerate(snakes):
if snake.getAlive():
remainSnake += 1
genomes[i][1].fitness += snake.getReward()
функция, которая получает "награду" за змейку
def getReward(self):
if self.score <= 0:
return -1
return self.score * 100
функция, которая получает данные для змеи
def getData(self):
data = [self.x_position, self.y_position, self.food_x, self.food_y]
return data
Для данных, которые я передал, это координаты x и y, а также положение еды на экране.
Змея решает отойти от еды, не зная почему?
Я прошел через 50 поколений, а змея до сих пор ничего не делает, она почти не двигается и никогда не идет на еду. Я пытался перезагрузить файл около 10 раз, и змея получила пищу только один раз, и это было случайно.
РЕДАКТИРОВАТЬ: Я добавил награду, основанную на расстоянии от змеи до еды (а затем разделенном на 500), но это все равно ничего не меняет.
ИЗМЕНИТЬ СНОВА: Я добавил больше змей, сначала я пошел на 20, мой ноутбук не справился с этим, но я все еще пробовал, и это не помогло, и теперь я на 5.