Académique Documents
Professionnel Documents
Culture Documents
(Backtracking)
Norton T. Roman
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
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: