我正在训练神经网络来玩游戏。游戏是随机生成的,但我希望代理人能够在同一环境中训练和玩耍。因此,我总是在开始新游戏之前初始化种子。然而,我看到的唯一结果是,当我运行程序时,游戏都是不同的,但是当我再次运行它时,游戏等于第一次。看起来我正确设置了种子,但我无法重新初始化它。
我无法正确上传代码到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
你的描述有点不清楚,但我想我明白了:你想为教练每次运行都进行相同的初始化,但你想要随机游戏开始。你在每次运行之前设置随机种子 - 当你为每次训练运行给他们相同的种子时,你认为游戏会有什么不同?
当所有随机数都来自同一个生成器时,您将无法轻松获得此功能。你有两个线程:control-the-seed vs伪随机性。你需要编程。
一种直接的方法是专门维护“随机”轨道:保存其状态,为训练器初始化设置种子,然后恢复状态。逻辑是:
random.seed(my_value)
。random.seed()
。这根据系统时间设置种子,并被识别为有效随机。