示例#1
0
    def gerarOpcoes(self,node_entrada):

        chaves = []
        
        auxPuzzle = copy.deepcopy(node_entrada.puzzle)
        chaves = auxPuzzle.liberadaOpcoes()

        for x in range(4):
            if chaves[x] == False:
                chaves[x] = None
            else:
                movimento = copy.deepcopy(auxPuzzle)
                if (x == 0):
                    movimento.moverCima()
                elif (x == 1):
                    movimento.moverBaixo()
                elif (x == 2):
                    movimento.moverDireita()
                elif (x == 3):
                    movimento.moverEsquerda()
                else:
                    exit('ERRRRRO')

                chaves[x] = node(eightPuzzle(movimento.getConteudo()))
                chaves[x].pai = node_entrada
                #retorna uma lista de strings!
        return chaves
示例#2
0
    def aEstrela(self, inicio,fim):
        tic = time.perf_counter()
        print('Iniciando A*()')

        #Iniciando Lista 
        listona = Blista()
        listona.insertHead(node(inicio))

        if(self.debug == 1):    
            print ("Folha add e filhos:", listona.readHead().id_puzzle)
            print('Next ----------------------------------------------')

        #Resultado buscado
        last_leaf = node(fim)

        #Enquanto o puzzle não esta na busca continuar buscando... 
        while (listona.readNode(last_leaf) == None):
            folhas = listona.readLeaf()

            for x in range(len(folhas)):
                if(self.debug == 1):
                        print("Tranalhando com a folha: ",folhas[x])

                #abre todas as possibilidades do node atual
                opcoesFolhas = self.gerarOpcoes(folhas[x])
                folhas[x].keys = opcoesFolhas 

                #adiciona o valor da folha atual
                folhas[x].heuristica = self.gerarDistanciaManhattan(folhas[x],last_leaf)
                folhas[x].custo = len(listona.readNode(folhas[x]))

                #update da folha
                listona.updateNode(folhas[x])
    
                opcoesCusto= [1000,1000,1000,1000]

                opcaomenorCusto = []
                for opcoes in range(4):
                #busca o menor numero de heuristica
                    if(opcoesFolhas[opcoes] != None):
                        opcoesCusto[opcoes] = self.gerarDistanciaManhattan(opcoesFolhas[opcoes], last_leaf) + (folhas[x].custo + 1)
                        if(opcoesCusto[opcoes] == min(opcoesCusto)):
                            opcaomenorCusto.append(opcoesFolhas[opcoes])
                            if(self.debug == 1):
                                print("Menor VALOR de custo!")
                        
                        if(self.debug == 1 and opcoesCusto[opcoes] >1000):
                            print("Valor maior que 1000 encontrado!")

                        if(opcoesFolhas[opcoes].id_puzzle == last_leaf.id_puzzle):
                            if(self.debug == 1):
                                print("VALOR ENCONTRADO!")

                        if(self.debug == 1):
                            print ("Folha add e filhos:", opcoesFolhas[opcoes].id_puzzle)
                
                #adiciona ele e reinicia o processo
                for nodeMenores in opcaomenorCusto:
                    listona.insertTail(nodeMenores,self.debug)

            if(self.debug == 1):
                print('Next ----------------------------------------------')

        #Mostar Caminho. 
        if(self.debug == 1):
            print ("Chegou no final!")

        #timer!!!
        aestrela_result={
            'TEMPO':    time.perf_counter() - tic,
            'N_NODE' :    listona.total_nodes,
            'E_MEMORIA':sys.getsizeof(listona)+sys.getsizeof(fim)+sys.getsizeof(folhas)+sys.getsizeof(inicio)+sys.getsizeof(last_leaf)+sys.getsizeof(nodeMenores)+sys.getsizeof(opcaomenorCusto)+sys.getsizeof(opcoes)+sys.getsizeof(opcoesCusto)+sys.getsizeof(opcoesFolhas)+sys.getsizeof(self)+sys.getsizeof(tic)+sys.getsizeof(x),
            'MOVIMENTOS':list(reversed(listona.readNode(last_leaf))),
            'N_MOVIMENTOS': 0,
            'tipo':7
        }
        aestrela_result['N_MOVIMENTOS'] = len(aestrela_result['MOVIMENTOS'])
        return aestrela_result
