예제 #1
0
    def _ligacoes(self):
        """Retorna uma lista de prioridades contendo dicios
        campos origem, destino e ligação"""
        ligacoes = Heap(lambda x1, x2: IGUAIS if x1 == x2 else min(x1, x2))

        for v1, lig, v2 in self._vertices_ligacoes():
            ligacoes.inserir((v1.item, lig, v2.item),
                             lig.get('distancia', INFINITO))

        return ligacoes
예제 #2
0
def BuscaAEstrela(mapa, partida, destino):
    '''
        Busca A* em um mapa
    '''
    #inicializa a busca a partir do nó de partida
    t = TreeNode({"key":partida, "cost":mapa.getHeuristica(partida, destino)})
    lista = Heap()
    custoAtual = 0
    while(t.data["key"] != destino):
        # adiciona o custo atual + heuristica + custo até o nó
        vizinhos = mapa.getVizinhos(t.data["key"])
        vizinhos = [
            {
                "key":v,
                "cost": custoAtual + mapa.getHeuristica(v, destino) + mapa.getDistancia(t.Key(), v)
            }
            for v in vizinhos
        ]

        # AddChildren retorna os nós inseridos na árvore
        vizinhos = t.AddChildren(vizinhos)

        # monsta uma lista com novos vizinhos
        lista.append(vizinhos)

        # remove o menor da lista e soma o custo real
        newT = lista.pop(lambda x: x.Cost())
        custoAtual += mapa.getDistancia(t.Key(), newT.Key())
        t = newT
    
    #retorna o caminho em uma lista de keys
    caminho = [t.Key()]
    while t.father is not None:
        t = t.father
        caminho.append(t.Key())
    caminho.reverse()
    return caminho
예제 #3
0
def teste_oPropriedade_topt_iraGerarUmErroSeOHeapEstiverVazio():
    with raises(FalhaNaOperacao):
        Heap(None).topo
예제 #4
0
def arvorePronta():
    nums = Heap(lambda x1, x2: IGUAIS if x1 == x2 else max(x1, x2))
    nums.inserir(0)
    nums.inserir(1)
    nums.inserir(2)
    nums.inserir(3)
    nums.inserir(4)
    nums.inserir(5)
    nums.inserir(6)
    nums.inserir(7)
    nums.inserir(8)

    return nums
예제 #5
0
def testes_metodo_inserir():
    heap = Heap(lambda x1, x2: IGUAIS if x1 == x2 else max(x1, x2))

    heap.inserir(0)
    heap.inserir(1)

    assert heap.pai(0) is 1
    assert heap.filhos(0) == tuple()
    assert heap.filhos(1) == (0, )

    heap.inserir(2)

    assert heap.pai(0) is heap.pai(1) is 2
    assert heap.filhos(0) == heap.filhos(1) == tuple()
    assert heap.filhos(2) == (0, 1)

    heap.inserir(3)

    assert heap.filhos(3) == (2, 1)
    assert heap.filhos(2) == (0, )
    assert heap.filhos(0) == heap.filhos(1) == tuple()
    assert heap.pai(2) is heap.pai(1) is 3
    assert heap.pai(0) is 2

    heap.inserir(4)

    assert heap.filhos(4) == (3, 1)
    assert heap.filhos(3) == (0, 2)
    assert heap.filhos(0) == heap.filhos(2) == heap.filhos(1) == tuple()
    assert heap.pai(3) is heap.pai(1) is 4
    assert heap.pai(0) is heap.pai(2) is 3

    heap.inserir(5)

    assert heap.filhos(5) == (3, 4)
    assert heap.filhos(3) == (0, 2)
    assert heap.filhos(4) == (1, )
    assert heap.filhos(0) == heap.filhos(2) == heap.filhos(1) == tuple()
    assert heap.pai(3) is heap.pai(4) is 5
    assert heap.pai(0) is heap.pai(2) is 3
    assert heap.pai(1) is 4

    heap.inserir(6)

    assert heap.filhos(6) == (3, 5)
    assert heap.filhos(3) == (0, 2)
    assert heap.filhos(5) == (1, 4)
    assert heap.filhos(0) == heap.filhos(2) == heap.filhos(1) == \
           heap.filhos(4) == tuple()
    assert heap.pai(3) is heap.pai(5) is 6
    assert heap.pai(0) is heap.pai(2) is 3
    assert heap.pai(1) is heap.pai(4) is 5

    heap.inserir(7)

    assert heap.filhos(7) == (6, 5)
    assert heap.filhos(6) == (3, 2)
    assert heap.filhos(5) == (1, 4)
    assert heap.filhos(3) == (0, )
    assert heap.filhos(0) == heap.filhos(2) == heap.filhos(1) == \
           heap.filhos(4) == tuple()
    assert heap.pai(6) is heap.pai(5) is 7
    assert heap.pai(3) is heap.pai(2) is 6
    assert heap.pai(1) is heap.pai(4) is 5
    assert heap.pai(0) is 3
