def obtem_ambiente(caminho):
    tempo = RegistroTempo('Ler csv ambiente')
    arquivo = open(caminho, "r")
    matriz = list(csv.reader(arquivo))
    arquivo.close()
    tempo.exibe() if EXIBE_TEMPO else None
    return Ambiente(int(matriz[1][0]), int(matriz[1][1]))
    def constroi(self, aleatoriedade) -> Solucao:

        self._limpa_construcao()

        self._exibe_iteracao()

        for iteracao in range(self.quantidade_anuncios):

            tempo_iteracao = RegistroTempo()

            self._atualiza_limite_inferior_atual(aleatoriedade)

            indice_selecionado = self._obtem_candidato()

            self._insere_first_fit(indice_selecionado)

            self._exibe_iteracao(iteracao, indice_selecionado)

            self._lista_anuncio_disponivel.remove(indice_selecionado)

            self._lista_tempo_iteracao[iteracao] = tempo_iteracao.finaliza()

        self._exibe_dados_tempo()

        return self.solucao
def obtem_matriz_anuncio(caminho):
    tempo = RegistroTempo('Ler csv anuncios')
    arquivo = open(caminho, "r")
    arquivo_csv = csv.reader(arquivo)
    matriz = [obtem_anuncio(linha) for linha in arquivo_csv if linha]
    arquivo.close()
    tempo.exibe() if EXIBE_TEMPO else None
    return matriz
 def _limpa_construcao(self):
     self._tempo_construcao = RegistroTempo('Construção')
     tempo = RegistroTempo('Limpar solução anterior')
     self.solucao = Solucao(self.ambiente, self.matriz_conflito,
                            self.matriz_anuncio)
     self._lista_anuncio_disponivel = list(range(self.quantidade_anuncios))
     self._limpa_lista_tempo()
     self._limpa_dados_atuais()
def obtem_matriz_conflito(caminho):
    tempo = RegistroTempo('Ler csv conflitos')
    arquivo = open(caminho, "r")
    arquivo_csv = csv.reader(arquivo)
    matriz_conflito = []
    for linha in arquivo_csv:
        linha = [True if x == '1' else False for x in linha]
        matriz_conflito.append(linha)
    arquivo.close()
    tempo.exibe(1) if EXIBE_TEMPO else None
    return matriz_conflito
    def _obtem_candidato(self):

        tempo_candidatos = RegistroTempo()

        if self._lista_indice_anuncio_candidato_atual == None:
            self._atualiza_lista_indice_anuncio_candidato()

        indice_selecionado = self._escolhe_candidato()

        self._tempo_total_candidato = self._tempo_total_candidato + tempo_candidatos.finaliza(
        )

        return indice_selecionado
def valida_entrada(ambiente, matriz_anuncio, matriz_conflito):

    if ATIVA_VALIDACAO:
        tempo = RegistroTempo('Validar entrada')

        valida_ambiente(ambiente)
        valida_anuncio(matriz_anuncio)
        valida_conflito(matriz_conflito)

        if len(matriz_anuncio) != len(matriz_conflito):
            raise Exception(
                "Tabela de conflitos está com índices diferentes dos anúncios")

        tempo.exibe(1)
    def _atualiza_limite_inferior_atual(self, aleatoriedade):

        tempo_limites = RegistroTempo()

        if self._maior_ganho_atual == None or self._menor_ganho_atual == None or self._limite_inferior_atual == None:

            self._atualiza_menor_e_maior_ganhos_disponiveis_atuais()

            self._limite_inferior_atual = self._maior_ganho_atual - aleatoriedade * (
                self._maior_ganho_atual - self._menor_ganho_atual)

            self._lista_indice_anuncio_candidato_atual = None

        self._tempo_total_limites = self._tempo_total_limites + tempo_limites.finaliza(
        )