示例#3
0
    def amplitude(self,inicio,fim):
        tic = time.perf_counter()
        #vieww = View()
        print('Iniciando amplitude()')
        listona = Blista()
        listona.insertHead(node(inicio))
        if(self.debug == 1):    
            print ("Folha add e filhos:", listona.readHead().id_puzzle)
            print('Next ----------------------------------------------')

        last_leaf = node(fim)

        #return None = ruim node = good
        #Enquanto não tem na lista cintinua
        while (listona.readNode(last_leaf) == None):   
            #vieww.progressBar('Número de Tentativas: ',vieww.addCount(),'Tempo:')
            #tem que add na arvore os novos caminhos
            
            #pega o conteudo das folhas e bota na lista 
            folhas = listona.readLeaf()

            #Faz o insert de cada folha 
            for x in  range(len(folhas)):
                if(self.debug == 1):
                    print("Tranalhando com a folha: ",x)

                opcoesFolhas = self.gerarOpcoes(folhas[x])
                
                folhas[x].keys = opcoesFolhas 

                #update da folha
                listona.updateNode(folhas[x])

                ##inserir os filhos
                for opcoes in opcoesFolhas:
                    if(opcoes != None):
                        listona.insertTail(opcoes,self.debug) 
                        if(opcoes.id_puzzle == last_leaf.id_puzzle):
                            if(self.debug == 1):
                                print("VALOR ENCONTRADO!")

                        if(self.debug == 1):
                            print ("Folha add e filhos:", opcoes.id_puzzle)
                        
            if(self.debug == 1):
                print('Next ----------------------------------------------')


        #Mostar Caminho. 
        if(self.debug == 1):
            print ("Chegou no final!")

        #timer!!!
        amplitude_result={
            'TEMPO_AMPLITUDADE':    time.perf_counter() - tic,
            'N_NODE_AMPLITUDE' :    listona.total_nodes,
            'E_MEMORIA':sys.getsizeof(listona)+sys.getsizeof(fim)+sys.getsizeof(folhas)+sys.getsizeof(inicio)+sys.getsizeof(last_leaf)+sys.getsizeof(opcoes)+sys.getsizeof(opcoesFolhas)+sys.getsizeof(self)+sys.getsizeof(tic)+sys.getsizeof(x),
            'MOVIMENTOS_AMPLITUDE':list(reversed(listona.readNode(last_leaf))),
            'N_MOVIMENTOS': 0,
            'tipo':0
        }
        amplitude_result['N_MOVIMENTOS'] = len(amplitude_result['MOVIMENTOS_AMPLITUDE'])
        return amplitude_result