예제 #6
0
def teste_oMetodo_quantidadeDeFilhos_iraGerarUmErroSeOHeapEstiverVazio():
    with raises(FalhaNaOperacao):
        Heap(None).remover()
예제 #7
0
def testes_oMetodo_inserir_definiraARaizDaArvoreSeElaEstiverVazia():
    heap = Heap(lambda x1, x2: IGUAIS if x1 == x2 else max(x1, x2))
    heap.inserir(0)

    assert heap.topo == 0
예제 #8
0
def testes_metodo_remover_comPrioridades():
    mat = 'matemática'
    psico = 'psicologia'
    neuro = 'neurociência'
    fis = 'física'
    comp = 'computação'
    geo = 'geografia'
    prog = 'programação'

    estudos = Heap(lambda x1, x2: IGUAIS if x1 == x2 else min(x1, x2))
    estudos.inserir(mat, 1)
    estudos.inserir(psico, 3)
    estudos.inserir(neuro, 2)
    estudos.inserir(fis, 2)
    estudos.inserir(comp, 0)
    estudos.inserir(geo, 4)
    estudos.inserir(prog, 1)

    assert estudos.remover() == comp
    assert estudos.topo is mat
    assert estudos.filhos(mat) == (neuro, prog)
    assert estudos.filhos(neuro) == (psico, fis)
    assert estudos.filhos(prog) == (geo, )
    assert estudos.filhos(psico) == estudos.filhos(fis) == \
           estudos.filhos(geo) == tuple()
    assert estudos.pai(neuro) == estudos.pai(prog) is mat
    assert estudos.pai(psico) == estudos.pai(fis) is neuro
    assert estudos.pai(geo) is prog

    assert estudos.remover() == mat
    assert estudos.topo is prog
    assert estudos.filhos(prog) == (neuro, geo)
    assert estudos.filhos(neuro) == (psico, fis)
    assert estudos.filhos(psico) == estudos.filhos(fis) == \
           estudos.filhos(geo) == tuple()
    assert estudos.pai(neuro) == estudos.pai(geo) is prog
    assert estudos.pai(psico) == estudos.pai(fis) is neuro

    assert estudos.remover() == prog
    assert estudos.topo is fis
    assert estudos.filhos(fis) == (neuro, geo)
    assert estudos.filhos(neuro) == (psico, )
    assert estudos.filhos(psico) == estudos.filhos(geo) == tuple()
    assert estudos.pai(neuro) == estudos.pai(geo) is fis
    assert estudos.pai(psico) is neuro

    assert estudos.remover() == fis
    assert estudos.topo is neuro
    assert estudos.filhos(neuro) == (psico, geo)
    assert estudos.filhos(psico) == estudos.filhos(geo) == tuple()
    assert estudos.pai(psico) == estudos.pai(geo) is neuro

    assert estudos.remover() == neuro
    assert estudos.topo is psico
    assert estudos.filhos(psico) == (geo, )
    assert estudos.filhos(geo) == tuple()
    assert estudos.pai(geo) is psico

    assert estudos.remover() == psico
    assert estudos.topo is geo
    assert estudos.filhos(geo) == tuple()

    assert estudos.remover() == geo
    assert estudos.vazio
