Exemplo n.º 1
0
    def _gerar_solucoes_avalia(self):
        self._iteracao += 1
        self.log(texto="Calculando nova populacao.")
        for ii in range(self._tamanho_populacao):
            self._id += 1
            solucao = Solucao(id=self._id,
                              iteracao=self._iteracao,
                              solucao=self._solucao_base)

            for jj in range(len(self._populacao[ii]['posicao'])):
                nome = self._populacao[ii]['variavel'][jj]['nome']
                posicao = self._populacao[ii]['variavel'][jj]['posicao']

                try:
                    solucao.variaveis.set_variavel_posicao_by_nome(
                        nome, posicao)
                except Exception as ex:
                    self.log(tipo=EnumLogStatus.ERRO,
                             texto="Erro ao setar variavel",
                             info_ex=str(ex))
                    solucao.variaveis.set_variavel_posicao_by_nome(nome, 0)

            solucao.geral = "[PSO] "
            self._solucoes.add_in_solucoes(solucao)

            self._populacao[ii]['id'] = solucao.id
            self._populacao[ii]['of'] = Solucao.of_padrao(
                direcao=self._direcao_of)

        self._contexto.set_atributo(EnumAtributo.SOLUCOES, self._solucoes,
                                    True)
        self._contexto.set_atributo(EnumAtributo.AVALIACAO_ITERACAO_AVALIAR,
                                    [self._iteracao], True)
Exemplo n.º 2
0
    def _evaluate(self, x, out, *args, **kwargs):
        if len(kwargs) == 0:
            return

        iteracao_max = max(list(self._solucoes.solucoes))
        iteracao_atual = iteracao_max + 1
        id = max(list(self._solucoes.solucoes[iteracao_max])) + 1

        Loggin().log(arquivo=__name__, tipo=EnumLogStatus.INFO, texto=f"Inicializando o Calculo para geração [{iteracao_atual}]")

        solucao_base: Solucao = self._contexto.get_atributo(EnumAtributo.SOLUCAO_BASE)

        for ii in range(x.shape[0]):
            solucao_nova = Solucao(id, iteracao_atual, solucao_base)
            id += 1
            variavies = solucao_base.get_variavies_by_tipo()
            jj = 0
            for variavel in variavies:
                try:
                    solucao_nova.variaveis.get_variavel_by_nome(variavel).posicao = int(x[ii][jj])
                except ValueError as ex:
                    Loggin().log(arquivo=__name__, texto="Valor for do limite", info_ex=str(ex))

                jj += 1
            solucao_nova.geral = f'[{self._otimizador}]'
            self._solucoes.add_in_solucoes(solucao_nova)

        self._contexto.set_atributo(EnumAtributo.SOLUCOES, self._solucoes, True)
        self._contexto.set_atributo(EnumAtributo.AVALIACAO_ITERACAO_AVALIAR, [iteracao_atual], True)

        Loggin().log(arquivo=__name__, tipo=EnumLogStatus.INFO, texto=f"Iniciando avaliação.")
        avaliacao = self._contexto.get_modulo(EnumModulo.AVALIACAO)
        self._contexto = avaliacao.run(self._contexto)
        self._solucoes = self._contexto.get_atributo(EnumAtributo.SOLUCOES)

        f1 = np.zeros((len(self._solucoes.solucoes[iteracao_atual]), self._n_obj))
        g1 = np.zeros((len(self._solucoes.solucoes[iteracao_atual]), self._n_obj))

        for ii in self._solucoes.solucoes[iteracao_atual]:
            try:
                posicao = ii - list(self._solucoes.solucoes[iteracao_atual])[0]
                n_of = 0
                for nome_of in sorted(self._nomes_direcoes_of):
                    # para minimizar precisa ser -1 o valor padrão.
                    direcao_of_valor = 1
                    if EnumValues.MIN.name in self._nomes_direcoes_of[nome_of][EnumValues.DIRECAO.name]:
                        direcao_of_valor = -1
                    if self._solucoes.solucoes[iteracao_atual][ii].has_erro is None:
                        f1[posicao][n_of] = -1 * self._solucoes.solucoes[iteracao_atual][ii].of[nome_of].valor * direcao_of_valor
                        g1[posicao][n_of] = -1 * self._solucoes.solucoes[iteracao_atual][ii].of[nome_of].valor * direcao_of_valor
                    else:
                        f1[posicao][n_of] = -1 * Solucao.of_padrao(self._nomes_direcoes_of[nome_of][EnumValues.DIRECAO.name])
                        g1[posicao][n_of] = -1 * Solucao.of_padrao(self._nomes_direcoes_of[nome_of][EnumValues.DIRECAO.name])
                    n_of += 1
            except Exception as ex:
                Loggin().log(arquivo=__name__, tipo=EnumLogStatus.ERRO, texto=f"Não foi possivel ler of da solucao [{ii}] geracao [{iteracao_atual}].")

        out["F"] = f1
        out["G"] = g1
        self._salvar()