Exemple #9
0
    def exibe_tempo(self):
        if EXIBE_TEMPO:
            print('Quantidade de anúncios:', len(self.matriz_anuncio))

            if EXIBE_TEMPO_DETALHE:
                print()
                RegistroTempo.exibe_soma(self.lista_tempo_construcao,
                                         'Total Construção')

            self.tempo_leitura.exibe(ignora_inativacao=1)
            self.tempo_solucao.exibe(ignora_inativacao=1,
                                     nova_linha=(not EXIBE_SOLUCAO))

            if EXIBE_SOLUCAO:
                self.tempo_exibicao.exibe(nova_linha=1, ignora_inativacao=1)
            self.tempo_total.exibe(nova_linha=1, ignora_inativacao=1)
Exemple #10
0
    def exibe_tempo(self):
        if EXIBE_TEMPO:

            print('Entrei em cada vizinhança:')
            print('Adiciona:', len(self._lista_tempo_adiciona), 'vezes')
            print('Substitui:', len(self._lista_tempo_substitui), 'vezes')
            print('Move:', len(self._lista_tempo_move), 'vezes')
            print('Remaneja:', len(self._lista_tempo_remaneja), 'vezes\n')

            RegistroTempo.exibe_soma(self._lista_tempo_adiciona, 'Total adiciona')
            RegistroTempo.exibe_soma(self._lista_tempo_substitui, 'Total substitui')
            RegistroTempo.exibe_soma(self._lista_tempo_move, 'Total move')
            RegistroTempo.exibe_soma(self._lista_tempo_remaneja, 'Total remaneja', nova_linha=True)
 def _atualiza_lista_indice_anuncio_candidato(self):
     tempo = RegistroTempo('Obter candidatos')
     lista_indice = []
     tamanho_lista = 0
     for i in self._lista_anuncio_disponivel:
         anuncio = self.matriz_anuncio[i]
         if anuncio[GANHO] >= self._limite_inferior_atual:
             lista_indice.append(i)
             tamanho_lista = tamanho_lista + 1
     self._lista_indice_anuncio_candidato_atual = lista_indice
     self._tamanho_lista_indice_anuncio_candidato_atual = tamanho_lista
    def _insere_first_fit(self, indice_candidato):

        tempo = RegistroTempo('First Fit')
        candidato = self.matriz_anuncio[indice_candidato]
        frequencia_anuncio = candidato[FREQUENCIA]

        lista_indice_quadro_selecionado = []
        contagem_quadros = 0

        for indice_quadro in self.solucao.lista_quadro_disponivel:
            if self.solucao.copia_pode_ser_inserida(indice_candidato,
                                                    indice_quadro):
                lista_indice_quadro_selecionado.append(indice_quadro)
                contagem_quadros = contagem_quadros + 1
                if contagem_quadros == frequencia_anuncio:
                    self.solucao.insere(lista_indice_quadro_selecionado,
                                        indice_candidato)
                    break

        self._tempo_total_first_fit = self._tempo_total_first_fit + tempo.finaliza(
        )
Exemple #13
0
    def soluciona(self):

        self.inicializa_tempo()
        self.limpa_solucao()

        print('\n0%')
        for iteracao in range(self.quantidade_iteracoes):

            tempo_construcao = RegistroTempo()
            solucao_construida = self.construtor.constroi(self.alpha)
            self.lista_tempo_construcao.append(tempo_construcao.finaliza())

            solucao_atual = solucao_construida

            if solucao_atual.espaco_total_ocupado > self.solucao.espaco_total_ocupado:
                self.solucao = solucao_atual
                self.melhor_iteracao = iteracao
                if self.solucao.eh_otimo():
                    self.registra_iteracao(iteracao, solucao_construida,
                                           solucao_atual)
                    break

            self.registra_iteracao(iteracao, solucao_construida, solucao_atual)

            if EXIBE_SOLUCAO_DETALHE:
                print(f'\n{iteracao + 1}', '- solução:')
                print(solucao_atual.metricas())

                print('===================\n')
            print(np.round(100 * (iteracao + 1) / self.quantidade_iteracoes),
                  '%')

        self.tempo_solucao.finaliza()

        self.exibe_solucao()
        self.exibe_tempo()

        return self.solucao
    def _atualiza_menor_e_maior_ganhos_disponiveis_atuais(self):

        tempo = RegistroTempo('Obter limites de ganho')
        menor_ganho = self.matriz_anuncio[
            self._lista_anuncio_disponivel[0]][GANHO]
        maior_ganho = self.matriz_anuncio[
            self._lista_anuncio_disponivel[0]][GANHO]

        for i in self._lista_anuncio_disponivel[1:]:
            ganho = self.matriz_anuncio[i][GANHO]
            if ganho < menor_ganho:
                menor_ganho = ganho
            elif ganho > maior_ganho:
                maior_ganho = ganho

        self._menor_ganho_atual = menor_ganho
        self._maior_ganho_atual = maior_ganho
