Выбор входов для AI змей - PullRequest
       63

Выбор входов для AI змей

0 голосов
/ 19 апреля 2020

Я пытаюсь создать змеиный ИИ с библиотекой python -NEAT. Проблема, с которой я столкнулся, связана с входами в нейронную сеть. Прямо сейчас я просто вычисляю расстояние от всех его стен (вверху, справа, слева, снизу) и расстояние от еды до корма и подаю его в нейронную сеть. с другой стороны, на многих видео YouTube и в других потоках на разных платформах люди говорят о том, чтобы проверить, свободны ли берега слева, справа и спереди и где находится еда. Мой вопрос: как мне это получить? Использую ли я opencv для захвата изображений или в Pygame есть другой способ?

Вот мой объект-змея

class Snake:
    def __init__(self):
        self.snake_block = 10
        self.x = int(round(random.randrange(0, height - self.snake_block) / 10.0) * 10.0)
        self.y = int(round(random.randrange(0, height - self.snake_block) / 10.0) * 10.0)
        self.dx = 0
        self.dy = 0
        self.snake_head = []
        self.snake_full = []
        self.snake_length = 1
        self.dtw = 0
        self.dbw = 0
        self.dlw = 0
        self.drw = 0
        self.brain = SnakeAI()
        self.direction = 4
        self.dfx = 0
        self.dfy = 0
        self.step_allowed = 100
        self.decesion = []

    def draw(self):
        for x in self.snake_full:
            pygame.draw.rect(screen, red, (x[0], x[1], self.snake_block, self.snake_block))

    def move(self):
        if self.direction is 0:
            self.dy = -self.snake_block
            self.dx = 0
        if self.direction is 1:
            self.dy = self.snake_block
            self.dx = 0
        if self.direction is 2:
            self.dy = 0
            self.dx = -self.snake_block
        if self.direction is 3:
            self.dy = 0
            self.dx = self.snake_block
        self.step_allowed -= 1
        self.x += self.dx
        self.y += self.dy
        self.snake_head = []
        self.snake_head.append(self.x)
        self.snake_head.append(self.y)
        self.snake_full.append(self.snake_head)
        if len(self.snake_full) > self.snake_length:
            del self.snake_full[0]
        self.draw()

    def grow(self):
        self.snake_length += 1

    def senses(self, fx, fy):
        self.dtw = self.y - 0
        self.dbw = self.y - height
        self.dlw = self.x - 0
        self.drw = self.x - width
        self.dfx = self.x - fx
        self.dfy = self.y - fy

Вот как я передаю его нейронной сети

 snake.senses(food.x, food.y)
 output = nets[snakes.index(snake)].activate((height, abs(snake.dbw), width, abs(snake.drw), 
 abs(snake.dfx), abs(snake.dfy)))
 output = int(np.argmax(output))
 snake.direction = output
 snake.move()
...