def algoritmo_estrela_solitaria(nome, cartoletas, conteudo_csv, formacao, info): time_convocado = [] jogadores_por_setor = formacao.split("-") posicoes = [1, 2, 3, 4, 5, 6] num_jogadores_pos = util.get_num_jogadores_pos(formacao) custo_jogadores_pos = {} logging.debug("Length posicoes: {0}".format(len(posicoes))) posicao_sorteada_estrela = random.randint(1, len(posicoes) - 1) while num_jogadores_pos[posicao_sorteada_estrela] == 0: posicao_sorteada_estrela = random.randint(1, len(posicoes) - 1) jogador_convocado = convoca_por_posicao(cartoletas, conteudo_csv, 1, posicao_sorteada_estrela, info)[0] num_jogadores_pos[posicao_sorteada_estrela] -= 1 cartoletas_estrela = jogador_convocado[info["preco"]] cartoletas_restantes = cartoletas - cartoletas_estrela logging.debug("Jogador convocado: {0}".format(jogador_convocado)) logging.debug("Cartoletas restantes: {0}".format(cartoletas_restantes)) cartoletas_por_jogador = cartoletas_restantes / 11.0 for p in posicoes: custo_jogadores_pos[p] = num_jogadores_pos[p] * cartoletas_por_jogador if num_jogadores_pos[p] != 0: jogadores_convocados_pos = convoca_por_posicao( custo_jogadores_pos[p] / num_jogadores_pos[p], conteudo_csv, num_jogadores_pos[p], p, info) time_convocado.append(jogadores_convocados_pos) else: time_convocado.append([0]) setor_jogador_estrela = time_convocado[posicao_sorteada_estrela - 1] logging.debug( "Setor do jogador estrela: {0}".format(setor_jogador_estrela)) if len(setor_jogador_estrela) == 1 and setor_jogador_estrela[0] == 0: setor_jogador_estrela[0] = jogador_convocado else: setor_jogador_estrela.append(jogador_convocado) time_convocado[posicao_sorteada_estrela - 1] = setor_jogador_estrela logging.debug( "Time_convocado por Estrela Solitaria: {0}".format(time_convocado)) logging.debug("Custo do time {0}".format( mat_cartola.get_valor_indice_acumulado_time(time_convocado, info, "preco"))) logging.debug("Media do time {0}".format( mat_cartola.get_valor_indice_acumulado_time(time_convocado, info, "media"))) return time_convocado
def get_melhor_formacao_algoritmo(nome, cartoletas, conteudo_csv, formacoes, info, limiar_alg_genetico): times_montados = {} for formacao in formacoes: logging.debug( "Montando time para formacao {0} usando algoritmo {1}.".format( formacao, nome)) if nome == "Balanceado": time_convocado = algoritmo_balanceado(nome, cartoletas, conteudo_csv, formacao, info) elif nome == "Aleatorio": time_convocado = algoritmo_aleatorio(nome, cartoletas, conteudo_csv, formacao, info) elif nome == "Genetico": time_convocado = algoritmo_genetico(nome, cartoletas, conteudo_csv, formacao, limiar_alg_genetico, info) elif nome == "Estrela Solitaria": time_convocado = algoritmo_estrela_solitaria( nome, cartoletas, conteudo_csv, formacao, info) elif nome == "Balanceado V2": time_convocado = algoritmo_balanceado_V2(nome, cartoletas, conteudo_csv, formacao, info) elif nome == "Selecao da Rodada": time_convocado = algoritmo_selecao_brasileira( nome, cartoletas, conteudo_csv, formacao, info) media_time = mat_cartola.get_valor_indice_acumulado_time( time_convocado, info, "media") times_montados[media_time] = time_convocado custo_time = mat_cartola.get_valor_indice_acumulado_time( time_convocado, info, "preco") logging.debug("Media: {0}".format(media_time)) logging.debug("Custo: {0}".format(custo_time)) logging.debug( "###################################################################################" ) media_time_campeao = max(times_montados) time_campeao = times_montados[media_time_campeao] custo_time_campeao = mat_cartola.get_valor_indice_acumulado_time( time_campeao, info, "preco") logging.info("\n") logging.info("Algoritmo: {0}".format(nome)) logging.info("Media do time vencedor: {0}".format(media_time_campeao)) logging.info("Custo do time vencedor: {0}".format(custo_time_campeao)) import view view.imprime_time(time_campeao, info) logging.info("\n") return time_campeao
def algoritmo_estrela_solitaria(nome, cartoletas, conteudo_csv, formacao, info): time_convocado = [] jogadores_por_setor = formacao.split("-") posicoes = [1, 2, 3, 4, 5, 6] num_jogadores_pos = util.get_num_jogadores_pos(formacao) custo_jogadores_pos = {} logging.debug ("Length posicoes: {0}".format(len(posicoes))) posicao_sorteada_estrela = random.randint(1, len(posicoes) - 1) while num_jogadores_pos[posicao_sorteada_estrela] == 0: posicao_sorteada_estrela = random.randint(1, len(posicoes) - 1) jogador_convocado = convoca_por_posicao (cartoletas, conteudo_csv, 1, posicao_sorteada_estrela, info)[0] num_jogadores_pos[posicao_sorteada_estrela] -= 1 cartoletas_estrela = jogador_convocado[info["preco"]] cartoletas_restantes = cartoletas - cartoletas_estrela logging.debug("Jogador convocado: {0}".format(jogador_convocado)) logging.debug("Cartoletas restantes: {0}".format(cartoletas_restantes)) cartoletas_por_jogador = cartoletas_restantes / 11.0 for p in posicoes: custo_jogadores_pos[p] = num_jogadores_pos[p] * cartoletas_por_jogador if num_jogadores_pos[p] != 0: jogadores_convocados_pos = convoca_por_posicao(custo_jogadores_pos[p] / num_jogadores_pos[p], conteudo_csv, num_jogadores_pos[p], p, info) time_convocado.append(jogadores_convocados_pos) else: time_convocado.append([0]) setor_jogador_estrela = time_convocado[posicao_sorteada_estrela - 1] logging.debug("Setor do jogador estrela: {0}".format(setor_jogador_estrela)) if len(setor_jogador_estrela) == 1 and setor_jogador_estrela[0] == 0: setor_jogador_estrela[0] = jogador_convocado else: setor_jogador_estrela.append(jogador_convocado) time_convocado[posicao_sorteada_estrela - 1] = setor_jogador_estrela logging.debug("Time_convocado por Estrela Solitaria: {0}".format(time_convocado)) logging.debug("Custo do time {0}".format(mat_cartola.get_valor_indice_acumulado_time(time_convocado, info, "preco"))) logging.debug("Media do time {0}".format(mat_cartola.get_valor_indice_acumulado_time(time_convocado, info, "media"))) return time_convocado
def cruzamento(time_A, time_B, cartoletas, info): if time_A != time_B: # pdb.set_trace() logging.debug("Time A: {0}".format(time_A)) logging.debug("Time B: {0}".format(time_B)) qtde_posicoes_time = len(time_A) # num. setores #logging.debug("Posicoes Time A: {0}".format(qtde_posicoes_time)) idx_posicao = random.randint( 0, qtde_posicoes_time - 1) # indice de um setor (goleiro/zaga/meias/etc) qtde_jogadores_posicao = len( time_A[idx_posicao]) # numero de jogadores do setor idx_jogador = random.randint(0, qtde_jogadores_posicao - 1) # um jogador no setor. while idx_posicao < qtde_posicoes_time: # para cada um dos setores do time posicoes_no_time_A = time_A[idx_posicao] qtde_jogadores_posicao = len( posicoes_no_time_A) # numero de jogadores do setor logging.debug( "qtde_jogadores_posicao = {0}".format(qtde_jogadores_posicao)) logging.debug("Posicoes no time A: {0}".format(posicoes_no_time_A)) logging.debug("idx_posicao = {0}".format(idx_posicao)) posicoes_no_time_B = time_B[idx_posicao] logging.debug("Posicoes no time B: {0}".format(posicoes_no_time_B)) while idx_jogador < qtde_jogadores_posicao: # para cada um dos jogadores do setor jogador = posicoes_no_time_A[idx_jogador] if jogador not in posicoes_no_time_B: preco_jogador = jogador[info["preco"]] preco_time_B = mat_cartola.get_valor_indice_acumulado_time( time_B, info, "preco") jogador_anterior_B = posicoes_no_time_B[idx_jogador] preco_jogador_anterior_B = jogador_anterior_B[ info["preco"]] if preco_time_B - preco_jogador_anterior_B + preco_jogador < cartoletas: media_jogador = jogador[info["media"]] media_jogador_anterior = jogador_anterior_B[ info["media"]] if media_jogador > media_jogador_anterior: posicoes_no_time_B[idx_jogador] = jogador time_B[idx_posicao] = posicoes_no_time_B idx_jogador += 1 time_B[idx_posicao] = posicoes_no_time_B idx_posicao += 1 idx_jogador = 0 return time_B
def get_melhor_formacao_algoritmo(nome, cartoletas, conteudo_csv, formacoes, info, limiar_alg_genetico): times_montados = {} for formacao in formacoes: logging.debug ("Montando time para formacao {0} usando algoritmo {1}.".format(formacao, nome)) if nome == "Balanceado": time_convocado = algoritmo_balanceado(nome, cartoletas, conteudo_csv, formacao, info) elif nome == "Aleatorio": time_convocado = algoritmo_aleatorio(nome, cartoletas, conteudo_csv, formacao, info) elif nome == "Genetico": time_convocado = algoritmo_genetico(nome, cartoletas, conteudo_csv, formacao, limiar_alg_genetico, info) elif nome == "Estrela Solitaria": time_convocado = algoritmo_estrela_solitaria(nome, cartoletas, conteudo_csv, formacao, info) elif nome == "Balanceado V2": time_convocado = algoritmo_balanceado_V2 (nome, cartoletas, conteudo_csv, formacao, info) elif nome == "Selecao da Rodada": time_convocado = algoritmo_selecao_brasileira (nome, cartoletas, conteudo_csv, formacao, info) media_time = mat_cartola.get_valor_indice_acumulado_time(time_convocado, info, "media") times_montados[media_time] = time_convocado custo_time = mat_cartola.get_valor_indice_acumulado_time(time_convocado, info, "preco") logging.debug ("Media: {0}".format(media_time)) logging.debug ("Custo: {0}".format(custo_time)) logging.debug ("###################################################################################") media_time_campeao = max(times_montados) time_campeao = times_montados[media_time_campeao] custo_time_campeao = mat_cartola.get_valor_indice_acumulado_time(time_campeao, info, "preco") logging.info ("\n") logging.info ("Algoritmo: {0}".format(nome)) logging.info ("Media do time vencedor: {0}".format(media_time_campeao)) logging.info ("Custo do time vencedor: {0}".format(custo_time_campeao)) import view view.imprime_time(time_campeao, info) logging.info ("\n") return time_campeao
def algoritmo_balanceado_V2(nome, cartoletas, conteudo_csv, formacao, info): time_convocado = algoritmo_balanceado(nome, cartoletas, conteudo_csv, formacao, info) # logging.info ("Time Balanceado: {0}".format(time_convocado)) custo_time_balanceado = mat_cartola.get_valor_indice_acumulado_time( time_convocado, info, "preco") cartoletas_restantes = cartoletas - custo_time_balanceado logging.debug("Cartoletas restantes: {0}".format(cartoletas_restantes)) posicoes_validas = 0.0 for posicoes in time_convocado: if len(posicoes) >= 1 and posicoes[0] != 0: posicoes_validas += 1.0 logging.debug("Posicoes validas: {0}".format(posicoes_validas)) cartoletas_restantes_posicao = int(cartoletas_restantes / posicoes_validas) logging.debug( "Cartoletas por setor: {0}".format(cartoletas_restantes_posicao)) for posicoes in time_convocado: pior_jogador_posicao = get_pior_jogador_posicao(posicoes, info) logging.debug("Setor: {0}".format(posicoes)) logging.debug( "Pior jogador do setor: {0}".format(pior_jogador_posicao)) if pior_jogador_posicao != None: custo_pior_jogador_posicao = pior_jogador_posicao[info["preco"]] posicao_jogador = pior_jogador_posicao[info["posicao"]] custo_limite_novo_jogador = custo_pior_jogador_posicao + cartoletas_restantes_posicao logging.debug( "Custo limite: {0}".format(custo_limite_novo_jogador)) jogador_novo_posicao = pior_jogador_posicao jogador_novo_posicao = convoca_por_posicao( custo_limite_novo_jogador, conteudo_csv, 1, posicao_jogador, info) logging.debug( "Novo jogador do setor: {0}".format(jogador_novo_posicao)) logging.debug("Jogador Novo: {0}".format(jogador_novo_posicao)) idx_jogador_antigo = posicoes.index(pior_jogador_posicao) logging.debug("Idx pior jogador: {0}".format(idx_jogador_antigo)) if posicoes[idx_jogador_antigo] != jogador_novo_posicao[ 0] and jogador_novo_posicao[0] not in posicoes: posicoes[idx_jogador_antigo] = jogador_novo_posicao[0] logging.debug("Time modificado: {0}".format(time_convocado)) return time_convocado
def cruzamento (time_A, time_B, cartoletas, info): if time_A != time_B: # pdb.set_trace() logging.debug ("Time A: {0}".format(time_A)) logging.debug ("Time B: {0}".format(time_B)) qtde_posicoes_time = len(time_A) # num. setores #logging.debug("Posicoes Time A: {0}".format(qtde_posicoes_time)) idx_posicao = random.randint(0, qtde_posicoes_time - 1) # indice de um setor (goleiro/zaga/meias/etc) qtde_jogadores_posicao = len(time_A[idx_posicao]) # numero de jogadores do setor idx_jogador = random.randint(0, qtde_jogadores_posicao - 1) # um jogador no setor. while idx_posicao < qtde_posicoes_time: # para cada um dos setores do time posicoes_no_time_A = time_A[idx_posicao] qtde_jogadores_posicao = len(posicoes_no_time_A) # numero de jogadores do setor logging.debug ("qtde_jogadores_posicao = {0}".format(qtde_jogadores_posicao)) logging.debug ("Posicoes no time A: {0}".format(posicoes_no_time_A)) logging.debug ("idx_posicao = {0}".format(idx_posicao)) posicoes_no_time_B = time_B[idx_posicao] logging.debug ("Posicoes no time B: {0}".format(posicoes_no_time_B)) while idx_jogador < qtde_jogadores_posicao: # para cada um dos jogadores do setor jogador = posicoes_no_time_A[idx_jogador] if jogador not in posicoes_no_time_B: preco_jogador = jogador[info["preco"]] preco_time_B = mat_cartola.get_valor_indice_acumulado_time(time_B, info, "preco") jogador_anterior_B = posicoes_no_time_B[idx_jogador] preco_jogador_anterior_B = jogador_anterior_B[info["preco"]] if preco_time_B - preco_jogador_anterior_B + preco_jogador < cartoletas: media_jogador = jogador[info["media"]] media_jogador_anterior = jogador_anterior_B[info["media"]] if media_jogador > media_jogador_anterior: posicoes_no_time_B[idx_jogador] = jogador time_B[idx_posicao] = posicoes_no_time_B idx_jogador += 1 time_B[idx_posicao] = posicoes_no_time_B idx_posicao += 1 idx_jogador = 0 return time_B
def mutacao_genetica(filho_AB, cartoletas, conteudo_csv, limiar_mutacao, info): # Mutacao Genetica # pdb.set_trace() idx_posicao_mutacao = random.randint(0, len(filho_AB) - 1) setor_antigo = filho_AB[idx_posicao_mutacao] idx_jogador_mutacao = random.randint(0, len(setor_antigo) - 1) jogador_antigo = setor_antigo[idx_jogador_mutacao] while jogador_antigo == 0: idx_posicao_mutacao = random.randint(0, len(filho_AB) - 1) setor_antigo = filho_AB[idx_posicao_mutacao] idx_jogador_mutacao = random.randint(0, len(setor_antigo) - 1) jogador_antigo = setor_antigo[idx_jogador_mutacao] logging.debug("Cartoletas: {0}".format(cartoletas)) custo_filho_AB = mat_cartola.get_valor_indice_acumulado_time( filho_AB, info, "preco") logging.debug("Custo filho_AB: {0}".format(custo_filho_AB)) custo_filho_AB -= jogador_antigo[1] logging.debug( "Custo filho_AB - Custo Jogador Antigo: {0}".format(custo_filho_AB)) cartoletas_mutacao = cartoletas - custo_filho_AB logging.debug("Cartoletas para mutaçao: {0}".format(cartoletas_mutacao)) if cartoletas_mutacao > 0: posicao = jogador_antigo[4] jogador_novo = jogador_antigo while jogador_antigo == jogador_novo or jogador_novo in setor_antigo: jogador_novo = convoca_aleatoriamente_por_posicao( cartoletas_mutacao, conteudo_csv, 1, posicao, info) if len(jogador_novo) > 1: jogador_novo = jogador_novo[0] if jogador_novo in setor_antigo: continue else: jogador_novo = jogador_antigo break setor_novo = setor_antigo setor_novo[idx_jogador_mutacao] = jogador_novo filho_AB[idx_posicao_mutacao] = setor_novo return filho_AB
def mutacao_genetica (filho_AB, cartoletas, conteudo_csv, limiar_mutacao, info): # Mutacao Genetica # pdb.set_trace() idx_posicao_mutacao = random.randint(0, len(filho_AB) - 1) setor_antigo = filho_AB[idx_posicao_mutacao] idx_jogador_mutacao = random.randint(0, len(setor_antigo) - 1) jogador_antigo = setor_antigo[idx_jogador_mutacao] while jogador_antigo == 0: idx_posicao_mutacao = random.randint(0, len(filho_AB) - 1) setor_antigo = filho_AB[idx_posicao_mutacao] idx_jogador_mutacao = random.randint(0, len(setor_antigo) - 1) jogador_antigo = setor_antigo[idx_jogador_mutacao] logging.debug("Cartoletas: {0}".format(cartoletas)) custo_filho_AB = mat_cartola.get_valor_indice_acumulado_time(filho_AB, info, "preco") logging.debug("Custo filho_AB: {0}".format(custo_filho_AB)) custo_filho_AB -= jogador_antigo[1] logging.debug("Custo filho_AB - Custo Jogador Antigo: {0}".format(custo_filho_AB)) cartoletas_mutacao = cartoletas - custo_filho_AB logging.debug("Cartoletas para mutaçao: {0}".format(cartoletas_mutacao)) if cartoletas_mutacao > 0: posicao = jogador_antigo[4] jogador_novo = jogador_antigo while jogador_antigo == jogador_novo or jogador_novo in setor_antigo: jogador_novo = convoca_aleatoriamente_por_posicao (cartoletas_mutacao, conteudo_csv, 1, posicao, info) if len(jogador_novo) > 1: jogador_novo = jogador_novo[0] if jogador_novo in setor_antigo: continue else: jogador_novo = jogador_antigo break setor_novo = setor_antigo setor_novo[idx_jogador_mutacao] = jogador_novo filho_AB[idx_posicao_mutacao] = setor_novo return filho_AB
def algoritmo_balanceado_V2 (nome, cartoletas, conteudo_csv, formacao, info): time_convocado = algoritmo_balanceado (nome, cartoletas, conteudo_csv, formacao, info) # logging.info ("Time Balanceado: {0}".format(time_convocado)) custo_time_balanceado = mat_cartola.get_valor_indice_acumulado_time (time_convocado, info, "preco") cartoletas_restantes = cartoletas - custo_time_balanceado logging.debug ("Cartoletas restantes: {0}".format(cartoletas_restantes)) posicoes_validas = 0.0 for posicoes in time_convocado: if len(posicoes) >= 1 and posicoes[0] != 0: posicoes_validas += 1.0 logging.debug ("Posicoes validas: {0}".format(posicoes_validas)) cartoletas_restantes_posicao = int(cartoletas_restantes / posicoes_validas) logging.debug ("Cartoletas por setor: {0}".format(cartoletas_restantes_posicao)) for posicoes in time_convocado: pior_jogador_posicao = get_pior_jogador_posicao(posicoes, info) logging.debug ("Setor: {0}".format(posicoes)) logging.debug ("Pior jogador do setor: {0}".format(pior_jogador_posicao)) if pior_jogador_posicao != None: custo_pior_jogador_posicao = pior_jogador_posicao[info["preco"]] posicao_jogador = pior_jogador_posicao[info["posicao"]] custo_limite_novo_jogador = custo_pior_jogador_posicao + cartoletas_restantes_posicao logging.debug ("Custo limite: {0}".format(custo_limite_novo_jogador)) jogador_novo_posicao = pior_jogador_posicao jogador_novo_posicao = convoca_por_posicao(custo_limite_novo_jogador, conteudo_csv, 1, posicao_jogador, info) logging.debug ("Novo jogador do setor: {0}".format(jogador_novo_posicao)) logging.debug ("Jogador Novo: {0}".format(jogador_novo_posicao)) idx_jogador_antigo = posicoes.index(pior_jogador_posicao) logging.debug ("Idx pior jogador: {0}".format(idx_jogador_antigo)) if posicoes[idx_jogador_antigo] != jogador_novo_posicao[0] and jogador_novo_posicao[0] not in posicoes: posicoes[idx_jogador_antigo] = jogador_novo_posicao[0] logging.debug ("Time modificado: {0}".format (time_convocado)) return time_convocado
def update_conteudo_csv (cartoletas, conteudo_csv, dict_probabilidades_vitoria_elenco, dict_aproveitamento_clubes): alg = "Selecao da Rodada" formacoes = ["4-4-2", "4-3-3", "4-5-1", "3-5-2", "3-4-3", "5-3-2", "5-4-1"] time_convocado_selecao = algoritmo.get_melhor_formacao_algoritmo(alg, cartoletas, conteudo_csv, formacoes, info, None) custo_selecao = mat_cartola.get_valor_indice_acumulado_time(time_convocado_selecao, info, "preco") print "Custo da Selecao da Rodada usando Medias do Cartola FC: {0}".format(custo_selecao) for i in range(1, len(conteudo_csv)): jogador = conteudo_csv[i] id_time = jogador[info["clube_id"]] media_jogador = jogador[info["media"]] jogadores_time = util.obtem_jogadores_por_time (conteudo_csv, id_time, info) time_atual = [] time_atual.append(jogadores_time) import pdb probabilidade_vitoria_elenco = dict_probabilidades_vitoria_elenco[id_time] aproveitamento_time = mat_cartola.get_porcentual_aproveitamento(dict_aproveitamento_clubes, id_time) variacao_preco = jogador[info["variacao_preco"]] preco = jogador[info["preco"]] percentual_participacao = info["percentual_participacao"] # rodada 14: 00.00 C$: 113.74 importancia_cartoleta = ((cartoletas - custo_selecao) / custo_selecao) * (variacao_preco / preco) jogador[info["media"]] = media_jogador * percentual_participacao * probabilidade_vitoria_elenco * aproveitamento_time jogador[info["media"]] = jogador[info["media"]] + importancia_cartoleta * jogador[info["media"]] # rodada 13: 45.85 C$: ~110 # importancia_cartoleta = ((cartoletas - custo_selecao) / custo_selecao) * (variacao_preco / preco) # jogador[info["media"]] = media_jogador * percentual_participacao * probabilidade_vitoria_elenco * aproveitamento_time # jogador[info["media"]] = jogador[info["media"]] + importancia_cartoleta * jogador[info["media"]] # recorde do programa - rodada 12: 53.79 C$: ~102. #jogador[info["media"]] = media_jogador * probabilidade_vitoria_elenco - variacao_preco conteudo_csv[i] = jogador return conteudo_csv
def algoritmo_genetico(nome, cartoletas, conteudo_csv, formacao, limite_inferior, info): populacao = [] nova_populacao = [] probabilidade_continuidade = {} soma_medias = 0.0 limiar_mutacao = 0.01 tamanho_populacao = 4000 # PRD # tamanho_populacao = 2000 # QA # tamanho_populacao = 1000 mutacoes_ocorridas = 0 geracoes = 20 # PRD #geracoes = 10 # QA geracoes = 10 geracao_atual = 1 cartoletas_por_jogador = cartoletas / (12.0) time_campeao = [] logging.debug("Calculando geraçao 0 para formacao {0}".format(formacao)) populacao = gera_populacao_inicial(tamanho_populacao, cartoletas, conteudo_csv, formacao, info) medias_times_populacao = [0] * tamanho_populacao logging.debug(medias_times_populacao) while geracao_atual <= geracoes and max( medias_times_populacao) <= limite_inferior: logging.info("Calculando geraçao {0} para formacao {1}".format( geracao_atual, formacao)) logging.debug(" max(medias_times_populacao) = {0}".format( max(medias_times_populacao))) soma_medias = 0.0 medias_times_populacao = [0] * len(populacao) probabilidade_continuidade = [0] * len(populacao) pontuacao_por_time = {} for id_time_convocado in range(0, len(populacao)): time_convocado = populacao[id_time_convocado] medias_times_populacao[ id_time_convocado] = mat_cartola.get_valor_indice_acumulado_time( time_convocado, info, "media") soma_medias += medias_times_populacao[id_time_convocado] pontuacao_por_time[ medias_times_populacao[id_time_convocado]] = id_time_convocado logging.debug(medias_times_populacao) for id_time_convocado in range(0, len(populacao)): probabilidade_continuidade[ id_time_convocado] = medias_times_populacao[ id_time_convocado] / soma_medias probabilidade_continuidade_cumulativa = {} probabilidade_continuidade_cumulativa[0] = probabilidade_continuidade[ 0] for id_time_convocado in range(1, len(populacao)): probabilidade_continuidade_cumulativa[ id_time_convocado] = probabilidade_continuidade_cumulativa[ id_time_convocado - 1] + probabilidade_continuidade[id_time_convocado] nova_populacao = [] # Seleçao Natural while len(nova_populacao) < len(populacao): num_sorteio_time_A = mat_cartola.get_id_time_probabilidade_cumulativa( probabilidade_continuidade_cumulativa) num_sorteio_time_B = num_sorteio_time_A while num_sorteio_time_A == num_sorteio_time_B: num_sorteio_time_B = mat_cartola.get_id_time_probabilidade_cumulativa( probabilidade_continuidade_cumulativa) logging.debug( "Cruzamento entre times dos indices {0} e {1}.".format( num_sorteio_time_A, num_sorteio_time_B)) time_A = populacao[num_sorteio_time_A] time_B = populacao[num_sorteio_time_B] filho_AB = cruzamento(time_A, time_B, cartoletas, info) probabilidade_mutacao = random.random() if probabilidade_mutacao < limiar_mutacao: filho_AB = mutacao_genetica(filho_AB, cartoletas, conteudo_csv, limiar_mutacao, info) mutacoes_ocorridas += 1 nova_populacao.append(filho_AB) populacao = nova_populacao geracao_atual += 1 logging.debug("Medias geracao: {0}".format(medias_times_populacao)) idx_time_campeao = pontuacao_por_time[max(medias_times_populacao)] logging.debug("idx_time_campeao = {0}".format(idx_time_campeao)) time_campeao = populacao[idx_time_campeao] soma_medias = 0.0 medias_times_populacao = [0] * len(populacao) probabilidade_continuidade = [0] * len(populacao) pontuacao_por_time = {} for id_time_convocado in range(0, len(populacao)): time_convocado = populacao[id_time_convocado] medias_times_populacao[ id_time_convocado] = mat_cartola.get_valor_indice_acumulado_time( time_convocado, info, "media") soma_medias += medias_times_populacao[id_time_convocado] pontuacao_por_time[ medias_times_populacao[id_time_convocado]] = id_time_convocado logging.debug("Ultima geracao: {0}".format(geracao_atual)) logging.debug("Mutacoes ocorridas: {0}".format(mutacoes_ocorridas)) # logging.info("Medias geracao: {0}".format(medias_times_populacao)) logging.info(max(medias_times_populacao)) # logging.debug ("Medias geracao: {0}".format(medias_times_populacao)) idx_time_campeao = pontuacao_por_time[max(medias_times_populacao)] logging.debug("idx_time_campeao = {0}".format(idx_time_campeao)) time_campeao = nova_populacao[idx_time_campeao] logging.debug( "Time campeao do AG para formacao {0} possui media {1}: {2}".format( formacao, mat_cartola.get_valor_indice_acumulado_time( time_convocado, info, "media"), time_campeao)) return time_campeao
def algoritmo_genetico (nome, cartoletas, conteudo_csv, formacao, limite_inferior, info): populacao = [] nova_populacao = [] probabilidade_continuidade = {} soma_medias = 0.0 limiar_mutacao = 0.01 tamanho_populacao = 4000 # PRD # tamanho_populacao = 2000 # QA # tamanho_populacao = 1000 mutacoes_ocorridas = 0 geracoes = 20 # PRD #geracoes = 10 # QA geracoes = 10 geracao_atual = 1 cartoletas_por_jogador = cartoletas / (12.0) time_campeao = [] logging.debug ("Calculando geraçao 0 para formacao {0}".format(formacao)) populacao = gera_populacao_inicial(tamanho_populacao, cartoletas, conteudo_csv, formacao, info) medias_times_populacao = [0] * tamanho_populacao logging.debug(medias_times_populacao) while geracao_atual <= geracoes and max(medias_times_populacao) <= limite_inferior: logging.info("Calculando geraçao {0} para formacao {1}".format(geracao_atual, formacao)) logging.debug(" max(medias_times_populacao) = {0}".format(max(medias_times_populacao))) soma_medias = 0.0 medias_times_populacao = [0] * len(populacao) probabilidade_continuidade = [0] * len(populacao) pontuacao_por_time = {} for id_time_convocado in range(0, len(populacao)): time_convocado = populacao[id_time_convocado] medias_times_populacao[id_time_convocado] = mat_cartola.get_valor_indice_acumulado_time(time_convocado, info, "media") soma_medias += medias_times_populacao[id_time_convocado] pontuacao_por_time[medias_times_populacao[id_time_convocado]] = id_time_convocado logging.debug(medias_times_populacao) for id_time_convocado in range(0, len(populacao)): probabilidade_continuidade[id_time_convocado] = medias_times_populacao[id_time_convocado] / soma_medias probabilidade_continuidade_cumulativa = {} probabilidade_continuidade_cumulativa[0] = probabilidade_continuidade[0] for id_time_convocado in range(1, len(populacao)): probabilidade_continuidade_cumulativa[id_time_convocado] = probabilidade_continuidade_cumulativa[id_time_convocado - 1] + probabilidade_continuidade[id_time_convocado] nova_populacao = [] # Seleçao Natural while len(nova_populacao) < len(populacao): num_sorteio_time_A = mat_cartola.get_id_time_probabilidade_cumulativa (probabilidade_continuidade_cumulativa) num_sorteio_time_B = num_sorteio_time_A while num_sorteio_time_A == num_sorteio_time_B: num_sorteio_time_B = mat_cartola.get_id_time_probabilidade_cumulativa (probabilidade_continuidade_cumulativa) logging.debug("Cruzamento entre times dos indices {0} e {1}.".format(num_sorteio_time_A, num_sorteio_time_B)) time_A = populacao[num_sorteio_time_A] time_B = populacao[num_sorteio_time_B] filho_AB = cruzamento(time_A, time_B, cartoletas, info) probabilidade_mutacao = random.random() if probabilidade_mutacao < limiar_mutacao: filho_AB = mutacao_genetica (filho_AB, cartoletas, conteudo_csv, limiar_mutacao, info) mutacoes_ocorridas += 1 nova_populacao.append(filho_AB) populacao = nova_populacao geracao_atual += 1 logging.debug ("Medias geracao: {0}".format(medias_times_populacao)) idx_time_campeao = pontuacao_por_time[max(medias_times_populacao)] logging.debug("idx_time_campeao = {0}".format(idx_time_campeao)) time_campeao = populacao[idx_time_campeao] soma_medias = 0.0 medias_times_populacao = [0] * len(populacao) probabilidade_continuidade = [0] * len(populacao) pontuacao_por_time = {} for id_time_convocado in range(0, len(populacao)): time_convocado = populacao[id_time_convocado] medias_times_populacao[id_time_convocado] = mat_cartola.get_valor_indice_acumulado_time(time_convocado, info, "media") soma_medias += medias_times_populacao[id_time_convocado] pontuacao_por_time[medias_times_populacao[id_time_convocado]] = id_time_convocado logging.debug("Ultima geracao: {0}".format(geracao_atual)) logging.debug("Mutacoes ocorridas: {0}".format(mutacoes_ocorridas)) # logging.info("Medias geracao: {0}".format(medias_times_populacao)) logging.info(max(medias_times_populacao)) # logging.debug ("Medias geracao: {0}".format(medias_times_populacao)) idx_time_campeao = pontuacao_por_time[max(medias_times_populacao)] logging.debug("idx_time_campeao = {0}".format(idx_time_campeao)) time_campeao = nova_populacao[idx_time_campeao] logging.debug("Time campeao do AG para formacao {0} possui media {1}: {2}".format(formacao, mat_cartola.get_valor_indice_acumulado_time(time_convocado, info, "media"), time_campeao)) return time_campeao
# algoritmos = ["Balanceado V2"] # algoritmos = ["Aleatorio"] # algoritmos = ["Estrela Solitaria"] # algoritmos = ["Genetico"] times_campeoes = {} medias_campeoes = {} for alg in algoritmos: if alg != "Genetico": times_campeoes[alg] = algoritmo.get_melhor_formacao_algoritmo(alg, cartoletas, conteudo_csv, formacoes, info, None) else: if len(medias_campeoes) != 0: limiar_algoritmo_genetico = max(medias_campeoes) else: limiar_algoritmo_genetico = 200.00 print ("Limiar para algoritmo genetico: {0}".format(limiar_algoritmo_genetico)) times_campeoes[alg] = algoritmo.get_melhor_formacao_algoritmo(alg, cartoletas, conteudo_csv, formacoes, info, limiar_algoritmo_genetico) media_time_campeao_alg = mat_cartola.get_valor_indice_acumulado_time(times_campeoes[alg], info, "media") medias_campeoes[media_time_campeao_alg] = alg idx_vencedor_geral = max(medias_campeoes) algoritmo_vencedor_geral = medias_campeoes[idx_vencedor_geral] print "Vencedor Geral: {0}".format(algoritmo_vencedor_geral) time_vencedor_geral = times_campeoes[algoritmo_vencedor_geral] view.imprime_time(time_vencedor_geral, info) custo_vencedor_geral = mat_cartola.get_valor_indice_acumulado_time(time_vencedor_geral, info, "preco") print "Media: {0}; Custo: {1}".format(idx_vencedor_geral, custo_vencedor_geral) browser.close()