Exemplo n.º 3
0
    def run(self, contexto: Contexto):
        """
        Metodo responsavel por simular de forma total as melhores simulacoes ao ser utilizado
        redutor com simulacao parcial

        :param Contexto contexto: contexto com todas as informações necessárias
        """
        super(SimulacaoTotal, self).run(contexto)

        n_melhores = 10

        solucoes = self._contexto.get_atributo(EnumAtributo.SOLUCOES)

        iteracao_sim_total = max(map(int, solucoes.solucoes)) + 1

        melhores_solucoes = solucoes.conjunto_melhores_solucoes(
            n_melhores).solucoes

        for it in melhores_solucoes:
            for id in melhores_solucoes[it]:
                solucao_sim_total = melhores_solucoes[it][id]

                solucao = Solucao(id=id,
                                  iteracao=iteracao_sim_total,
                                  solucao=solucao_sim_total)

                self.log(
                    arquivo=__name__,
                    texto=
                    f'Solucao de it={it}, id={id} sera simulado de forma total'
                )
                solucao.geral = f'SIMULACAO TOTAL do it = {it} id = {id}'
                solucoes.add_in_solucoes(solucao)

        self._contexto.set_atributo(EnumAtributo.SOLUCOES, solucoes, True)
        self._contexto.set_atributo(EnumAtributo.AVALIACAO_ITERACAO_AVALIAR,
                                    [iteracao_sim_total], True)

        gevts_templates = self._contexto.get_gevts_templates(
            self._contexto.get_atributo(
                EnumAtributo.AVALIACAO_MERO_GEVT_TEMPLATE))
        self._contexto.set_atributo(
            EnumAtributo.AVALIACAO_MERO_GEVTS_TEMPLATES_EXECUTAR,
            gevts_templates, True)
        self._contexto.set_atributo(EnumAtributo.AVALIACAO_QUALIFICADOR,
                                    EnumValues.TOTAL.name, True)

        avaliacao = self._contexto.get_modulo(EnumModulo.AVALIACAO)

        self._contexto = avaliacao.run(self._contexto)

        Exportacao().csv(self._contexto)
        Exportacao().obejto(self._contexto)
Exemplo n.º 4
0
    def _nova_solucao_aleatoria(self, index_fc, iteracao, id, prefixo):
        solucao = copy.deepcopy(
            self._solucoes.get_solucao_by_iteracao_id(
                self._fontes_alimento[index_fc].iteracao,
                self._fontes_alimento[index_fc].id))
        variaveis = copy.deepcopy(solucao.get_variavies_by_tipo())
        for nome_var in variaveis:
            lim_inferior = 0
            lim_superior = len(variaveis[nome_var].dominio.niveis) - 1
            posicao = random.randint(
                lim_inferior,
                lim_superior)  # ajuste para inteiro, equação [ref:2].5
            variaveis[nome_var].posicao = posicao
            solucao.variaveis.set_variavel_posicao_by_nome(
                variaveis[nome_var].nome, variaveis[nome_var].posicao)

        solucao_nova = Solucao(iteracao=iteracao, id=id, solucao=solucao)
        solucao_nova.geral = f'[ABC][Aleatoria][{prefixo}]'
        return solucao_nova
