Algoitmos de Busca A modelagem mostada até aqui detemina a configuação do espaço de estados do poblema, mas não mosta como chega à solução, isto é, como enconta um estado final em um tempo azoável. Paa efetua esta busca, pode-se utiliza técnicas de busca em gafos, algumas das quais seão descitas a segui.
Busca Exaustiva Busca exaustiva ou busca cega consiste em gea todos os possíveis estados (nós de uma ávoe) do espaço de estados, e pati daí enconta o estado final (solução). Deste modo a solução encontada é gaantida se a solução ótima, mas tal abodagem, apesa de detemina a solução ótima, pode leva muito tempo paa se encontada, pois existem poblemas que possuem um númeo muito gande de estados (xadez 10120 possíveis posições no tabuleio), tonando assim a busca exaustiva inviável. A segui seão mostados dois métodos de busca exaustiva.
1 Busca em Amplitude A busca em amplitude ou em lagua (do inglês, beadth-fist seach) consiste em constui uma ávoe de estados a pati do estado inicial, aplicando, a cada momento, todas as egas possíveis aos estados do nível mais baixo da ávoe, geando todos os estados sucessoes de cada um destes estados. Assim, a busca po um estado final se dá po níveis, no gafo ou na ávoe do poblema.
1 Busca em Amplitude Na notação apesentada paa o algoitmo, são usadas epesentações póxima ao pascal mistuada com a notação de conjuntos. A função append tem dois paâmetos, uma lista e um elemento. Esta função etona uma nova lista composta pela lista e o elemento passados como paâmetos, sendo que o pimeio elemento da lista esultante seá o pimeio paâmeto passado a função, po exemplo, append(1,[2,3]) esulta em [1,2,3] e append([2,3],1) esulta em [2,3,1]. A busca em emplitude consiste em expandi o nó na odem em que são geados.
Algoitmo Busca em Amplitude algoitmo buscaemamplitude (R,E,e0,F) 1. open := [e0]; {open contém a lista de nós a seem visitados} 2. enquanto não Vazia(open) faça 2.1 e:=obtempimioelemento(open); 2.2 open:=retiapimeioelemento(open); 2.3 Paa toda i R tal que i(e) E faça {Detemina todos os sucessoes de e} 2.3.1 e :=i(e); {e os coloca em open } 2.3.2 Se e F então etone e ; {e é um nó final} 2.3.3 open:=append(open,e ); {insee e no final de open} fim_paa; fim_enquanto; se Vazio(open) então impima( Não há solução ); fim {busca em aplitude}
Algoitmo Busca em Amplitude Obseve que o algoitmo expande todos os nós de um nível paa depois expandi os estados do nível seguinte. Retonando ao exemplo das duas jaas, é apesentado a segui o desenvolvimento do algoitmo de busca em amplitude aplicado a este poblema: Inicialmente, atibui-se o estado inicial à lista de nós que seão visitados (open) pela instução 1:
Algoitmo Busca em Amplitude Open Em seguida, são geados os sucessoes do estado inicial atavés da instução 2.3: Open 1 (4,0) (0,3) Na segunda aplicação da instução 2.3, são geados os sucessoes de (4,0): 1 2 2 (4,3) 3 (4,0) (0,3) 5 (1,3)
Algoitmo Busca em Amplitude Neste momento, open = [(0,3), (4,3),, (1,3)], já que (0,3), que já estava na lista ainda não foi exploado e os sucessoes de (4,0) foam adicionados no final da lista pela instução append. Então, o póximo estado a te seus sucessoes geados po busca em extensão seá (0,3):
Algoitmo Busca em Amplitude 1 (4,0) (0,3) 3 5 1 4 7 Open (4,3) (1,3) (4,3) (3,0) Na seqüência do algoitmo, são geados os sucessoes de (4,3),, (1,3), (4,3), e odem, esultando na seguinte ávoe:
Algoitmo Busca em Amplitude 1 (4,0) (0,3) 3 5 1 4 7 (4,3) (1,3) (4,3) (3,0) 1 3 4 1 2 3 4 6 3 4 1 2 1 2 3 5 (0,3) (4,0) (4,0) (0,3) (4,3) (0,3) (1,0) (4,0) (0,3) (4,0) (4,0) (0,3) (4,0) (3,3) (0,3)
Algoitmo Busca em Amplitude Um poblema com este algoitmo é que nodos já visitados na busca podem se visitados novamente se foem sucessoes de outos estados. Esta epetição é desnecessáia, poque, po exemplo, a sub-ávoe abaixo e no segundo e teceio níveis seá exatamente igual á sub-ávoe de no pimeio nível, isto é, elas teão exatamente os mesmos sucessoes. Po isso, o algoitmo pode se eescito paa elimina a busca em estados já visitados:
fim {busca em aplitude sem epetição de nós} Algoitmo Busca em Amplitude sem Repetição de Estados algoitmo buscaemamplitudesemrepetiçãodeestados (R,E,e0,F) 1. open := [e0]; 2. closed := ; {lista de nós visitados} 3. enquanto não Vazia(open) faça 3.1 e:=obtempimeioelemento(open); 3.2 open:=retiapimeioelemento(open); 3.3 closed := append(closed,e); 3.4 Paa toda i R tal que i(e) E faça 3.4.1 e :=i(e); 3.4.2 Se e F então etone e ; 3.4.3 Se (e closed) (e open) então open:=append(open,e ); fim_paa; fim_enquanto; se Vazio(open) então impima( Não há solução );
Algoitmo Busca em Amplitude sem Repetição de Estados Com a utilização deste algoitmo, a última ávoe do exemplo anteio ficaia assim: 1 (4,0) (0,3) 5 7 (4,3) (1,3) (3,0) 4 Open (1,0) (3,3)
Algoitmo Busca em Amplitude sem Repetição de Estados É mais fácil, então continua a expansão desta ávoe. Na inteação seguinte tem-se:
Algoitmo Busca em Amplitude sem Repetição de Estados 1 (4,0) (0,3) 5 7 (4,3) (1,3) (3,0) 4 (1,0) (3,3) 8 6 Open (0,1) (4,2)
Algoitmo Busca em Amplitude sem Repetição de Estados E assim po diante. Execício: Continue a constução a ávoe de busca em extensão paa este poblema até enconta um estado final.
Busca em Pofundidade Enquanto a busca em amplitude pocua expandi todos os nodos em um deteminado nível da ávoe antes de pati paa o nível seguinte, a busca em pofundidade (do inglês, depth-fist seach) faz exatamente o contáio. O algoitmo de busca em pofundidade pocua exploa completamente cada amo da ávoe antes de tenta o amo vizinho. Segue o algoitmo em sua vesão iteativa:
Algoitmo Busca em Pofundidade algoitmo buscaempofundidadedeestados (R,E,e0,F) {Sem epetição de nós} 1. open := [e0]; 2. closed := ; {lista de nós visitados} 3. enquanto não Vazia(open) faça 3.1 e:=obtempimeioelemento(open); 3.2 open:=retiapimeioelemento(open); 3.3 closed := append(closed,e); 3.4 Paa toda i R tal que i(e) E faça: 3.4.1 e :=i(e); 3.4.2 Se e F então etone e ; 3.4.3 Se (e closed) (e open) então open:=append(e, open); fim_paa; fim_enquanto; se Vazio(open) então impima( Não há solução ); fim {busca em pofundidade}
Algoitmo Busca em Pofundidade Paa exemplifica a utilização de busca em pofundidade, é apesentado a segui o desenvolvimento do algoitmo paa o mesmo sistema de podução que seviu de exemplo à busca em extensão. O algoitmo inicia com o estado. As egas aplicáveis são 1 e, geando o estado (4,0) e (0,3)
Algoitmo Busca em Pofundidade 1 Open (4,0) (0,3) O póximo estado escolhido é (4,0), podeia te escolhido também (0,3). Qualque nó no mesmo nível da ávoe pode se escolhido: 1 (4,0) (0,3) 5 (4,3) (1,3)
Algoitmo Busca em Pofundidade Neste momento, closed é igual a [(4,3),(1,3),(0,3)]. Difeentemente do algoitmo de busca em amplitude, o nó a se expandido seá o nó (4,3), mas como as egas aplicadas a ele levaá a estados já geados, então o póximo nó escolhido é o nó (1,3), este pocesso é chamado de backtacking, isto é, um etocesso ao nó anteio:
Algoitmo Busca em Pofundidade 1 (4,0) (0,3) 5 (4,3) (1,3) 4 (1,0) Veja que o póximo estado a se expandido é (1,0), pois é ele que está no topo da fila:
Algoitmo Busca em Pofundidade 1 (4,0) (0,3) 5 (4,3) (1,3) 4 (1,0) 8 (0,1)
Algoitmo Busca em Pofundidade Execícios Constua o esto da ávoe acima até enconta a solução. Veja que os dois algoitmos de busca exaustiva apesentados acima, difeem apenas na escolha do nó a se expandido. Se open compota-se como uma fila, então temos uma busca em amplitude. Se open compota-se como uma pilha, então temos uma busca em pofundidade.