示例#4
0
    def bidirecional(self,inicio,fim):
        tic = time.perf_counter()
        print("Começando Bidirecional()")
        listaInicio = Blista()
        listaFim = Blista()

        listaInicio.insertHead(node(inicio))
        listaFim.insertHead(node(fim))

        listaSaida = Blista()
        saida = True
        while saida:

            #Primeira Lista
            #Pega o conteudo das folhas e bota na lista
            folhas_l1 = listaInicio.readLeaf()
            folhas_l2 = listaFim.readLeaf()

            #Verificar se um existe no outro (folhas com folhas)
            for folhas_l in folhas_l1:
                node_fim = listaFim.readNode(folhas_l)
                if(node_fim != None):
                    #verifica qual filho (movimento) e o da esquerda e liga o resto dos pontos na impressao
                    nota_atual = folhas_l
                    opcoesFolhas = self.gerarOpcoes(nota_atual)

                    for opcoes in opcoesFolhas:
                        for nodenofim in node_fim:
                            if(opcoes != None and opcoes.id_puzzle == nodenofim.id_puzzle):
                                if(self.debug == 1):
                                    print("Localizado!")

                                for pais in list(reversed(listaInicio.readNode(nota_atual))):   
                                    pais.proximo = None
                                    pais.anterior = None 
                                    listaSaida.insertTail(pais)
                                
                                for pais_fim in node_fim:
                                    pais_fim.proximo = None
                                    pais_fim.anterior = None 
                                    listaSaida.insertTail(pais_fim)
                                
                                bidirecional = {
                                    'TEMPO_BIDIRECIONAL':time.perf_counter() - tic,
                                    'N_NODE_BIDIRECIONAL':listaFim.total_nodes + listaInicio.total_nodes,
                                    'N_MOVIMENTOS_BIDIRECIONAL':0,
                                    'E_MEMORIA_BIDIRECIONAL':sys.getsizeof(listaInicio)+sys.getsizeof(listaFim)+sys.getsizeof(listaSaida)+sys.getsizeof(fim)+sys.getsizeof(folhas_l)+sys.getsizeof(folhas_l1)+sys.getsizeof(folhas_l2)+sys.getsizeof(inicio)+sys.getsizeof(node_fim)+sys.getsizeof(nodenofim)+sys.getsizeof(opcoes)+sys.getsizeof(opcoesFolhas)+sys.getsizeof(pais)+sys.getsizeof(pais_fim)+sys.getsizeof(saida)+sys.getsizeof(self)+sys.getsizeof(tic),
                                    'MOVIMENTOS_BIDIRECIONAL':listaSaida.readAll(),
                                    'tipo':4
                                }

                                bidirecional['N_MOVIMENTOS_BIDIRECIONAL'] = len(bidirecional['MOVIMENTOS_BIDIRECIONAL'])
                                return bidirecional

            #lista de inicio
            for folha in range(len(folhas_l1)):
                if(self.debug == 1):
                    print("Tranalhando com a folha (Lista 1): ",folhas_l1[folha].id_puzzle)

                opcoesFolhas = self.gerarOpcoes(folhas_l1[folha])

                #associar as folhas
                folhas_l1[folha].keys = opcoesFolhas 

                #update da folha
                listaInicio.updateNode(folhas_l1[folha])

                for opcoes in opcoesFolhas:
                    if(opcoes != None):
                        listaInicio.insertTail(opcoes,self.debug) 

                        if(self.debug == 1):
                            print ("Folha add e filhos:", opcoes.id_puzzle)

            #lista de fim
            for folha in range(len(folhas_l2)):
                if(self.debug == 1):
                    print("Tranalhando com a folha (Lista 2): ",folhas_l2[folha].id_puzzle)

                opcoesFolhas = self.gerarOpcoes(folhas_l2[folha])

                #associar as folhas
                folhas_l2[folha].keys = opcoesFolhas 

                #update da folha
                listaFim.updateNode(folhas_l2[folha])

                for opcoes in opcoesFolhas:
                    if(opcoes != None):
                        listaFim.insertTail(opcoes,self.debug) 

                        if(self.debug == 1):
                            print ("Folha add e filhos:", opcoes.id_puzzle)