Exemplo n.º 5
0
    def _nova_solucao(self, index_fc_selecionada, iteracao, id,
                      prefixo) -> Solucao:
        solucao_fonte = copy.deepcopy(
            self._solucoes.get_solucao_by_iteracao_id(
                self._fontes_alimento[index_fc_selecionada].iteracao,
                self._fontes_alimento[index_fc_selecionada].id))
        solucao_nova = Solucao(iteracao=iteracao, id=id, solucao=solucao_fonte)
        solucao_nova.geral = f'[ABC][Vizinhanca][{prefixo}]'
        try:
            from random import sample
            index_variaveis_sorteio = sample(
                range(0, len(self._lista_variaveis)),
                len(self._lista_variaveis))
            index_fonte_alimento_sorteio = sample(
                range(0, len(self._fontes_alimento)),
                len(self._fontes_alimento))

            fonte_vizinha_index = index_fonte_alimento_sorteio.pop(0)
            while fonte_vizinha_index == index_fc_selecionada:
                fonte_vizinha_index = index_fonte_alimento_sorteio.pop(0)
            fonte_vizinha = self._fontes_alimento[fonte_vizinha_index]

            contador_existem = 0
            limites_random = 1
            while self._solucoes.existe_solucao(solucao_nova):
                contador_existem += 1
                variavel_modificar = self._lista_variaveis[
                    index_variaveis_sorteio.pop(0)]
                dominio_niveis = len(solucao_nova.get_variavies_by_tipo()
                                     [variavel_modificar].dominio.niveis)

                posicao_fonte = solucao_nova.get_variavies_by_tipo(
                )[variavel_modificar].posicao
                posicao_vizinha = self._solucoes.get_solucao_by_iteracao_id(
                    fonte_vizinha.iteracao, fonte_vizinha.id
                ).get_variavies_by_tipo()[variavel_modificar].posicao

                r = random.uniform(-1 * limites_random, limites_random)
                # gera valores entre -1 e 1, equacao [ref:2].6 | estamos gerando entre -2 e 2 para aumentar variabilidade visto que são inteiros
                posicao_nova = max(
                    min(
                        dominio_niveis - 1,
                        math.ceil(posicao_fonte +
                                  (posicao_fonte - posicao_vizinha) * r)), 0)
                posicao_antiga = solucao_nova.get_variavies_by_tipo(
                )[variavel_modificar].posicao
                if posicao_antiga == posicao_nova:
                    if posicao_nova == dominio_niveis - 1:
                        posicao_nova += -1
                    elif posicao_nova == 0:
                        posicao_nova += 1
                    else:
                        posicao_nova += random.sample([-1, 1], 1)[0]
                self.log(
                    texto=
                    f'[{variavel_modificar} | {posicao_antiga} > {posicao_nova}]'
                )
                solucao_nova.get_variavies_by_tipo(
                )[variavel_modificar].posicao = posicao_nova
                if limites_random >= 10:
                    break

                if len(index_variaveis_sorteio) <= 0:
                    limites_random += 0.1
                    index_variaveis_sorteio = sample(
                        range(0, len(self._lista_variaveis)),
                        len(self._lista_variaveis))

                    if len(index_fonte_alimento_sorteio) <= 0:
                        index_fonte_alimento_sorteio = sample(
                            range(0, len(self._fontes_alimento)),
                            len(self._fontes_alimento))

                    fonte_vizinha_index = index_fonte_alimento_sorteio.pop(0)
                    while fonte_vizinha_index == index_fc_selecionada:
                        if len(index_fonte_alimento_sorteio) <= 0:
                            index_fonte_alimento_sorteio = sample(
                                range(0, len(self._fontes_alimento)),
                                len(self._fontes_alimento))
                        fonte_vizinha_index = index_fonte_alimento_sorteio.pop(
                            0)

                    fonte_vizinha = self._fontes_alimento[fonte_vizinha_index]

            self.log(
                texto=
                f'Tentativas para nova solucao [{contador_existem}] e Limite em [{limites_random:.2f}].'
            )
        except Exception as ex:
            self.log(tipo=EnumLogStatus.ERRO_FATAL,
                     texto="Erro para obter nova solucao.",
                     info_ex=str(ex))

        return solucao_nova
