Você está na página 1de 15

UNIVERSIDADE FEDERAL RURAL DO SEMI-RIDO

PROGRAMA

DE

PS-GRADUAO

EM

SISTEMAS

DE

COMUNICAO E AUTOMAO (PPGSCA)


DISCIPLINA: INTELIGNCIA ARTIFICIAL
PROFESSORES: MARCELO GUERRA E LEONARDO CASILLO

NGRID HELOISA DA SILVA ALVES


JESSICA BARBARA DA SILVA SOARES

BUSCA BIDIRECIONAL: MTODO E APLICAO AO QUEBRA CABEA DE 8


PEAS

Mossor/RN
2016

INTRODUO
Diversos problemas podem ser implementados e resolvidos atravs da Inteligncia
Artificial (IA). Este campo de estudo trata da aplicao da atividade inteligente em um
dispositivo mecnico utilizando a representao e busca (Luger, 2013). Ou seja, para
solucionar estes problemas utilizando IA preciso encontrar estruturas capazes de representlos e um mtodo de busca para encontrar as solues.
Uma ferramenta muito utilizada para representar e solucionar problemas denominada
busca em espaos de estados. Esta consiste em um grafo, formado por um conjunto de ns
conectados por arcos ou elos. Os ns representam os estados ou possibilidades para a soluo
dos problemas e os elos simulam as transies, o caminho, entre os estados (Luger, 2013).
Aps representar todas as possveis situaes/transies, podemos aplicar a busca da
soluo. Nesse aspecto, uma gama de mtodos pode ser escolhida para encontrar a melhor
resoluo do problema.

Para determinar qual mtodo de busca utilizar, importante

considerar alguns critrios, como a completeza, otimizao, complexidade de tempo e de


memria.
Um dos mtodos de busca de espao de estados a busca bidirecional. Esta realizada
em dois caminhos simultneos: um a partir do incio em direo a alcanar o objetivo (ou
soluo do problema), e outro que parte do objetivo em direo ao ponto inicial, devendo
estes se encontrarem no meio da trajetria. Este mtodo, em geral, apresenta vantagens frente
a alguns outros, como economia de tempo e memria (Pohl, 1971).
As tcnicas de Inteligncia Artificial so cada vez mais presentes e necessrias em
jogos digitais. Estas podem ser aplicadas em diferentes tarefas, como resoluo de problemas
(puzzles), planejamento de tarefas, planejamento de trajetrias, controle de agentes
autnomos, entre outras (Osrio et al., 2016). Neste trabalho, estuda-se a possibilidade de
aplicao do mtodo de busca bidirecional para resolver o problema do 8-puzzle quebra
cabea de 8 peas, comparando o resultado obtido com alguns outros mtodos, de forma a
entender as vantagens e desvantagens de sua utilizao.

BUSCA BIDIRECIONAL O MTODO


Pode-se dividir os mtodos de busca em dois grupos principais: mtodo exaustivo e
mtodo heurstico. O primeiro consiste em uma busca cega, ou seja, percorre todas as
possibilidades, sem conhecimentos prvios. O segundo, por outro lado, recebe informaes e
aplica a busca de acordo com as maiores probabilidades de sucesso. Um exemplo de busca
exaustiva o mtodo bidirecional.
De acordo com Russel e Norving (1995), o mtodo de busca bidirecional consiste na
combinao da busca a partir do estado inicial guiada por dados, com a busca a partir do
objetivo guiada por objetivo, ocorrendo estas de forma simultnea. Dependendo da
aplicao, este mtodo pode oferecer resultados satisfatrios, apresentando economia de
memria e maior velocidade de resposta (Pohl, 1971).
A busca unidirecional guiada por dados, como afirma Pohl (1971), aquela realizada a
partir de dados fornecidos inicialmente, seguindo um caminho frente at alcanar o objetivo
ou parte deste. Neste mtodo, tambm chamado de encadeamento progressivo, de acordo com
Luger (2013), o algoritmo inicia a partir de fatos e regras fornecidos para mudana de estado,
e a cada novo estado novas regras e fatos so considerados at que se consiga resolver o
problema ou atingir o objetivo.
A busca unidirecional guiada por objetivo, por sua vez, percorre o caminho para trs,
partindo do objetivo, at chegar no ponto inicial (Pohl, 1971). Devem ser observadas as regras
e condies para se gerar o objetivo e assim, regredir a um estado anterior que se tornar o
novo objetivo, repetindo este procedimento at se chegar aos fatos do problema. Tambm
conhecido por encadeamento regressivo (Luger, 2013).
O mtodo bidirecional a atuao simultnea desses dois tipos de busca, sendo a
soluo obtida quando ocorre o encontro desses dois caminhos, podendo o algoritmo
reconstruir uma nica trajetria que se estende do ponto inicial ao objetivo (Poole e
Mackworth, 2016). Para reconhecer o ponto de interseco entre os dois caminhos, uma das
opes aplicar a tabela de hash, onde a cada n descoberto seu valor comparado com dos
outros ns em busca de valores iguais (Pohl, 1971). Na Figura 01 possvel observar um
esquema deste tipo de busca.