示例#5
0
    def aprofundamento_iterativo(self,inicio,fim, l_max):
        tic = time.perf_counter()
        print("Começando aprofundamento_iterativo()")
        last_leaf = node(fim)

        boardVisited = Blista()
        boardVisited.insertHead(node(inicio))

        for limite in range(1,l_max+1):
            stack = list(boardVisited.readLeaf())
            if(self.debug == 1):
                print("Limite:",limite," de ",l_max+1)

            while stack != []:

                #verifica se já foi encontrado
                # profundidade = boardVisited.readNode(last_leaf)
                # if(profundidade != None):
                #     if(self.debug == 1):
                #         print("Node encontrado!")
                #     return profundidade



                node_atual = stack.pop()
                if(self.debug == 1):
                    print("Tranalhando com a folha: ",node_atual.id_puzzle)


                #verifica a profundidade
                if(len(boardVisited.readNode(node_atual)) > limite):
                    if(self.debug == 1):
                        print("Profunidade Atingiu o limite")
                    break
                    return ["Erro","Limite Max"]

                #verifica se o node_atual é igual ao objetivo
                if(node_atual.id_puzzle == last_leaf.id_puzzle):
                    print("Node encontrada")
                    last_leaf = node_atual
                    boardVisited.updateNode(last_leaf)
                    # return last_leaf

                    saida = reversed(boardVisited.readNode(last_leaf))
                    aprofudamento_iterativo_result ={
                        'TEMPO_APROFUNDAMENTO':time.perf_counter() -tic,
                        'N_NODE_APROFUNDAMENTO':boardVisited.total_nodes,
                        'N_MOVIMENTOS_APROFUNDAMENTO':0,
                        'E_MEMORIA_APROFUNDAMENTO':sys.getsizeof(boardVisited)+sys.getsizeof(fim)+sys.getsizeof(inicio)+sys.getsizeof(l_max)+sys.getsizeof(last_leaf)+sys.getsizeof(limite)+sys.getsizeof(node_atual)+sys.getsizeof(path)+sys.getsizeof(saida)+sys.getsizeof(self)+sys.getsizeof(stack)+sys.getsizeof(tic),
                        'LIMITE_MAXIMO_PROFUNDIDADE':1100,
                        'MOVIMENTOS_APROFUNDAMENTOE':list(saida),
                        'tipo':3
                    }
                    aprofudamento_iterativo_result['N_MOVIMENTOS_APROFUNDAMENTO'] = len(aprofudamento_iterativo_result['MOVIMENTOS_APROFUNDAMENTOE'])
                    return aprofudamento_iterativo_result
                    break
    
                #Pesquisa os filhos!
                opcoesFolhas = self.gerarOpcoes(node_atual)

                node_atual.keys = opcoesFolhas
                boardVisited.insertTail(node_atual)

                #implementa os filhos
                for path in opcoesFolhas:
                    if (path != None and boardVisited.readNode(path) == None):
                        # stack.append(path)
                        boardVisited.insertTail(path)
                        if(self.debug == 1):
                                print ("Folha add e filhos:", path.id_puzzle)
                    elif(path != None ):
                        if(self.debug == 1):
                            print ("Folha já foi add:")  
                #Atualiza o node
                


                if(self.debug == 1):
                    print('Next ----------------------------------------------')

        saida = reversed(boardVisited.readNode(last_leaf))
        aprofudamento_iterativo_result ={
            'TEMPO_APROFUNDAMENTO':time.perf_counter() -tic,
            'N_NODE_APROFUNDAMENTO':boardVisited.total_nodes,
            'N_MOVIMENTOS_APROFUNDAMENTO':0,
            'E_MEMORIA_APROFUNDAMENTO':sys.getsizeof(boardVisited),
            'LIMITE_MAXIMO_PROFUNDIDADE':1100,
            'MOVIMENTOS_APROFUNDAMENTOE':list(saida),
            'tipo':3
        }

        if(saida == None):
            return ["Erro","Caminho não encontrado"]
        else:
            aprofudamento_iterativo_result['N_MOVIMENTOS_APROFUNDAMENTO'] = len(aprofudamento_iterativo_result['MOVIMENTOS_APROFUNDAMENTOE'])
            return aprofudamento_iterativo_result
