def main(): qtdPop = int(input("Quantidade Gerações: ")) qtInd = int(input("Quantidade de individuos: ")) mutacao = float(input("Mutação:")) chanceCO = float(input("CrossOver:")) geracao = ag.Geracao(qtInd) best_individuos = [] score_medias_geracoes = [] vel_jogo = 500 for j in range(qtdPop): print (' \n') print (' - - - - Geração atual: {} - - - - ' .format(j+1)) print (' \n') for i in range(qtInd): gameState = jogo.jogar(geracao.individuos[i], vel_jogo, scoreMax = 200000, jogoRapido = True) geracao.individuos[i].fitness(gameState) print("Individuo: "+ (i + 1).__str__() + " score:" + geracao.individuos[i].score.__str__()) geracao.selecao(3, best_individuos, score_medias_geracoes) geracao.reproduzir(qtInd, chanceCO, mutacao) print("melhor individuo!!!") gameState = jogo.jogar(geracao.individuos[0], vel_jogo, 1) print("Melhores Individuos:") print(best_individuos) plt.subplot(211) plt.title('Fitness Melhores Individuos por Geração') plt.plot(best_individuos) plt.ylabel("Fitness Melhores Individuos") plt.xlabel("Gerações") plt.subplot(212) print("Medias Fitness por Gerações:") print(score_medias_geracoes) plt.title('Médias de Fitness de Individuos por Geração') plt.plot(score_medias_geracoes) plt.ylabel("Media Fitness Geração") plt.xlabel("Gerações") plt.subplots_adjust(top=0.94, bottom=0.08, left=0.10, right=0.95, hspace=0.25, wspace=0.35) plt.show() return(geracao)
def jogar(): print("*************************************") print("Escolha um dos dois jogos.") print("*************************************") print("(1) - Adivinhação | (2) - Forca") escolha = int(input("=> ")) if escolha == 1: print("Iniciando jogo da adivinhação") jogo.jogar() elif escolha == 2: print("Iniciando jogo da forca") forca.jogar()
def main(): ''' Nessa funcao voce deve procurar um individuo capaz de vencer o jogo, Para isso você precisa: 1) Declarar a Geracao Zero, com 10 individuos 2) Jogar o jogo com a geração 3) Avaliar os individuos de cada geracao (fitness) 4) Selecionar os 4 melhores e utilizar eles para reproduzir a proxima Geracao 5) Voltar para "2" até a condição de parada seja atingida (ex: conseguir passar de nível, fazer uma pontuação maior que 20.000 pontos) 6) Retornar um objeto Geracao com os individuos treinados (pode ser apenas 1 individuo) Dicas: você ja criou diversas funcoes no outro arquivo e deve chamá-las quando achar necessário. As que você vai precisar usar são: -ag.Geracoes() -individuo.fitness(gameState) -geracao.selecao(numSelec) -geracao.reproduzir(m, chanceCO, chanceMut) Alem disso, você deve usar a funcão ja pronta: -gameState = jogo.jogar(geracao.individuos, numerodageracao, vel_jogo,scoreMax = 20000, jogoRapido = False) - geracao.individuos é a geracao criada por você - numeroDaGeracao é qual a geração atual (1, 2, 3...) - vel_jogo é a velocidade do jogo (1 é a velocidade normal, recomendamos 100 para não ficar esperando muito) - scoreMax e jogoRapido estão definidos -essa função utiliza o individuo para um novo jogo de Tetris, e retorna variáveis do jogo (gameState) além disso, deve-se escolher a pontuação máxima para "ganhar" e finalizar o jogo e também definir se o jogo estará rápido (True) ou não (False) -lembrando que gameState possui: gameState[0] = numero de pecas gameState[1] = linhas destruidas(combos de 1,2,3,4) gameState[2] = pontuação do tetris gameState[3] = ganhou ''' #COMPLETE AQUI: geracao = ag.Geracao(20, 7) for i in range(20): print(geracao.individuos[i]) epoca = 0 while geracao.individuos[0].score < 10000: gameState = jogo.jogar(geracao.individuos, epoca, 100, scoreMax=20000, jogoRapido=False) for i in range(len(geracao.individuos)): geracao.individuos[i].fitness(gameState[i]) print(geracao.individuos[i].score) geracao.selecao(7) geracao.reproduzir(20, 0.2, 0.05) epoca += 1 return geracao
def main(): generation = ag.Geracao(10) fim = False while (not fim): print('new generation!', generation) for individuo in generation.individuos: gameState = jogo.jogar(individuo, 30, 100) individuo.fitness(gameState) print('numero de batidas ', gameState[5]) fim |= gameState[6] generation.selecao() print('fim dessa geração', generation) generation.reproduzir(.2, .3) print('fim porra') print(generation) ## Nessa funcao voce deve procurar um individuo capaz de vencer o jogo, ## Para isso você precisa: ## ## 1) Declarar a Geracao Zero, com 10 individuos ## ## 2) Avaliar os individuos de cada geracao (jogando o jogo) ## ## 3) Selecionar os 4 melhores e utilizar eles para reproduzir a proxima Geracao ## ## 4) Voltar para "2" até a condição de parada seja atingida (ex: rebater mais de 30 vezes, fazer uma pontuação maior que X pontos) ## ## 5) Retornar um objeto Geracao com os individuos treinados (pode ser apenas 1 individuo) ## ## ## Dicas: você ja criou diversas funcoes no outro arquivo e deve chamá-las quando achar necessário. ## As que você vai precisar usar são: ## -ag.Geracoes() ## -individuo.fitness(gameState) ## -geracao.selecao(numSelec) ## -geracao.reproduzir(m, chanceCO, chanceMut) ## Alem disso, você deve usar a funcão ja pronta: ## -gameState = jogo.jogar(individuo,numBat,multVelocidade) ## -essa função utiliza o individuo para jogar uma partida de Pong, e retorna variáveis do jogo (gameState) ## além disso, deve-se escolher o número de batidas para "ganhar" e finalizar o jogo ## e também definir o quão rápido deve estar o jogo (recomendo usar multVelocidade = 50) ## ## -lembrando que gameState possui: ## #gameState[0] = player.y (normalizado de -1 a +1) ## #gameState[1] = ball.x (normalizado de -1 a +1) ## #gameState[2] = ball.y (normalizado de -1 a +1) ## #gameState[3] = ball.speed_x ## #gameState[4] = ball.speed_y ## #gameState[5] = numBat (numero de vezes que a bolinha bateu no player) ## #gameState[6] = ganhou (True/False, se o player sobreviveu o tempo definido) #COMPLETE AQUI return (generation)
def main(): numInd = 10 geracao = ag.Geracao(numInd) #vel_jogo = int(input('Velocidade de jogo desejada: '))*100 vel_jogo = 500 for j in range(numInd): print (' \n') print (' - - - - Geração atual: {} - - - - ' .format(j+1)) print (' \n') #print(" Score: ",geracao.individuos[i].fitness(gameState),"\n") for i in range(10): gameState = jogo.jogar(geracao.individuos[i], vel_jogo, scoreMax = 200000, jogoRapido = False) geracao.individuos[i].fitness(gameState) geracao.selecao(1) print("melhor individuo da geração!!!") geracao.selecao(3) geracao.reproduzir(10) geracao.selecao(1) print("melhor individuo!!!") gameState = jogo.jogar(geracao.individuos[0], vel_jogo, 1) return(geracao)
for i in range(20): print(geracao.individuos[i]) epoca = 0 while geracao.individuos[0].score < 10000: gameState = jogo.jogar(geracao.individuos, epoca, 100, scoreMax=20000, jogoRapido=False) for i in range(len(geracao.individuos)): geracao.individuos[i].fitness(gameState[i]) print(geracao.individuos[i].score) geracao.selecao(7) geracao.reproduzir(20, 0.2, 0.05) epoca += 1 return geracao #geracao.selecao(1) #print("melhor individuo!!!") #gameState = jogo.jogar(geracao.individuos, epoca, 10,scoreMax = 20000, jogoRapido = True) #----------------------------------------------- gen = main() ## essa parte serve para você ver o melhor individuo jogando o jogo em sua velocidade normal gen.selecao(1) print("melhor individuo!!!") gameState = jogo.jogar(gen.individuos, 1, 1) print(gen.individuo[0].score)
def main(): ''' Nessa funcao voce deve vai procurar um individuo capaz de vencer o jogo, Para isso você precisa: 1) Declarar a Geracao Zero, com 10 individuos 2) Avaliar os individuos de cada geracao 3) Selecionar os 3 melhores e utilizar eles para reproduzir a proxima Geracao Dicas: você ja criou diversas funcoes no outro arquivo e deve chamá-las quando achar necessário. As que você vai precisar usar são: -ag.Geracoes() -individuo.fitness(gameState) -geracao.selecao(numSelec) -geracao.reproduzir(m, chanceCO, chanceMut) Alem disso, você pode usar a funcão: -gameState = jogo.jogar(individuo,numBat,multVelocidade) -essa função utiliza o individuo para jogar uma partida de Pong, além disso, deve-se escolher o número de batidas para "ganhar" e finalizar o jogo e também definir o quão rápido deve estar o jogo -lembrando que gameState possui: #gameState[0] = player.y (normalizado de -1 a +1) #gameState[1] = ball.x (normalizado de -1 a +1) #gameState[2] = ball.y (normalizado de -1 a +1) #gameState[3] = ball.speed_x #gameState[4] = ball.speed_y #gameState[5] = numBat (numero de vezes que a bolinha bateu no player) #gameState[6] = ganhou (True/False, se o player sobreviveu o tempo definido) ''' multVel = 100 i = 0 #geracao0 generation = ag.Geracao(10) cont = True while cont: print('geracao %d' % i) for individuo in generation.individuos: gameState = jogo.jogar(individuo, 40, multVel) individuo.fitness(gameState) if gameState[6] == True: cont = False print('Ganhei!') #print(individuo) #print(individuo.score) #condicao de parada if cont == True and i < 100: generation.selecao(3) generation.reproduzir(10) i += 1 else: cont = False generation.selecao(1) return (generation)