Exemple #15
0
    def __init__(self, caminho_instancia, ignora_conflitos=False):

        self.tempo_leitura = RegistroTempo('Tempo para ler entrada')
        self.tempo_solucao = RegistroTempo('Tempo para encontrar a solução',
                                           inicializa_agora=False)
        self.tempo_exibicao = RegistroTempo('Tempo para exibir a solução',
                                            inicializa_agora=False)
        self.tempo_total = RegistroTempo('Tempo total de execução')

        self.matriz_anuncio, self.ambiente, self.matriz_conflito = obtem_instancia(
            caminho_instancia)

        if ignora_conflitos:
            self.esvazia_conflito()

        self.tempo_leitura.finaliza()

        self.construtor = Construcao(self.matriz_anuncio, self.matriz_conflito,
                                     self.ambiente)

        print(f'\n{caminho_instancia}')
        self.exibe_instancia()
Exemple #16
0
class Guloso:

    quantidade_iteracoes = 1
    alpha = 0

    matriz_anuncio = None
    matriz_conflito = None
    ambiente = None

    tempo_total = None
    tempo_leitura = None
    tempo_solucao = None
    tempo_exibicao = None
    lista_tempo_construcao = None

    melhor_iteracao = None
    lista_iteracao = None

    construtor = None

    solucao: Solucao = None

    def __init__(self, caminho_instancia, ignora_conflitos=False):

        self.tempo_leitura = RegistroTempo('Tempo para ler entrada')
        self.tempo_solucao = RegistroTempo('Tempo para encontrar a solução',
                                           inicializa_agora=False)
        self.tempo_exibicao = RegistroTempo('Tempo para exibir a solução',
                                            inicializa_agora=False)
        self.tempo_total = RegistroTempo('Tempo total de execução')

        self.matriz_anuncio, self.ambiente, self.matriz_conflito = obtem_instancia(
            caminho_instancia)

        if ignora_conflitos:
            self.esvazia_conflito()

        self.tempo_leitura.finaliza()

        self.construtor = Construcao(self.matriz_anuncio, self.matriz_conflito,
                                     self.ambiente)

        print(f'\n{caminho_instancia}')
        self.exibe_instancia()

    def esvazia_conflito(self):
        for linha in self.matriz_conflito:
            for i in range(len(linha)):
                linha[i] = False

    def limpa_solucao(self):
        self.solucao = Solucao(self.ambiente, self.matriz_conflito,
                               self.matriz_anuncio)
        self.lista_iteracao = []

    def soluciona(self):

        self.inicializa_tempo()
        self.limpa_solucao()

        print('\n0%')
        for iteracao in range(self.quantidade_iteracoes):

            tempo_construcao = RegistroTempo()
            solucao_construida = self.construtor.constroi(self.alpha)
            self.lista_tempo_construcao.append(tempo_construcao.finaliza())

            solucao_atual = solucao_construida

            if solucao_atual.espaco_total_ocupado > self.solucao.espaco_total_ocupado:
                self.solucao = solucao_atual
                self.melhor_iteracao = iteracao
                if self.solucao.eh_otimo():
                    self.registra_iteracao(iteracao, solucao_construida,
                                           solucao_atual)
                    break

            self.registra_iteracao(iteracao, solucao_construida, solucao_atual)

            if EXIBE_SOLUCAO_DETALHE:
                print(f'\n{iteracao + 1}', '- solução:')
                print(solucao_atual.metricas())

                print('===================\n')
            print(np.round(100 * (iteracao + 1) / self.quantidade_iteracoes),
                  '%')

        self.tempo_solucao.finaliza()

        self.exibe_solucao()
        self.exibe_tempo()

        return self.solucao

    def inicializa_tempo(self):
        self.tempo_solucao.inicializa()
        self.lista_tempo_construcao = []

    def registra_iteracao(self, iteracao, solucao_construcao: Solucao,
                          solucao_busca_local: Solucao):
        linha_iteracao = [
            iteracao, solucao_construcao.espaco_total_ocupado,
            solucao_busca_local.espaco_total_ocupado,
            self.solucao.espaco_total_ocupado
        ]
        self.lista_iteracao.append(linha_iteracao)

    def exibe_tempo(self):
        if EXIBE_TEMPO:
            print('Quantidade de anúncios:', len(self.matriz_anuncio))

            if EXIBE_TEMPO_DETALHE:
                print()
                RegistroTempo.exibe_soma(self.lista_tempo_construcao,
                                         'Total Construção')

            self.tempo_leitura.exibe(ignora_inativacao=1)
            self.tempo_solucao.exibe(ignora_inativacao=1,
                                     nova_linha=(not EXIBE_SOLUCAO))

            if EXIBE_SOLUCAO:
                self.tempo_exibicao.exibe(nova_linha=1, ignora_inativacao=1)
            self.tempo_total.exibe(nova_linha=1, ignora_inativacao=1)

    def exibe_solucao(self):
        self.tempo_exibicao.inicializa()
        if EXIBE_SOLUCAO:
            print(f'\nSolução construída:\n{self.solucao}')
        if EXIBE_APROVEITAMENTO:
            print(self.solucao.avaliacao())
        self.tempo_exibicao.finaliza()

    def exibe_instancia(self):
        if EXIBE_INSTANCIA:
            print('Tamanho do quadro L:', self.ambiente.tamanho_quadro)
            print('Quantidade de quadros B:', self.ambiente.quantidade_quadros,
                  '\n')
            print('Anúncios A_i:\n', np.array(self.matriz_anuncio), '\n')
            print('Conflitos C_ij:')
            n = len(self.matriz_conflito)
            for i in range(6 if n > 6 else n):
                print('', self.matriz_conflito[i])
            if n > 6:
                print(' ...')
            print()

    def salva_solucao(self, local):
        arquivo = open(local, 'w+')
        arquivo_csv = csv.writer(arquivo)
        for quadro in self.solucao.matriz_solucao:
            arquivo_csv.writerow(quadro)
        arquivo.close()

    def salva_lista_iteracao(self, local):
        arquivo = open(local, 'w+')
        arquivo_csv = csv.writer(arquivo)
        for iteracao in self.lista_iteracao:
            arquivo_csv.writerow(iteracao)
        arquivo.close()