Figura 01: Vista esquemtica da busca bidirecional.


Fonte: Adaptada de Russel e Norving (1995)

Nesta imagem, possvel observar o momento em que a busca est prestes a se


completar, quando no encontro de um n da rvore guiada por dados com o n da rvore
guiada por objetivo. Nesse exemplo, foi realizada busca em largura (ou amplitude) nas duas
rvores, que consiste na verificao de todos os ns de cada nvel antes de aprofundar em
outro.
A busca bidirecional pode ser combinada com outros mtodos de busca para se tornar
mais eficiente. Pode ser aliada a busca em amplitude, em profundidade, em profundidade com
aprofundamento iterativo e at mesmo a mtodos heursticos, como subida de encosta e
mtodo do custo mnimo. Porm, de acordo com Poole e Mackworth (2016), a maior garantia
se alcana com a procura em largura nos dois caminhos.
APLICAO DA BUSCA BIDIRECIONAL NO QUEBRA CABEA DE 8 PEAS
Para compreender melhor o mtodo de busca bidirecional e analisar uma possvel
aplicao, estudaremos este como forma de encontrar a soluo do quebra cabea de 8 peas,
levantando o modo de utilizao, o algoritmo e verificando comparaes com outros mtodos.
O jogo consiste em um tabuleiro quadrado que possui nove divises, 8 peas e uma
lacuna. O objetivo final organizar as 8 peas de uma forma definida pode ser uma
sequncia de nmeros ou a construo de uma figura especfica. A Figura 02 ilustra um
exemplo de estado inicial e objetivo deste problema. Essa organizao final possvel pois
pode-se mover peas adjacentes ao espao vazio.

Figura 02: Estado inicial e estado objetivo do quebra cabea de 8 peas.


Fonte: Alusio, Montesco e Taco (1999)

Para realizar a busca no espao de estados no puzzle, a referncia a movimentao


do espao vazio, visto que torna mais fcil e prtico o encontro de estados pois lida com
menos operadores (1 pea) do que no caso de se trabalhar com a movimentao das demais
partes (8 peas). A Figura 03 mostra a simulao da busca bidirecional para melhor ilustrao
do mtodo.

Figura 03: Simulao da busca bidirecional para o quebra-cabea de 8 peas.


Fonte: Autoria prpria

Neste jogo, cada estado na rvore de busca de estados especifica a localizao das oito
peas e do local vazio. O espao vazio pode mover-se para cima, para baixo, para direita e
esquerda. Com a busca direcional, a procura pela soluo termina quando se obtm um n, ou
estado, que seja comum para os dois caminhos.
Algoritmo

O algoritmo exposto abaixo referente a busca bidirecional em um puzzle-8 foi obtido


na referncia Alusio, Montesco e Taco (1999). Nesta pesquisa, foram feitos quatro testes com
diferentes arranjos de estado inicial e meta do quebra cabea de 8 peas. Os autores
recomendam aumentar a capacidade de memria ao trabalhar com LPA PROLOG para a
execuo da busca bidirecional, digitando no ambiente DOS:
C:\...\pro386w /h16000
/* Busca em Profundidade x Largura */
/* Definio de Operadores Utilizados no Algoritmo, e Bases de Dados Dinmicas para a Contagem de Ns Expandidos eTempo de
Execuso*/

:- op(35, xf, e_a_meta

).

:- op(35, xfx, atinge_a_meta).


