new m ario c esar san felice - dc - ufscar · 2019. 6. 28. · ou seja, testar todas as solu˘c~oes...

59
Programa¸ ao com retrocesso (backtracking) ario C´ esar San Felice Aula 25 de Algoritmos e Estruturas de Dados 1 DC - UFSCar [email protected] 24 de junho de 2019

Upload: others

Post on 13-Oct-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Programacao com retrocesso (backtracking)

Mario Cesar San Felice

Aula 25 de Algoritmos e Estruturas de Dados 1DC - [email protected]

24 de junho de 2019

Page 2: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Introducao

Dado um problema computacional

Podemos resolve-lo usando enumeracao por forca bruta

Ou seja, testar todas as solucoes candidatas

Em geral isso e pouco eficiente, pois:

Verificar se uma solucao e viavel pode ser custoso

O numero de solucoes candidatas costuma ser muito grande

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 2 / 18

Page 3: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Tecnica: Backtracking

Programacao com retrocesso (backtracking) e um metodo maiseficiente para fazer busca exaustiva

Aplicavel quando as solucoes candidatas podem ser construıdasincrementalmente

Nele, multiplas solucoes podem ser eliminadas sem seremexplicitamente examinadas

Ideia central e retroceder quando detectar que a solucao candidata einviavel

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 3 / 18

Page 4: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Algoritmo: Backtracking

Algoritmos com backtracking em geral utilizam recursao

Pois esta facilita o mecanismo de retrocesso

backtrackingRec(solParcial p) {

se (p e valida) {

se (p e soluc~ao)

imprima p;

enquanto (puder estender p para algum s)

backtrackingRec(s);

}

}

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 4 / 18

Page 5: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Labirinto

p

D

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 5 / 18

Page 6: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Labirinto

p

D

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 5 / 18

Page 7: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Labirinto

D

p

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 5 / 18

Page 8: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Labirinto

D

p

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 5 / 18

Page 9: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Labirinto

D

p

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 5 / 18

Page 10: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Labirinto

D

p

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 5 / 18

Page 11: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Labirinto

D

p

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 5 / 18

Page 12: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Labirinto

D

p

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 5 / 18

Page 13: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Labirinto

D

p

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 5 / 18

Page 14: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Labirinto

D

p

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 5 / 18

Page 15: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Labirinto

D

p

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 5 / 18

Page 16: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Labirinto

D

p

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 5 / 18

Page 17: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Labirinto

D

p

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 5 / 18

Page 18: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Labirinto

D

p

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 5 / 18

Page 19: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Labirinto

D

p

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 5 / 18

Page 20: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Labirinto

D

p

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 5 / 18

Page 21: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Labirinto

D

p

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 5 / 18

Page 22: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Labirinto

D

p

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 5 / 18

Page 23: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Labirinto

Dp

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 5 / 18

Page 24: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Labirinto

Dp

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 5 / 18

Page 25: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Labirinto

Dp

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 5 / 18

Page 26: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Labirinto

Dp

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 5 / 18

Page 27: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Labirinto

p=D

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 5 / 18

Page 28: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Algoritmos: Labirinto

#define NUM_MOV 4

int desLin[NUM_MOV] = {0, 1, 0, -1};

int desCol[NUM_MOV] = {1, 0, -1, 0};

typedef struct labirinto

{

int numLins;

int numCols;

int **pos;

} * Labirinto;

void imprimeLabirinto(Labirinto lab);

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 6 / 18

Page 29: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Algoritmos: Labirinto

int posValida(Labirinto lab, int lin, int col)

{

if (lin >= 0 && lin < lab->numLins &&

col >= 0 && col < lab->numCols)

if (lab->pos[lin][col] == 0)

return 1;

return 0;

}

int resolveLabirinto(Labirinto lab)

{

return resolveLabirintoR(lab, 0, 0,

lab->numLins - 1, lab->numCols - 1);

}

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 7 / 18

Page 30: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Algoritmos: Labirinto

int resolveLabirintoR(Labirinto lab, int lin, int col,

int linDest, int colDest) {

int achou = 0, k = 0;

if (posValida(lab, lin, col)) {

lab->pos[lin][col] = 1;

if (lin == linDest && col == colDest) {

imprimeLabirinto(lab);

achou = 1; }

while (achou == 0 && k < NUM_MOV) {

achou = resolveLabirintoR(lab,

lin + desLin[k], col + desCol[k],

linDest, colDest);

k++; }

lab->pos[lin][col] = 0; }

return achou; }

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 8 / 18

Page 31: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Algoritmos: Labirinto

Note que, a primeira solucao encontrada nem sempre e a melhor.

Exercıcio: Modificar o algoritmo anterior para encontrar todas assolucoes possıveis.

Desafio: Modificar o algoritmo anterior para resolver o problema dosmovimentos dos cavalos. (Dica: e necessario modificar o padrao dosmovimentos e o criterio de sucesso.)

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 9 / 18

Page 32: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Observacoes: Backtracking

Numa enumeracao por forca bruta pura, um algoritmo poderia

considerar todas as concatenacoes possıveis de posicoes dolabirinto,

e descartar cada uma que nao corresponda a um caminho validoda origem ao destino.

Isso e muito ineficiente, pois so o numero de concatenacoes distintasja corresponde a um fatorial do tamanho dos caminhos.

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 10 / 18

Page 33: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Observacoes: Backtracking

Backtracking e mais eficiente que enumeracao por forca bruta, pois:

sempre parte de solucoes parciais viaveis e

quando detecta que uma solucao parcial e inviavel,

essa parcial e descartada, eliminando assim diversas solucoescandidatas inviaveis que derivam da parcial.