Exemple #17
0
    def _obtem_melhor_vizinho(self, solucao: Solucao) -> Solucao:

        tempo = RegistroTempo()
        solucao_adiciona = self._melhor_vizinho_adiciona(solucao)
        self._lista_tempo_adiciona.append(tempo.finaliza())
        if solucao_adiciona != None:
            # print('Adicionou\n')
            return solucao_adiciona
        # print('Não adicionou\n')

        tempo = RegistroTempo()
        solucao_substitui = self._melhor_vizinho_substitui(solucao)
        self._lista_tempo_substitui.append(tempo.finaliza())
        if solucao_substitui != None:
            # print('Substituiu\n')
            return solucao_substitui
        # print('Não substituiu\n')

        tempo = RegistroTempo()
        solucao_move = self._melhor_vizinho_move(solucao)
        self._lista_tempo_move.append(tempo.finaliza())
        if solucao_move != None:
            # print('Moveu\n')
            return solucao_move
        # print('Não moveu\n')

        tempo = RegistroTempo()
        solucao_remaneja = self._melhor_vizinho_remaneja(solucao)
        self._lista_tempo_remaneja.append(tempo.finaliza())
        if solucao_remaneja != None:
            # print('Remanejou\n')
            return solucao_remaneja
        # print('Não remanejou\n')

        return None