:- op(35, xfx, transforma ).
:- op(30, xfx, em

).

:- op(35, xfx, nao_produz_circulos_em).


:- dynamic(countinicio/1).
:- dynamic(countmeta/1).
:- dynamic(tempo/1).

/********************************************************************/
/********************* Predicado Principais *************************/
/*Resolva o Predicado Principal para Iniciar a Busca Bidirecional, Onde inicia as Bases de Dados Dinmicas em Zero*/

resolva :- init_dynamic,
estado_inicial( Inicio ), Meta e_a_meta, /*Carrega o estado inicial e o estado meta nas respectivas variaveis*/
busca_bidirectional( [[ r(raiz, Inicio) ]], [[r(meta, Meta)]], SolucaoDeInicio, SolucaoDeMeta ), /*Inicia a Busca Bidirecional, interccalando
os casamentos de busca*/
imprimatempo,
imprima( SolucaoDeInicio ), nl, nl,
imprima( SolucaoDeMeta ), nl.

/*Pergunta se tem a rota de soluo para cada iterao*/


busca_bidirectional( LLSolDeInicio, LLSolDeMeta, SolucaoDeInicio, SolucaoDeMeta ) :procura( LLSolDeInicio, LLSolDeMeta, SolucaoDeInicio, SolucaoDeMeta ).

/*Passa ao nvel seguinte gerando os filhos do nvel pai, tanto para a busca da rvore de incio como da busca da rvore de meta*/
busca_bidirectional( [HeadIni|TailIni], [HeadMeta|TailMeta], SolucaoDeInicio, SolucaoDeMeta) :ache_todos( ExtensaoAteUmFilhoIni, estende_ate_filho( HeadIni, ExtensaoAteUmFilhoIni ), ExtensoesIni ),
soma_ini(ExtensoesIni), /*Conteo dos ns expandidos desde o n de inicio*/
ap( ExtensoesIni, TailIni, ListaEstendidaIni ), /*Adiciona todos os ns filhos listapara a busca em profundidade*/
ache_todos( ExtensaoAteUmFilhoMeta, estende_ate_filho( HeadMeta, ExtensaoAteUmFilhoMeta ), ExtensoesMeta ),
soma_meta(ExtensoesMeta), /*Conteo dos ns expandidos desde o n meta*/
ap( TailMeta, ExtensoesMeta, ListaEstendidaMeta ), /*Adiciona todos os ns filhos para a busca em largura*/
busca_bidirectional( ListaEstendidaIni, ListaEstendidaMeta, SolucaoDeInicio, SolucaoDeMeta ).

/*Extende tudos os ns filhos de um n determinado*/


estende_ate_filho( [r(Ramo,N)|Trajetoria], [r(Op,Filho), r(Ramo,N)|Trajetoria] ) :operacao( Op ) transforma N em Filho,
not Filho nao_produz_circulos_em Trajetoria.

/*Verifica que no existam ciclos na rota*/


Estado nao_produz_circulos_em Trajetoria :membro( r( Operacao, Estado ), Trajetoria ).

/* Nesta Linha debe-se fazer a comparao Bidirecional */


r( RamoIni, ML ) atinge_a_meta r( RamoMeta, MP ):ML = MP.

/* nova comparao */
procura( LLSolDeInicio, LLSolDeMeta, SolucaoDeInicio, SolucaoDeMeta ) :procura2( LLSolDeInicio, LLSolDeMeta, SolucaoDeInicio, SolucaoDeMeta ).

procura( [_|LTailSolIni] , LLSolDeMeta, SolucaoDeInicio, SolucaoDeMeta ) :procura( LTailSolIni, LLSolDeMeta, SolucaoDeInicio, SolucaoDeMeta ).

/*Comparao dos ns de inicio com os ns meta, em funo do tipo de busca bidirecional*/


procura2( [[ HeadIni|TailIni ] | _], [[ HeadMeta|TailMeta ] | _], SolucaoDeInicio, SolucaoDeMeta ) :HeadIni atinge_a_meta HeadMeta,
SolucaoDeInicio = [ HeadIni | TailIni ],
SolucaoDeMeta = [ HeadMeta | TailMeta ], !.

procura2( LLSolDeInicio, [_|LTailMeta], SolucaoDeInicio, SolucaoDeMeta ) :procura2( LLSolDeInicio , LTailMeta, SolucaoDeInicio, SolucaoDeMeta ).

/*********************************************************************/
/*********************** Base de Conhecimentos ***********************/

operacao(esq) transforma [A,*,C,D,E,F,H,I,J] em [*,A,C,D,E,F,H,I,J].


operacao(esq) transforma [A,B,C,D,*,F,H,I,J] em [A,B,C,*,D,F,H,I,J].
operacao(esq) transforma [A,B,C,D,E,F,H,*,J] em [A,B,C,D,E,F,*,H,J].
operacao(esq) transforma [A,B,*,D,E,F,H,I,J] em [A,*,B,D,E,F,H,I,J].
operacao(esq) transforma [A,B,C,D,E,*,H,I,J] em [A,B,C,D,*,E,H,I,J].
operacao(esq) transforma [A,B,C,D,E,F,H,I,*] em [A,B,C,D,E,F,H,*,I].

operacao(cima) transforma [A,B,C,*,E,F,H,I,J] em [*,B,C,A,E,F,H,I,J].


operacao(cima) transforma [A,B,C,D,*,F,H,I,J] em [A,*,C,D,B,F,H,I,J].
operacao(cima) transforma [A,B,C,D,E,*,H,I,J] em [A,B,*,D,E,C,H,I,J].
operacao(cima) transforma [A,B,C,D,E,F,*,I,J] em [A,B,C,*,E,F,D,I,J].
operacao(cima) transforma [A,B,C,D,E,F,H,*,J] em [A,B,C,D,*,F,H,E,J].
operacao(cima) transforma [A,B,C,D,E,F,H,I,*] em [A,B,C,D,E,*,H,I,F].

operacao(dir) transforma [A,*,C,D,E,F,H,I,J] em [A,C,*,D,E,F,H,I,J].


operacao(dir) transforma [A,B,C,D,*,F,H,I,J] em [A,B,C,D,F,*,H,I,J].
operacao(dir) transforma [A,B,C,D,E,F,H,*,J] em [A,B,C,D,E,F,H,J,*].
operacao(dir) transforma [*,B,C,D,E,F,H,I,J] em [B,*,C,D,E,F,H,I,J].
operacao(dir) transforma [A,B,C,*,E,F,H,I,J] em [A,B,C,E,*,F,H,I,J].
operacao(dir) transforma [A,B,C,D,E,F,*,I,J] em [A,B,C,D,E,F,I,*,J].

operacao(baixo) transforma [A,B,C,*,E,F,H,I,J] em [A,B,C,H,E,F,*,I,J].


operacao(baixo) transforma [A,B,C,D,*,F,H,I,J] em [A,B,C,D,I,F,H,*,J].
operacao(baixo) transforma [A,B,C,D,E,*,H,I,J] em [A,B,C,D,E,J,H,I,*].
operacao(baixo) transforma [*,B,C,D,E,F,H,I,J] em [D,B,C,*,E,F,H,I,J].
operacao(baixo) transforma [A,*,C,D,E,F,H,I,J] em [A,E,C,D,*,F,H,I,J].
operacao(baixo) transforma [A,B,*,D,E,F,H,I,J] em [A,B,F,D,E,*,H,I,J].

/********************************************************************/
/************************ Testes ***********************/
/*Test A*/
estado_inicial([1,2,3,4,5,6,7,8,*]).

[3,*,1,2,5,6,4,7,8] e_a_meta.

/*Test B*/
/*
estado_inicial([1,2,3,4,5,6,7,8,*]).

[*,3,1,2,5,6,4,7,8] e_a_meta.
*/

/*Test C*/
/*
estado_inicial([1,2,3,4,5,6,7,8,*]).

10

[2,3,1,*,5,6,4,7,8] e_a_meta.
*/

/*Test D*/
/*
estado_inicial([1,2,3,4,5,6,7,8,*]).

[2,3,*,1,5,6,4,7,8] e_a_meta.
*/

/* Test E */
/*
estado_inicial([1,2,3,4,5,6,7,8,*]).

[1,2,3,5,*,6,4,7,8] e_a_meta.
*/

/********************************************************************/
/************************ Predicados de Ajuda ***********************/

init_dynamic :asserta(countinicio(0)), asserta(countmeta(0)),


ticks(Tempo), asserta(tempo(Tempo)).

imprimatempo :- ticks(Tempo2), retract(tempo(Tempo)),


write('*********** Resultados **********'),nl,nl,
write('O Tempo Rodado em ticks :'),
Ticks is Tempo2 - Tempo,
write(Ticks),nl,nl.

/*Contadores da expanso dos ns de inicio e de meta*/


soma_ini([]):-!.
soma_ini([Head|Tail]) :- retract(countinicio(N)),
Tot is N + 1, asserta(countinicio(Tot)),
soma_ini(Tail),!.
soma_meta([]):-!.
soma_meta([Head|Tail]) :- retract(countmeta(N)),
Tot is N + 1, asserta(countmeta(Tot)),
soma_meta(Tail),!.

/*Adiciona uma lista para outra lista*/


ap([],X,X) :- !.
ap([X|Y],Z,[X|W]) :- ap(Y, Z, W).

11

/*Verifica se um elemento encontra-se dentro de uma lista*/


membro(X,[X|_]) :- !.
membro(X,[_|Y]) :- membro(X,Y).

ache_todos(X, Y, Z) :- findall(X, Y, Z), !.


ache_todos(_, _, []).

imprima([r(raiz,Raiz)]) :- !,
write('Estado Inicial( Busca De Inicio - Profundidade) : '),
write(Raiz), write('.'),nl,
retract(countinicio(Nos)), write('Nos Expandidos:'), write(Nos),nl.

imprima([r(meta,Meta)]) :- !,
write('Estado Final ( Busca De Meta - Largura

) : '),

write(Meta), write('.'),nl,
retract(countmeta(Nos)), write('Nos Expandidos:'), write(Nos),nl.

imprima([r(Ramo,Nodo)|R]) :- imprima(R), nl,


write(Ramo), write(' e ,portanto, temos: '), nl,
tab(4),write(Nodo), write('.').

BUSCA

BIDIRECIONAL

COM

SUAS

LIMITAES,

APLICAES

COMPARAES
O mtodo bidirecional mais indicado quando se tem um nico objetivo final bem
definido e para o qual os operadores tm inversos.
Dentre as vantagens, como comenta Robin (2009), pode-se destacar a velocidade de
resposta, visto que a soma do tempo gasto nos dois caminhos utilizados neste mtodo menor
do que o tempo gasto na utilizao de apenas um caminho no mtodo unidirecional. Alm
disso, de acordo com o mesmo autor, a busca bidirecional requer menos memria.
Como desvantagem Robin (2009) afirma que um mtodo de difcil execuo, visto
que deve-se decidir a cada passo o modo de busca na rvore de estados. Outro ponto que
dificulta sua utilizao o fato que deve-se conhecer o estado objetivo, que de preferncia
seja apenas um, e deve ser possvel regredir atravs dos estados. Alm disso, o algoritmo deve
ter um meio para detectar o ponto de interseco dos dois caminhos, para evitar a
redundncia, tornando o mtodo prejudicial.
Os principais problemas no mtodo de busca bidirecional a redundncia e a
interseco, ambos mencionados anteriormente. Como a rvore de estados tem muitos
caminhos diferentes a partir de um mesmo n, pode-se obter encontros redundantes entre os
12

dois caminhos. O problema de interseco que neste mtodo necessrio reconhecer


quando um n encontrado nas duas rvores ou nos dois caminhos (Pohl, 1971). Para essa
verificao, pelo menos uma das bordas de cada rvore deve ser mantida na memria (Russel
e Norving, 1995) e pode ser utilizado um mecanismo que consiste na utilizao da Tabela de
Hash, mencionada anteriormente.
A busca bidirecional pode ser aliada a outros mtodos em cada uma das rvores que a
compe, de forma a facilitar o encontro da soluo. Pode ser aplicado o mtodo da busca por
largura, profundidade, aprofundamento iterativo e busca heurstica. A deciso pela utilizao
de algum mtodo depende da aplicao. A Figura 04 ilustra a busca em largura nos dois
sentidos.

Figura 04: Busca bidirecional em largura nos dois sentidos.


Fonte: SILVA (2016)

Para problemas computacionais famosos, como caso do quebra-cabea de oito peas e