Exemplo n.º 6
0
    def _iniciar_fonte_alimento(self):
        self.log(tipo=EnumLogStatus.INFO,
                 texto='Iniciando as fonte de alimento.')
        self._existe_solucao_avaliar = False

        # resume de um otimizador diferente
        if self._iteracao > 1 and self._iteracao != self._ultima_iteracao:
            self._fontes_alimento = []
            solucoes_melhores = self._solucoes.conjunto_melhores_solucoes(
                quantidade=self._qtd_fonte_alimento,
                nome_of_mono=self._nome_of_mono).solucoes
            for iteracao in solucoes_melhores:
                for id in solucoes_melhores[iteracao]:
                    fonte_alimento = FonteAlimento(
                        iteracao, id, solucoes_melhores[iteracao][id].of[
                            self._nome_of_mono].direcao)
                    fonte_alimento.of = solucoes_melhores[iteracao][id].of[
                        self._nome_of_mono].valor
                    self._fontes_alimento.append(fonte_alimento)

        # resume do ABC
        if self._iteracao > 1 and self._iteracao == self._ultima_iteracao:
            qtd_solucoes_melhores = self._qtd_fonte_alimento - len(
                self._fontes_alimento)
            solucoes_melhores = self._solucoes.conjunto_melhores_solucoes(
                quantidade=qtd_solucoes_melhores,
                nome_of_mono=self._nome_of_mono).solucoes
            for iteracao in solucoes_melhores:
                for id in solucoes_melhores[iteracao]:
                    fonte_alimento = FonteAlimento(
                        iteracao, id, solucoes_melhores[iteracao][id].of[
                            self._nome_of_mono].direcao)
                    fonte_alimento.of = solucoes_melhores[iteracao][id].of[
                        self._nome_of_mono].valor
                    self._fontes_alimento.append(fonte_alimento)

        # default
        if self._qtd_fonte_alimento != len(self._fontes_alimento):
            self._iteracao += 1
            while self._qtd_fonte_alimento > len(self._fontes_alimento):
                self._id += 1
                solucao = Solucao(iteracao=self._iteracao,
                                  id=self._id,
                                  solucao=self._solucao_base)
                solucao.geral = '[ABC][Aleatorio][Inicio]'

                variaveis = copy.deepcopy(solucao.get_variavies_by_tipo())
                for nome_var in variaveis:
                    lim_inferior = 0
                    lim_superior = len(variaveis[nome_var].dominio.niveis) - 1
                    posicao = random.randint(
                        lim_inferior,
                        lim_superior)  # ajuste para inteiro, equação [ref:2].5
                    variaveis[nome_var].posicao = posicao
                    solucao.variaveis.set_variavel_posicao_by_nome(
                        variaveis[nome_var].nome, variaveis[nome_var].posicao)

                if self._solucoes.existe_solucao(solucao):
                    self._id -= 1
                else:
                    self._solucoes.add_in_solucoes(solucao)
                    self._fontes_alimento.append(
                        FonteAlimento(solucao.iteracao, solucao.id,
                                      solucao.of[self._nome_of_mono].direcao))
                    self._existe_solucao_avaliar = True
                    # self.log(tipo=EnumLogStatus.INFO, texto=solucao.to_string())
            self._avaliar()