Ainda assim, como o numero de solucoes candidatas costuma sermuito grande, para muitos problemas backtracking ainda eineficiente, particularmente para instancias grandes.

No caso do labirinto, o numero de solucoes cresce exponencialmenteno numero de posicoes do labirinto. Aproximadamente O(3(nm)).

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 11 / 18

Page 34: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Observacoes: Backtracking

E importante destacar que, o caminho que as solucoes parciaispercorrem

nem sempre corresponde a um caminho no problema sendoresolvido,

mas e um caminho logico na arvore de decisao sendo percorrida.

Nosso proximo exemplo deixa isso mais claro.

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 12 / 18

Page 35: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Quadrado Latino

b

b

b

b

a c d

adc

a c d

a cd

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 13 / 18

Page 36: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Quadrado Latino

b

b

b

b

a c d

adc

a c d

a cd

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 13 / 18

Page 37: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Quadrado Latino

b

b

b

b

a a d

adc

a c d

a cd

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 13 / 18

Page 38: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Quadrado Latino

b

b

b

b

a b d

adc

a c d

a cd

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 13 / 18

Page 39: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Quadrado Latino

b

b

b

b

a c d

adc

a c d

a cd

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 13 / 18

Page 40: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Quadrado Latino

b

b

b

b

a c d

ada

a c d

a cd

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 13 / 18

Page 41: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Quadrado Latino

b

b

b

b

a c d

ada

a c d

a cd

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 13 / 18

Page 42: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Quadrado Latino

b

b

b

b

a c d

bda

a c d

a cd

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 13 / 18

Page 43: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Quadrado Latino

b

b

b

b

a c d

cda

a c d

a cd

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 13 / 18

Page 44: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Quadrado Latino

b

b

b

b

a c d

dda

a c d

a cd

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 13 / 18

Page 45: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Quadrado Latino

b

b

b

b

a c d

Xda

a c d

a cd

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 13 / 18

Page 46: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Quadrado Latino

b

b

b

b

a c d

Xdb

a c d

a cd

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 13 / 18

Page 47: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Quadrado Latino

b

b

b

b

a c d

Xdc

a c d

a cd

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 13 / 18

Page 48: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Quadrado Latino

b

b

b

b

a c d

adc

a c d

a cd

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 13 / 18

Page 49: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Quadrado Latino

b

b

b

b

a c d

adc

a c d

a cd

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 13 / 18

Page 50: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Quadrado Latino

b

b

a

b

a c d

adc

a c d

a cd

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 13 / 18

Page 51: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Quadrado Latino

b

b

b

b

a c d

adc

a c d

a cd

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 13 / 18

Page 52: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Quadrado Latino

b

b

b

a

a c d

adc

a c d

a cd

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 13 / 18

Page 53: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Quadrado Latino

b

b

b

b

a c d

adc

a c d

a cd

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 13 / 18

Page 54: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Exemplo: Quadrado Latino

b

b

b

b

a c d

adc

a c d

a cd

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 13 / 18

Page 55: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Algoritmos: Quadrado Latino

typedef struct matriz

{

int numLins;

int numCols;

int **pos;

} * Matriz;

// func~oes auxiliares

void imprimeQLatino(Matriz m);

int qLatinoResolvido(Matriz m);

int proxPosLin(Matriz m, int lin, int col);

int proxPosCol(Matriz m, int lin, int col);

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 14 / 18

Page 56: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Algoritmos: Quadrado Latino

int atribValida(Matriz m, int lin, int col, int l)

{

for (int i = 0; i < m->numLins; i++)

if (m->pos[i][col] == l ||

m->pos[lin][i] == l)

return 0;

return 1;

}

// func~ao inicial que chama a principal

int resolveQLatino(Matriz m);

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 15 / 18

Page 57: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Algoritmos: Quadrado Latino

int qLatR(Matriz m, int lin, int col, int l) {

int achou = 0, k = 1;

if (atribValida(m, lin, col, l)) {

m->pos[lin][col] = l;

if (qLatinoResolvido(m)) {

imprimeQLatino(m);

achou = 1; }

while (achou == 0 && k <= m->numLins) {

achou = qLatR(m,

proxPosLin(m, lin, col),

proxPosCol(m, lin, col), k);

k++; }

m->pos[lin][col] = 0; }

return achou; }

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 16 / 18

Page 58: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Algoritmos: Quadrado Latino

Eficiencia: o numero de chamadas da funcao recursiva qLatR podechegar a O(n(n2)), sendo

o n da base o numero de valores testados por posicao vazia

e o (n2) no expoente o numero de posicoes vazias possıveis.

Na pratica, espera-se que as podas na arvore de decisao reduzamsignificativamente esse valor.

Exercıcio: Implementar as funcoes auxiliares e a funcao inicial doalgoritmo anterior.

Desafio: Modificar o algoritmo anterior para resolver o Sudoku. Qualfuncao deve ser modificada?

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 17 / 18

Page 59: New M ario C esar San Felice - DC - UFSCar · 2019. 6. 28. · Ou seja, testar todas as solu˘c~oes candidatas Em geral isso e pouco e ciente, pois: Veri car se uma solu˘c~ao e vi

Curiosidades: Backtracking

Backtracking e a base do branch-and-bound, uma tecnica importantepara resolver problemas de otimizacao discreta.

Backtracking pode ser utilizada para resolver problemas de satisfacaode restricoes e puzzles, como:

Problema das 8 rainhas

Palavras-cruzadas

Criptoaritmetica

Mario Cesar San Felice Programacao com retrocesso (backtracking) 24 de junho de 2019 18 / 18