class Construcao:
    def __init__(self, matriz_anuncio, matriz_conflito, ambiente):

        self.matriz_anuncio = matriz_anuncio
        self.matriz_conflito = matriz_conflito
        self.ambiente: Ambiente = ambiente

        self.solucao = None

        self.quantidade_anuncios = len(matriz_anuncio)
        self._lista_anuncio_disponivel = None

        self._tempo_construcao = None
        self._lista_tempo_iteracao = None
        self._tempo_total_limites = None
        self._tempo_total_candidato = None
        self._tempo_total_first_fit = None

        self._limite_inferior_atual = None
        self._menor_ganho_atual = None
        self._maior_ganho_atual = None
        self._lista_indice_anuncio_candidato_atual = None
        self._tamanho_lista_indice_anuncio_candidato_atual = None

    def _limpa_construcao(self):
        self._tempo_construcao = RegistroTempo('Construção')
        tempo = RegistroTempo('Limpar solução anterior')
        self.solucao = Solucao(self.ambiente, self.matriz_conflito,
                               self.matriz_anuncio)
        self._lista_anuncio_disponivel = list(range(self.quantidade_anuncios))
        self._limpa_lista_tempo()
        self._limpa_dados_atuais()
        # tempo.exibe(1)

    def _limpa_dados_atuais(self):
        self._limite_inferior_atual = None
        self._menor_ganho_atual = None
        self._maior_ganho_atual = None
        self._lista_indice_anuncio_candidato_atual = None
        self._tamanho_lista_indice_anuncio_candidato_atual = None

    def _limpa_lista_tempo(self):
        self._lista_tempo_iteracao = [0] * self.quantidade_anuncios
        self._tempo_total_limites = 0
        self._tempo_total_candidato = 0
        self._tempo_total_first_fit = 0

    def constroi(self, aleatoriedade) -> Solucao:

        self._limpa_construcao()

        self._exibe_iteracao()

        for iteracao in range(self.quantidade_anuncios):

            tempo_iteracao = RegistroTempo()

            self._atualiza_limite_inferior_atual(aleatoriedade)

            indice_selecionado = self._obtem_candidato()

            self._insere_first_fit(indice_selecionado)

            self._exibe_iteracao(iteracao, indice_selecionado)

            self._lista_anuncio_disponivel.remove(indice_selecionado)

            self._lista_tempo_iteracao[iteracao] = tempo_iteracao.finaliza()

        self._exibe_dados_tempo()

        return self.solucao

    def _obtem_candidato(self):

        tempo_candidatos = RegistroTempo()

        if self._lista_indice_anuncio_candidato_atual == None:
            self._atualiza_lista_indice_anuncio_candidato()

        indice_selecionado = self._escolhe_candidato()

        self._tempo_total_candidato = self._tempo_total_candidato + tempo_candidatos.finaliza(
        )

        return indice_selecionado

    def _atualiza_limite_inferior_atual(self, aleatoriedade):

        tempo_limites = RegistroTempo()

        if self._maior_ganho_atual == None or self._menor_ganho_atual == None or self._limite_inferior_atual == None:

            self._atualiza_menor_e_maior_ganhos_disponiveis_atuais()

            self._limite_inferior_atual = self._maior_ganho_atual - aleatoriedade * (
                self._maior_ganho_atual - self._menor_ganho_atual)

            self._lista_indice_anuncio_candidato_atual = None

        self._tempo_total_limites = self._tempo_total_limites + tempo_limites.finaliza(
        )

    def _exibe_dados_tempo(self):
        if EXIBE_TEMPO:
            print(f'\nQuantidade de iterações: {self.quantidade_anuncios}\n')

            print(
                f'Média por iteração: {round(np.average(self._lista_tempo_iteracao) * 100, 1)} ms'
            )
            print(
                f'Iteração mais rápida: {round(np.min(self._lista_tempo_iteracao) * 100, 1)} ms'
            )
            print(
                f'Iteração mais lenta: {round(np.max(self._lista_tempo_iteracao) * 100, 1)} ms\n'
            )

            print(
                f'Tempo total limites: {round(self._tempo_total_limites, 2)} s'
            )
            print(
                f'Tempo total candidatos: {round(self._tempo_total_candidato, 2)} s'
            )
            print(
                f'Tempo total first fit: {round(self._tempo_total_first_fit, 2)} s\n'
            )

            self._tempo_construcao.exibe(1)

    def _atualiza_menor_e_maior_ganhos_disponiveis_atuais(self):

        tempo = RegistroTempo('Obter limites de ganho')
        menor_ganho = self.matriz_anuncio[
            self._lista_anuncio_disponivel[0]][GANHO]
        maior_ganho = self.matriz_anuncio[
            self._lista_anuncio_disponivel[0]][GANHO]

        for i in self._lista_anuncio_disponivel[1:]:
            ganho = self.matriz_anuncio[i][GANHO]
            if ganho < menor_ganho:
                menor_ganho = ganho
            elif ganho > maior_ganho:
                maior_ganho = ganho

        self._menor_ganho_atual = menor_ganho
        self._maior_ganho_atual = maior_ganho
        # tempo.exibe()

    def _atualiza_lista_indice_anuncio_candidato(self):
        tempo = RegistroTempo('Obter candidatos')
        lista_indice = []
        tamanho_lista = 0
        for i in self._lista_anuncio_disponivel:
            anuncio = self.matriz_anuncio[i]
            if anuncio[GANHO] >= self._limite_inferior_atual:
                lista_indice.append(i)
                tamanho_lista = tamanho_lista + 1
        self._lista_indice_anuncio_candidato_atual = lista_indice
        self._tamanho_lista_indice_anuncio_candidato_atual = tamanho_lista
        # tempo.exibe(1)

    def _escolhe_candidato(self):

        indice_sorteado = rd.randint(
            0, self._tamanho_lista_indice_anuncio_candidato_atual - 1)
        indice_candidato = self._lista_indice_anuncio_candidato_atual.pop(
            indice_sorteado)

        tamanho_candidato = self.matriz_anuncio[indice_candidato][GANHO]

        if tamanho_candidato == self._maior_ganho_atual:
            self._maior_ganho_atual = None

        if tamanho_candidato == self._menor_ganho_atual:
            self._menor_ganho_atual = None

        self._tamanho_lista_indice_anuncio_candidato_atual = self._tamanho_lista_indice_anuncio_candidato_atual - 1

        return indice_candidato

    def _insere_first_fit(self, indice_candidato):

        tempo = RegistroTempo('First Fit')
        candidato = self.matriz_anuncio[indice_candidato]
        frequencia_anuncio = candidato[FREQUENCIA]

        lista_indice_quadro_selecionado = []
        contagem_quadros = 0

        for indice_quadro in self.solucao.lista_quadro_disponivel:
            if self.solucao.copia_pode_ser_inserida(indice_candidato,
                                                    indice_quadro):
                lista_indice_quadro_selecionado.append(indice_quadro)
                contagem_quadros = contagem_quadros + 1
                if contagem_quadros == frequencia_anuncio:
                    self.solucao.insere(lista_indice_quadro_selecionado,
                                        indice_candidato)
                    break

        self._tempo_total_first_fit = self._tempo_total_first_fit + tempo.finaliza(
        )
        # tempo.exibe(1)

    def _exibe_iteracao(self, iteracao=None, candidato_selecionado=None):
        if EXIBE_ITERACAO:

            if iteracao != None:
                print(f'\nIteração {iteracao + 1}:')

            df_anuncio = DataFrame(self.matriz_anuncio,
                                   columns=['Tamanho', 'Frequencia', 'Ganho'])

            print('\nAnúncios disponíveis C:')
            print(df_anuncio.filter(self._lista_anuncio_disponivel, axis=0))

            if self._limite_inferior_atual != None:
                print(f'\nLimite inferior: {self._limite_inferior_atual}')

            if self._lista_indice_anuncio_candidato_atual != None:
                print(f'\nCandidatos RC:')
                print(
                    df_anuncio.filter(
                        self._lista_indice_anuncio_candidato_atual, axis=0))

            if candidato_selecionado != None:
                print('\nCandidato selecionado A_j:')
                print(df_anuncio.filter([candidato_selecionado], axis=0))

            print('\nSolução parcial S:')
            print(
                DataFrame(self.solucao.matriz_solucao,
                          columns=['Espaço ocupado', 'Anúncios inseridos']))

            print('\n==================================\n')