def construcao(instancia,alfa): # print(" Construindo solucao com alfa = %s"%str(alfa)) solucao = Solucao(instancia) turmaDisciplinaToCargaDisponivelDic = solucao.instancia.turmaDisciplinaToCargaDic while not solucao.completa(): geradorDeCandidatos = gerarCandidatos(solucao,turmaDisciplinaToCargaDisponivelDic) todosCandidatos = [(slot,solucao.custoIncremental(slot)[1]) for slot in geradorDeCandidatos] if todosCandidatos: todosCandidatos.sort(key=lambda x: x[1], reverse=True) RCL = [ c for c in todosCandidatos if custo(c) >= \ custo(todosCandidatos[0]) - alfa*(custo(todosCandidatos[0]) - custo(todosCandidatos[-1])) ] aleatorio = random.choice(RCL)[0] (turmaNome,i,j) = solucao.slotVazio() turmaDisciplinaToCargaDisponivelDic[turmaNome,aleatorio[0]]-= 1 solucao.adicionar(aleatorio) else: (turmaNome,i,j) = solucao.slotVazio() # print(" Reiniciando construcao: Nenhum candidato para o slot (%d,%d) da turma %s." % (i,j,turmaNome)) solucao = Solucao(instancia) turmaDisciplinaToCargaDisponivelDic = solucao.instancia.turmaDisciplinaToCargaDic return solucao
def GRASP_VND(MAX_ITERACOES,instancia,alfa): melhorSolucao = Solucao(instancia) for k in range(MAX_ITERACOES): print(" GRASP: Iteracao %s"% (k+1)) solucaoCorrente = construcao(instancia,alfa) # print("\n Beneficio apos construcao:", solucaoCorrente.beneficio()) solucaoCorrente = VNS_VND(5,instancia,solucaoCorrente) # print("\n Beneficio apos VND:", solucaoCorrente.beneficio()) if melhorSolucao.beneficio() < solucaoCorrente.beneficio(): melhorSolucao = copy.deepcopy(solucaoCorrente) return melhorSolucao
def construcao(instancia, alfa): logger.log(" Construindo solucao com alfa = %s" % str(alfa), logger.debugModeTotal) solucao = Solucao(instancia) turmaDisciplinaToCargaDisponivelDic = solucao.instancia.turmaDisciplinaToCargaDic while not solucao.completa(): geradorDeCandidatos = gerarCandidatos( solucao, turmaDisciplinaToCargaDisponivelDic) todosCandidatos = [(candidato, solucao.beneficioIncremental(candidato)[1]) for candidato in geradorDeCandidatos] if todosCandidatos: todosCandidatos.sort(key=lambda x: x[1], reverse=True) RCL = [ c for c in todosCandidatos if getBeneficio(c) >= getBeneficio(todosCandidatos[0]) - alfa * (getBeneficio(todosCandidatos[0]) - getBeneficio(todosCandidatos[-1])) ] aleatorio = random.SystemRandom().choice(RCL)[0] (turmaNome, i, j) = solucao.slotVazio() turmaDisciplinaToCargaDisponivelDic[turmaNome, aleatorio[0]] -= 1 solucao.adicionar(aleatorio) else: (turmaNome, i, j) = solucao.slotVazio() logger.log( " Reiniciando construcao: Nenhum candidato para o slot (%d,%d) da turma %s." % (i, j, turmaNome), logger.debugModeTotal) # random.shuffle(instancia.turmas) solucao = Solucao(instancia) turmaDisciplinaToCargaDisponivelDic = solucao.instancia.turmaDisciplinaToCargaDic return solucao
def GRASP_VND(MAX_ITERACOES, instancia, alfa): melhorSolucao = Solucao(instancia) for k in range(MAX_ITERACOES): logger.log(" GRASP: Iteracao %s" % (k + 1), logger.debugModeTotal) solucaoCorrente = construcao(instancia, alfa) logger.log( "\n Beneficio apos construcao: %s" % solucaoCorrente.beneficio(), logger.debugModeTotal) solucaoCorrente = VND(solucaoCorrente) logger.log( "\n Beneficio apos VND: %s" % solucaoCorrente.beneficio(), logger.debugModeTotal) if melhorSolucao.beneficio() < solucaoCorrente.beneficio(): melhorSolucao = copy.deepcopy(solucaoCorrente) return melhorSolucao