예제 #9
0
def arvoreVazia():
    return Heap(None)
예제 #10
0
def testes_metodo_inserir_informandoOParametroPrioridade():
    mat = 'matemática'
    psico = 'psicologia'
    neuro = 'neurociência'
    fis = 'física'
    comp = 'computação'
    geo = 'geografia'
    prog = 'programação'

    estudos = Heap(lambda x1, x2: IGUAIS if x1 == x2 else min(x1, x2))

    estudos.inserir(mat, 1)
    estudos.inserir(psico, 3)
    estudos.inserir(neuro, 2)

    assert estudos.filhos(mat) == (psico, neuro)
    assert estudos.filhos(psico) == estudos.filhos(neuro) == tuple()
    assert estudos.pai(psico) is estudos.pai(neuro) is mat

    estudos.inserir(fis, 2)

    assert estudos.filhos(mat) == (fis, neuro)
    assert estudos.filhos(fis) == (psico, )
    assert estudos.filhos(psico) == estudos.filhos(neuro) == tuple()
    assert estudos.pai(fis) is estudos.pai(neuro) is mat
    assert estudos.pai(psico) is fis

    estudos.inserir(comp, 0)

    assert estudos.topo is comp
    assert estudos.filhos(comp) == (mat, neuro)
    assert estudos.filhos(mat) == (psico, fis)
    assert estudos.filhos(psico) == estudos.filhos(fis) == \
           estudos.filhos(neuro) == tuple()
    assert estudos.pai(mat) is estudos.pai(neuro) is comp
    assert estudos.pai(psico) is estudos.pai(fis) is mat

    estudos.inserir(geo, 4)

    assert estudos.filhos(comp) == (mat, neuro)
    assert estudos.filhos(mat) == (psico, fis)
    assert estudos.filhos(psico) == estudos.filhos(fis) == tuple()
    assert estudos.filhos(neuro) == (geo, )
    assert estudos.pai(mat) is estudos.pai(neuro) is comp
    assert estudos.pai(psico) is estudos.pai(fis) is mat
    assert estudos.pai(geo) is neuro

    estudos.inserir(prog, 1)  # originalmente a prioridade era 0, mas será
    # alterad p/ 1 momentaneamente

    assert estudos.topo is comp
    assert estudos.filhos(comp) == (mat, prog)
    assert estudos.filhos(mat) == (psico, fis)
    assert estudos.filhos(prog) == (geo, neuro)
    assert estudos.filhos(psico) == estudos.filhos(fis) == \
           estudos.filhos(geo) == estudos.filhos(neuro) == tuple()
    assert estudos.pai(mat) is estudos.pai(prog) is comp
    assert estudos.pai(psico) is estudos.pai(fis) is mat
    assert estudos.pai(geo) is estudos.pai(neuro) is prog
예제 #11
0
def testes_propriedade_tamanho_aposInserirItens():
    nums = Heap(lambda x1, x2: IGUAIS if x1 == x2 else max(x1, x2))

    assert nums.tamanho == 0

    nums.inserir(0)
    assert nums.tamanho == 1

    nums.inserir(1)
    nums.inserir(2)
    assert nums.tamanho == 3

    nums.inserir(3)
    nums.inserir(4)
    nums.inserir(5)
    assert nums.tamanho == 6

    nums.inserir(6)
    nums.inserir(7)
    assert nums.tamanho == 8
예제 #12
0
def teste_propriedade_niveis():
    assert arvore.niveis == 4
    assert Heap(None).niveis == 0  #vazia
예제 #13
0
def teste_IteradorInterFixado_iterarSobreUmaArvoreVazia():
    with naoGeraErro():
        for n in Heap(None).interFixado():
            pass