如果我重新初始化种子并且他们有相同的种子,为什么新游戏不等于前一个游戏呢?

问题描述 投票:-1回答:1

我正在训练神经网络来玩游戏。游戏是随机生成的,但我希望代理人能够在同一环境中训练和玩耍。因此,我总是在开始新游戏之前初始化种子。然而,我看到的唯一结果是,当我运行程序时,游戏都是不同的,但是当我再次运行它时,游戏等于第一次。看起来我正确设置了种子,但我无法重新初始化它。

我无法正确上传代码到stackoverflow,所以这里是链接:https://gist.github.com/AOrtizDZ/725c1efc191d3aeb854dddbc1cbacbd3

以下是每次启动游戏的代码部分:

def游戏(基因组,配置):

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
python random neural-network pygame random-seed
1个回答
0
投票

你的描述有点不清楚,但我想我明白了:你想为教练每次运行都进行相同的初始化,但你想要随机游戏开始。你在每次运行之前设置随机种子 - 当你为每次训练运行给他们相同的种子时,你认为游戏会有什么不同?

当所有随机数都来自同一个生成器时,您将无法轻松获得此功能。你有两个线程:control-the-seed vs伪随机性。你需要编程。

一种直接的方法是专门维护“随机”轨道:保存其状态,为训练器初始化设置种子,然后恢复状态。逻辑是:

  1. 将种子设置为培训师所需的值,例如random.seed(my_value)
  2. 初始化培训师 - 这是您当前的设置代码。
  3. 恢复游戏生成的随机RNG状态:random.seed()。这根据系统时间设置种子,并被识别为有效随机。
  4. 继续正常。
© www.soinside.com 2019 - 2024. All rights reserved.