da localizao de uma rota na Romnia, existe apenas um estado objetivo, ento, o mtodo
bidirecional interessante. Contudo, se houver vrios estados objetivos explicitamente
listados, como por exemplo, para o jogo de resta 1 ou o caso das 8 rainhas, difcil usar a
busca bidirecional, pois h mais de uma configurao igualmente tima.
Em termos de complexidade de tempo, espao, otimizao e completeza, podemos
relacionar o mtodo bidirecional com alguns outros mtodos exaustivos, tem-se o resultado da
Tabela 01.
Tabela 01: Avaliao de estratgias de busca

13

b= fator de ramificao; d= profundidade da soluo;


m= profundidade mxima da rvore de busca; l= limite de profundidade
Fonte: Alusio, Montesco e Taco (1999)

Observando a Tabela 01, conclui-se que a busca bidirecional permite um menor uso de
tempo e de memria, comparada busca por largura e profundidade, sendo tima dependendo
da aplicao.

CONCLUSES
A busca bidirecional tem seu desempenho aliado ao tipo de aplicao. Em problemas
com apenas um objetivo ou estado meta, geralmente, esse mtodo pode ser aplicado com
sucesso. Problemas que contm vrias solues devem ser evitados porque podem dificultar a
realizao da busca.
A maior vantagem desse mtodo de busca a possibilidade de reduo de tempo de
funcionamento e memria de computador gastas frente a aplicao mtodos de busca
exaustivos unidirecionais.
A busca bidirecional pode ser aprimorada com a juno de outros mtodos de busca,
como por exemplo aplicando-se a heurstica, resultando em um mtodo hbrido com maior
chance de sucesso.
Para o quebra cabea de 8 peas, a busca bidirecional se aplica de forma satisfatria,
trazendo todos os benefcios referentes a esse mtodo desde que se aplique um mecanismo
adequado para identificar interseces e redundncias.

14

REFERNCIAS
ALUSIO, Sandra M. MONTESCO, Carlos A. E. TACO, Pastor W. G. Problema do Jogo
das Oito Fichas (8 Puzzle) Fazendo uso da Busca Bidirecional. 1999. Disponvel em: <
http://www.icmc.sc.usp.br/~sandra/G5_t2/8_Puzzle.htm>. Acesso em: 20 mar. 2016.
LUGER, George R. Inteligncia Artificial. 6 ed. So Paulo: Pearson Education do Brasil,
2013. 614 p.
OSRIO, Fernando et al. Inteligncia Artificial para jogos: Agentes especiais com
permisso
para
matar...
e
raciocinar!
Disponvel
em:
<
http://osorio.wait4.org/publications/Osorio-et-al-SBGames07-Tutorial.pdf>. Acesso em: 20
mar. 2016.
POHL, I. Bi-directional Search, in Machine Intelligence, vol. 6, eds. Meltzer and Michie,
Edinburgh University Press, 1971. 127-140 p.
POOLE, David. MACKWORTH, Alan. Artificial Intelligence: foundations of computational
agents. Disponvel em: <http://artint.info/html/ArtInt_65.html>. Acesso em: 20 mar. 2016.
ROBIN.
Bidirectional
Search.
2009.
Disponvel
em:
<http://intelligence.worldofcomputing.net/ai-search/bidirectional-search.html#.Vu_qteIrLIU>.
Acesso em: 21 mar. 2016.
RUSSELL, Stuart J. NORVING, Peter. Artificial intelligence: a modern approach, New
Jersey: Englewood Cliffs, 1995. 932 p.
SILVA, Marcos F. P. Inteligncia artificial em jogos digitais. Disponvel em: <
https://6d93618074139ea19caecce289f017ecc7f89b74.googledrive.com/host/0BwN3tFnUMZ
U_cExOUWR1RzE4Qjg/01%20-%20Apresenta%C3%A7%C3%A3o%20e%20Introdu
%C3%A7%C3%A3o.pdf>. Acesso em: 20 mar. 2016.
TATAI, Victor K. Tcnicas de Sistemas Inteligentes Aplicadas ao Desenvolvimento de
Jogos
de
Computador.
Disponvel
em:
<
http://www.dca.fee.unicamp.br/~gudwin/ftp/publications/TeseTatai.pdf>. Acesso em: 20 mar.
2016.

15