Почему новая игра не совпадает с предыдущей, если я повторно инициализировал семя, и у них то же самое семя? - PullRequest
0 голосов
/ 24 апреля 2019

Я тренирую нейронную сеть, чтобы играть в игру.Игра генерируется случайным образом, но я хочу, чтобы агент тренировался и играл всегда в одной и той же среде.Поэтому я всегда инициализирую семя перед началом новой игры.Тем не менее, единственный результат, который я вижу, состоит в том, что когда я запускаю программу, все игры разные, но когда я запускаю ее во второй раз, игры равны в первый раз.Кажется, что я правильно установил начальное значение, но я не могу повторно инициализировать его.

Я не смог загрузить код правильно в stackoverflow, поэтому вот ссылка: https://gist.github.com/AOrtizDZ/725c1efc191d3aeb854dddbc1cbacbd3

Здесьэто часть кода, которая запускает игру каждый раз:

def game (genome, config):

random.seed(12)

global reward, mustcreate, dontcreate, must_creation_counter, score
global forbidden_creation_counter

net = neat.nn.FeedForwardNetwork.create(genome, config)

pygame.init()
pygame.mixer.init()
# screen = pygame.display.set_mode((WIDTH, HEIGHT))
# pygame.display.set_caption("Dinosaur")
clock = pygame.time.Clock()
# font = pygame.font.Font(None, 35)

players = list()
for i in range(num_players):
    players.append(Player(keys[i], colors[i], semicolors[i], i * 45))

enemies = list()

# Game loop
running = True
fps_counter = 0
reward = 0
action = np.zeros([3])
action[0] = 1

while running:

    reward += 1
    # keep loop running at the right speed

    #   clock.tick(FPS)

    # Process input (events)

    for event in pygame.event.get():
        # check for closing window

        if event.type == pygame.QUIT:
            running = False

    if (random.random() < prob_per_second / FPS and not dontcreate) or mustcreate:

        enemies.append(Enemy(level))

        dontcreate = True

        mustcreate = False

        must_creation_counter = 0

    else:
        must_creation_counter += 1

    if dontcreate == True:

        forbidden_creation_counter += 1

        if forbidden_creation_counter == 30:
            dontcreate = False

            forbidden_creation_counter = 0

    if must_creation_counter == 120:
        mustcreate = True

    #   screen.fill(WHITE)
    # Update

    for player in players:
        player.update(action)

    #       screen.blit(player.image, player.rect)
    # Draw / render

    for enemy in enemies:

        enemy.update()

        #       screen.blit(enemy.image, enemy.rect)

        if enemy.rect.right < 0:
            enemies.remove(enemy)

            score += 1

        for player in players:

            if pygame.sprite.collide_rect(player, enemy):
                player.choque()

    for player in players:

        if player.inmortal == True:

            player.counter += 1

            if player.counter == 120:
                player.counter = 0

                player.inmortal = False

        if player.vidas == 0:
            running = False

            return reward

    #       screen.blit(font.render(str(player.vidas), True, player.color), [60 + 60 * players.index(player), 40])

    # enemies.sort(key=operator.attrgetter('rect.left'))
    enemies_coord = list()

    for enemy in enemies:
        enemies_coord.append(enemy.rect.left)

        enemies_coord.append(enemy.rect.width)

        enemies_coord.append(enemy.rect.height)

        enemies_coord.append(enemy.speedx)

    player_coord = [player.rect.left,
                    player.rect.top,
                    player.speedy if player.speedy != 0.5 else 0]

    state = player_coord + enemies_coord

    while len(state) < 15:
        state.append(0)

    while len(state) > 15:
        state.pop()

    output = net.activate(state)
    max_Q = np.argmax(output)
    action = np.zeros([3])

    action[max_Q] = 1

    if max_Q == 1: reward -= 2

    #   screen.blit(font.render(str(reward), True, BLACK), [WIDTH - 60, 40])

    #   pygame.draw.line(screen, BLACK, (0, HEIGHT - 10), (WIDTH, HEIGHT - 10), 3)
    # *after* drawing everything, flip the display

    #   pygame.display.flip()

    fps_counter += 1

1 Ответ

0 голосов
/ 24 апреля 2019

Ваше описание немного неясно, но я думаю, что понимаю: вы хотите одну и ту же инициализацию при каждом заезде для тренера, но вы хотите случайные начала игры.Вы устанавливаете случайное начальное число перед каждым запуском - как вы думаете, что игры будут отличаться, когда вы даете им одинаковое начальное число для каждого тренировочного пробега?

Когда все ваши случайные числа происходят из одного и того же генератораВы не сможете получить эту функциональность так легко.У вас есть два потока: контроль-семя против псевдослучайности.Вам необходимо запрограммировать это.

Один простой способ - сохранить «случайный» трек, а именно: сохранить его состояние, установить начальное значение для инициализации тренера, а затем восстановить его.Логика такова:

  1. Установите начальное значение на желаемое значение для тренера, например random.seed(my_value).
  2. Инициализируйте тренажер - это ваш текущий код настройки.
  3. Восстановление случайного состояния ГСЧ для генерации игры: random.seed().Это устанавливает начальное значение на основе системного времени и распознается как фактически случайное.
  4. Продолжить как обычно.
...