Vous êtes sur la page 1sur 24

Tentativa e Erro

(Backtracking)
Norton T. Roman

Apostila baseada no trabalho de Delano M. Beder,


David Matuszek e Nivio Ziviani

Tentativa e Erro

Suponhaquevoctemquetomarumasriede
decisesdentrevriaspossibilidades,onde

Vocnoteminformaosuficienteparasaberoque
escolher
Cadadecisolevaaumnovoconjuntodeescolhas
Algumaseqnciadeescolhas(possivelmentemaisque
uma)podeserasoluoparaoproblema

Tentativaeerroummodometdicodetentar
vriasseqnciasdedecises,atencontrarumaque
funcione

Tentativa e Erro

Tcnicadesoluodeproblemas

Usadaquandosequeracharsoluesparaproblemas
paraosquenoseconheceumaregrafixade
computao

Passos

Escolherumaoperaoplausvel;

Executaraoperaocomosdados;

Seametanofoialcanada,repitaoprocessoatquese
atinjaametaouseevidencieainsolubilidadedo
problema.

Tentativa e Erro

Tentativaeerroumatcnicaqueutiliza
recursividade

Arecursividadepodeserusadapararesolverproblemas
cujasoluodotipotentartodasasalternativas
possveis.

Idiaparaalgoritmostentativaeerrodecomporo
processoemumnmerofinitodesubtarefas
parciais(expressasdeformarecursiva).

Explorlasexaustivamente
Aconstruodeumasoluoobtidaatravsde
tentativas(oupesquisas)darvoredesubtarefas.

Tentativa e Erro

Oprocessodetentativagradualmenteconstrie
percorreumarvoredesubtarefas.

Tentativa e Erro

Funcionamento:

Passosemdireosoluofinalsotentadose
registradosemumaestruturadedados;
Casoessespassostomadosnolevemsoluofinal,
elespodemserretiradoseapagadosdoregistro.

Abuscanarvoredesoluespodecrescer
rapidamente(exponencialmente)

Necessriousaralgoritmosaproximadosouheursticas
quenogarantemasoluotimamassorpidas.

Tentativa e Erro

Exploramoscadapossibilidadecomosegue:

Seapossibilidadearesposta,retornesucesso
Seapossibilidadenoforresposta,enohouveroutraa
sertestadaapartirdela,retornefalha
Paracadapossibilidade,apartirdaatual:

Exploreanovapossibilidade(recursivo)

Seencontrouaresposta,retornesucesso

Retornefalha

Exemplos

Dadoumlabirinto,encontreumcaminhodaentrada
sada

Emcadainterseo,voctemquedecidirse:

Exemplos

Dadoumlabirinto,encontreumcaminhodaentrada
sada

Emcadainterseo,voctemquedecidirse:

Seguedireto

Vaiesquerda

Vaidireita

Vocnoteminformaosuficienteparaescolher
corretamente

Cadaescolhalevaaoutroconjuntodeescolhas

Umaoumaisseqnciadeescolhaspodeserasoluo

Exemplos

Vocdesejacolorirummapacomnomximo4
cores:Vermelho,amarelo,verteeazul

Pasesadjacentesdevemtercoresdiferentes

Emcadaiterao,vocdevedecidir...

Exemplos

Vocdesejacolorirummapacomnomximo4
cores:Vermelho,amarelo,verteeazul

Pasesadjacentesdevemtercoresdiferentes
Emcadaiterao,vocdevedecidirquecorpintaum
pas,dadasascoresjatribudasaosvizinhos
Vocnoteminformaosuficienteparaescolheras
cores

Cadaescolhalevaaoutroconjuntodeescolhas

Umaoumaisseqenciadepassospodeserasoluo

Tentativa e Erro

Recursoamaneiramaisnaturaldese
implementartentativaeerro:
Considereomtodorecursivo:

intf(inta){
...
b=f(c);
...
}

Tentativa e Erro

Considereomtodorecursivo:

intf(inta){
...
b=f(c);
...
}
Daprimeiravezquefchamada(com
2),criaseespaoemmemriaparaseus
parmetros,variveislocaisetc

Suponhaquectornase3

a=2,c=3

f
b=

Tentativa e Erro

Considereomtodorecursivo:

intf(inta){
...
b=f(c);
...
}
Quandochegaemf(c),asituaoser
comonafigura

Suponhaquectornase5,emalgum
momento

a=3,c=5

f
b=

a=2,c=3

f
b=

Tentativa e Erro

Considereomtodorecursivo:

intf(inta){
...
b=f(c);
...
}
Quandochegaemf(c)novamente,a
situaosercomonafigura

Suponhaque,agora,irrelevanteovalorde
c

a=5,c=?

f
b=

a=3,c=5

f
b=

a=2,c=3

f
b=

Tentativa e Erro

Considereomtodorecursivo:

intf(inta){
...
b=f(c);
...
}
Antesdedarvalorac,f(5)retornao
valor4,porexemplo

Evoltaporodememrianopasso
anteriordarecursobacktracking

a=3,c=5

b=4
a=2,c=3

f
b=

Tentativa e Erro

Seconseguirmoscodificaroproblemademodoa
que:

Cadanovadecisosejaumachamadarecursiva
Cadabacktrackingcorrespondaavoltardeumachamada
recursiva

Entoasoluodoproblema,sefeita
recursivamente,naturalmentegerenciaro
mecanismodetentativaeerro

Exemplo Passeio do Cavalo

Passeiodocavalonotabuleirodexadrez.

Dadoumtabuleirocomnnposies,ocavalose
movimentasegundoasregrasdoxadrez.
Apartirdeumaposioinicial(x0,y0),oproblema
consisteemencontrar,seexistirumpasseiodocavalo
comn21movimentos,visitando
todosospontosdotabuleirouma
nicavez

Passeio do Cavalo

Otabuleiromatriznn.

Situaodecadaposio:

t[x,y]=0,<x,y>nofoivisitada
t[x,y]=i,<x,y>visitadanoisimomovimento,1i
n2.

Asregrasdoxadrezsoutilizadasparaos
movimentosdocavalo

Passeio do Cavalo
procedimento tenta
BEGIN
inicializa seleo de movimentos
WHILE movimento no bem sucedido AND existem candidatos a movimento DO
seleciona prximo candidato ao movimento
IF aceitvel THEN
Ex: Marca no
registra movimento
tabuleiro
IF tabuleiro no est cheio THEN
tenta novo movimento (chamada recursiva)
IF no sucedido THEN
apaga registro anterior
FI
O movimento
anterior no leva
FI
soluo. Deve voltar
FI
(backtracking)
OD
END
Ao final, o tabuleiro conter a resposta

Passeio do Cavalo
Para clculo das
coordenadas dos movimentos
possveis do cavalo

publicclassKnightsTour{
finalint[]dx={2,1,1,2,2,1,1,2};
finalint[]dy={1,2,2,1,1,2,2,1};
finalintnum;//nmerodeposiesdotabuleiro
finalintnumSqr;//nmerototaldecasas
int[][]table;
publicKnightsTour(intnum){
this.num=num;
Aceitvel se estiver dentro do
this.numSqr=num*num;
tabuleiro e a casa ainda no
this.table=newint[num][num];
tiver sido vizitada
}
booleanisAcceptable(intx,inty){
booleanresult=(x>=0&&x<=num1);
result=result&&(y>=0&&y<=num1);
result=result&&(table[x][y]==0);
returnresult;
}
...
}

Passeio do Cavalo
Tenta o i-simo movimento em (x,y), 1 i n2
booleantryMove(inti,intx,inty){
//Verificaaquantidadedemovimentos
booleandone=(i>numSqr);
intk=0;
intu,v;
while(!done&&k<8){
u=x+dx[k];
Coordenadas dos 8 movimentos possveis em
v=y+dy[k];
volta do cavalo
if(isAcceptable(u,v)){
table[u][v]=i;
done=tryMove(i+1,u,v);//tentaoutromovimento
if(!done){
table[u][v]=0;//semsucesso.Descartamovimento
}
}
k=k+1;//passaaoprximomovimentopossvel
}
returndone;
}

Passeio do Cavalo
Mostra todos os
movimentos a partir de
(x,y)

voidshowTour(intx,inty){
table[x][y]=1;
booleandone=tryMove(2,x,y);
if(done){
for(inti=0;i<num;i++){
for(intj=0;j<num;j++){
System.out.print(table[i][j]+"");
}
System.out.println();
}
}else{
System.out.println("Nohpasseiopossvel");
}
}
publicstaticvoidmain(String[]args){
intn=Integer.parseInt(args[0]);
intx=Integer.parseInt(args[1]);
inty=Integer.parseInt(args[2]);
newKnightsTour(n).showTour(x,y);
}

Passeio do Cavalo

Resultado:

Vous aimerez peut-être aussi