示例#6
0
    def profundidade_limitada(self,inicio,fim,limite):
        tic = time.perf_counter()
        print("iniciando profundidade_limitada")
        last_leaf = node(fim)

        boardVisited = Blista()
        stack = list([node(inicio)])
        
        while stack:
            
            node_atual = stack.pop()
            if(self.debug == 1):
                print("Trabalhando com a folha: ",node_atual.id_puzzle)
            boardVisited.insertTail(node_atual)

            #Verifica se é o node atual!
            if node_atual.id_puzzle == last_leaf.id_puzzle:
                print("ACHOU!!!!!!!!!!!!")
                last_leaf=node_atual
                boardVisited.updateNode(last_leaf)
                break
            #Inverse the order of next paths for execution porpuses
            if( len(boardVisited.readNode(node_atual)) > limite):
                return ["erro","Limite max"]

            #Opcoes
            opcoesFolhas = self.gerarOpcoes(node_atual)

            #implementa os filhos
            for path in opcoesFolhas:
                if (path != None and boardVisited.readNode(path) == None):
                    stack.append(path)
                    # boardVisited.insertTail(path)
                    if(self.debug == 1):
                            print ("Folha add e filhos:", path.id_puzzle)
                elif(path != None ):
                    if(self.debug == 1):
                        print ("Folha já foi add:")  

            
            if(self.debug == 1):
                print('Next ----------------------------------------------')
        #Mostar Caminho. 
        if(self.debug == 1):
            print ("Chegou no final!")

        profundidade_limitada_result = {
            'TEMPO_PROFUNDIDADE_LIMITADA':time.perf_counter() - tic,
            'N_NODE_PROFUNDIDADE_LIMITADA':boardVisited.total_nodes,
            'N_MOVIMENTOS_PROFUNDIDADE_LIMITADA':0,
            'E_MEMORIA_PROFUNDIDADE':sys.getsizeof(boardVisited)+sys.getsizeof(fim)+sys.getsizeof(inicio)+sys.getsizeof(last_leaf)+sys.getsizeof(limite)+sys.getsizeof(node_atual)+sys.getsizeof(opcoesFolhas)+sys.getsizeof(path)+sys.getsizeof(self)+sys.getsizeof(stack)+sys.getsizeof(tic),
            'Limite_PROFUNDIDADE_LIMITADA':1000,
            'MOVIMENTOS_PROFUNDIDADE_LIMITADA' : list(reversed(boardVisited.readNode(last_leaf))),
            'tipo':2
        }

        if(boardVisited.readNode(last_leaf) == None):
            return ["Caminho não encontrado"]
        else:
            profundidade_limitada_result['N_MOVIMENTOS_PROFUNDIDADE_LIMITADA']= len(profundidade_limitada_result['MOVIMENTOS_PROFUNDIDADE_LIMITADA'])
            return profundidade_limitada_result 
示例#7
0
    def profundidade(self,inicio,fim):
        tic = time.perf_counter()
        print ("Iniciando profundidade()")

        last_leaf = node(fim)

        boardVisited = Blista()
        stack = list([node(inicio)])
        
        while stack:
            if(self.debug == 2):
                print("Stank bem grande", len(stack))

            node_atual = stack.pop()
            if(self.debug == 1):
                print("Tranalhando com a folha: ",node_atual.id_puzzle)
            boardVisited.insertTail(node_atual)

            if node_atual.id_puzzle == last_leaf.id_puzzle:
                print("ACHOU!!!!!!!!!!!!")
                last_leaf=node_atual
                boardVisited.updateNode(last_leaf)
                break
            #Inverse the order of next paths for execution porpuses

            #Opcoes
            opcoesFolhas = self.gerarOpcoes(node_atual)

            #Arrumar aqui!!!!!
            for path in opcoesFolhas:
                if (path != None and boardVisited.readNode(path) == None):
                    stack.append(path)
                    # boardVisited.insertTail(path)
                    if(self.debug == 1):
                            print ("Folha add e filhos:", path.id_puzzle)
                elif(path != None ):
                    if(self.debug == 1):
                        print ("Folha já foi add:")  

            
            if(self.debug == 1):
                print('Next ----------------------------------------------')
        #Mostar Caminho. 
        if(self.debug == 1):
            print ("Chegou no final!")

        saida = reversed(boardVisited.readNode(last_leaf))
        
        profundidade_result ={
            'TEMPO_PROFUNDIDADE':time.perf_counter() - tic,
            'N_NODE_PROFUNDIDADE': boardVisited.total_nodes,
            'E_MEMORIA_PROFUNDIDADE':sys.getsizeof(boardVisited)+sys.getsizeof(fim)+sys.getsizeof(inicio)+sys.getsizeof(last_leaf)+sys.getsizeof(node_atual)+sys.getsizeof(opcoesFolhas)+sys.getsizeof(path)+sys.getsizeof(saida)+sys.getsizeof(self)+sys.getsizeof(stack)+sys.getsizeof(tic),
            'N_MOVIMENTOS_PROFUNDIDADE':0,
            'MOVIMENTOS_PROFUNDIDADE':list(saida),
            'tipo':1
        }

        if(saida == None):
            return ["Caminho não encontrado"]
        else:
            profundidade_result['N_MOVIMENTOS_PROFUNDIDADE'] = len(profundidade_result['MOVIMENTOS_PROFUNDIDADE'])
            return profundidade_result