SlideShare una empresa de Scribd logo
1 de 14
Descargar para leer sin conexión
Projeto de algoritmos: Tentativa e Erro
Projeto e Análise de Algoritmos
Delano M. Beder
Departamento de Computação (DC)
Universidade Federal de São Carlos
delano@dc.ufscar.br
11/2011
Estes slides estão protegidos por Licença Creative Commons
Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 1 / 14
Algoritmos Tentativa e erro
Novidade: Nova técnica de solução de problemas.
Vocês já aprenderam duas técnicas: (i) projeto por indução (incre-
mental) e (ii) divisão e conquista.
Tentativa e erro é uma técnica que utiliza recursividade (aliás, como
também a técnica divisão e conquista utiliza).
A recursividade pode ser usada para resolver problemas cuja so-
lução é do tipo tentar todas as alternativas possíveis.
Idéia para algoritmos tentativa e erro é decompor o processo em
um número finito de subtarefas parciais.
Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 2 / 14
Algoritmos Tentativa e erro
Podem ser vistos como o processo de pesquisa ou de tentativa
que gradualmente constrói e percorre uma arvore de sub-tarefas.
Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 3 / 14
Algoritmos Tentativa e erro
Funcionamento dos algoritmos:
Passos em direção à solução final são tentados e registrados
Caso esses passos tomados não levem à solução final, eles podem
ser retirados do registro.
A busca na árvore de soluções pode crescer rapidamente (expo-
nencialmente).
Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 4 / 14
Exemplo
Passeio do cavalo no tabuleiro de xadrez.
Dado um tabuleiro com n × n posições, o cavalo se movimenta se-
gundo as regras do xadrez.
A partir de uma posição inicial (x0, y0), o problema consiste em en-
contrar, se existir um passeio do cavalo com n2
- 1 movimentos,
visitando todos os pontos do tabuleiro uma única vez
Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 5 / 14
Exemplo
Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 6 / 14
Exemplo (pseudo-código)
procedimento tenta
BEGIN
| inicializa seleção de movimentos |
WHILE | movimento não bem sucedido | AND
| existem candidatos a movimento | DO
| seleciona próximo candidato ao movimento |
IF | aceitável | THEN
| registra movimento |
IF | tabuleiro não está cheio | THEN
| tenta novo movimento (chamada recursiva) |
IF | não sucedido | THEN
| apaga registro anterior |
FI
FI
FI
OD
END
Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 7 / 14
Solução do exemplo
O tabuleiro ⇒ matriz n × n.
Situação de cada posição:
t[x,y] = 0, <x,y> não foi visitada
t[x,y] = i, <x,y> visitada no i-ésimo movimento, 1 ≤ i ≤ n2
.
As regras do xadrez são utilizadas para os movimentos do cavalo
Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 8 / 14
Solução do exemplo
public class KnightsTour {
final int[] dx = { 2, 1, -1, -2, -2, -1, 1, 2 };
final int[] dy = { -1, -2, -2, -1, 1, 2, 2, 1 };
final int num;
final int numSqr;
int[][] table;
public KnightsTour(int num) {
this.num = num;
this.numSqr = num * num;
this.table = new int[num][num];
}
boolean isAcceptable(int x, int y) {
boolean result = (x >= 0 && x <= num - 1);
result = result && (y >= 0 && y <= num - 1);
result = result && (table[x][y] == 0);
return result;
}
...
}
Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 9 / 14
Solução do exemplo
boolean tryMove(int i, int x, int y) {
// Verifica a quantidade de movimentos
boolean done = (i > numSqr);
int k = 0;
int u, v;
while (!done && k < 8) {
u = x + dx[k];
v = y + dy[k];
if (isAcceptable(u, v)) {
table[u][v] = i;
done = tryMove(i + 1, u, v); // tenta outro movimento
if (!done) {
table[u][v] = 0; // não sucedido. Descarta movimento
}
}
k = k + 1;
}
return done;
}
Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 10 / 14
Solução do exemplo
void showTour(int x, int y) {
table[x][y] = 1;
boolean done = tryMove(2, x, y);
if (done) {
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++) {
System.out.print(table[i][j] + " ");
}
System.out.println();
}
} else {
System.out.println("No possible tour");
}
}
public static void main(String[] args) {
int n = Integer.parseInt(args[0]);
int x = Integer.parseInt(args[1]);
int y = Integer.parseInt(args[2]);
new KnightsTour(n).showTour(x, y);
}
Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 11 / 14
Resultado do exemplo
Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 12 / 14
Resumo
Foi apresentada a técnica de projeto de algoritmos:
tentiva e erro – tentar todas as alternativas possíveis.
Foi apresentado um exemplo de algoritmos de tentativa e erro –
passeio do cavalo no tabuleiro de xadrez.
Referência utilizadas: [1] páginas 42 a 46, [2] páginas 120 a 125.
[1] Nívio Ziviani. Projeto de Algoritmos com implementações em C e
Pascal. Editora Thomson, 2a. Edição, 2004.
[2] Niklaus Wirth. Algoritmos e Estrutura de Dados. Editora LTC, Rio
de Janeiro, 1989.
Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 13 / 14
Projeto de algoritmos: Tentativa e Erro
Projeto e Análise de Algoritmos
Delano M. Beder
Departamento de Computação (DC)
Universidade Federal de São Carlos
delano@dc.ufscar.br
11/2011
Estes slides estão protegidos por Licença Creative Commons
Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 14 / 14

Más contenido relacionado

Similar a 13 slides

TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
(2013-05-20) [DevInSampa] AudioLazy - DSP expressivo e em tempo real para o P...
(2013-05-20) [DevInSampa] AudioLazy - DSP expressivo e em tempo real para o P...(2013-05-20) [DevInSampa] AudioLazy - DSP expressivo e em tempo real para o P...
(2013-05-20) [DevInSampa] AudioLazy - DSP expressivo e em tempo real para o P...Danilo J. S. Bellini
 
QAP: Metodos construtivos, 2-opt, Busca tabu
QAP: Metodos construtivos, 2-opt, Busca tabuQAP: Metodos construtivos, 2-opt, Busca tabu
QAP: Metodos construtivos, 2-opt, Busca tabuDaniel Gribel
 
Matemática Computacional
Matemática ComputacionalMatemática Computacional
Matemática ComputacionalRicardo Terra
 
Aula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.pptAula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.pptssuserd654cb1
 
Aula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).pptAula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).pptssuserd654cb1
 

Similar a 13 slides (10)

MRO predict
MRO predictMRO predict
MRO predict
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
(2013-05-20) [DevInSampa] AudioLazy - DSP expressivo e em tempo real para o P...
(2013-05-20) [DevInSampa] AudioLazy - DSP expressivo e em tempo real para o P...(2013-05-20) [DevInSampa] AudioLazy - DSP expressivo e em tempo real para o P...
(2013-05-20) [DevInSampa] AudioLazy - DSP expressivo e em tempo real para o P...
 
QAP: Metodos construtivos, 2-opt, Busca tabu
QAP: Metodos construtivos, 2-opt, Busca tabuQAP: Metodos construtivos, 2-opt, Busca tabu
QAP: Metodos construtivos, 2-opt, Busca tabu
 
Matemática Computacional
Matemática ComputacionalMatemática Computacional
Matemática Computacional
 
MRO simula
MRO simulaMRO simula
MRO simula
 
Aula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.pptAula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.ppt
 
Aula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).pptAula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).ppt
 
Tdc2010
Tdc2010Tdc2010
Tdc2010
 

13 slides

  • 1. Projeto de algoritmos: Tentativa e Erro Projeto e Análise de Algoritmos Delano M. Beder Departamento de Computação (DC) Universidade Federal de São Carlos delano@dc.ufscar.br 11/2011 Estes slides estão protegidos por Licença Creative Commons Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 1 / 14
  • 2. Algoritmos Tentativa e erro Novidade: Nova técnica de solução de problemas. Vocês já aprenderam duas técnicas: (i) projeto por indução (incre- mental) e (ii) divisão e conquista. Tentativa e erro é uma técnica que utiliza recursividade (aliás, como também a técnica divisão e conquista utiliza). A recursividade pode ser usada para resolver problemas cuja so- lução é do tipo tentar todas as alternativas possíveis. Idéia para algoritmos tentativa e erro é decompor o processo em um número finito de subtarefas parciais. Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 2 / 14
  • 3. Algoritmos Tentativa e erro Podem ser vistos como o processo de pesquisa ou de tentativa que gradualmente constrói e percorre uma arvore de sub-tarefas. Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 3 / 14
  • 4. Algoritmos Tentativa e erro Funcionamento dos algoritmos: Passos em direção à solução final são tentados e registrados Caso esses passos tomados não levem à solução final, eles podem ser retirados do registro. A busca na árvore de soluções pode crescer rapidamente (expo- nencialmente). Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 4 / 14
  • 5. Exemplo Passeio do cavalo no tabuleiro de xadrez. Dado um tabuleiro com n × n posições, o cavalo se movimenta se- gundo as regras do xadrez. A partir de uma posição inicial (x0, y0), o problema consiste em en- contrar, se existir um passeio do cavalo com n2 - 1 movimentos, visitando todos os pontos do tabuleiro uma única vez Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 5 / 14
  • 6. Exemplo Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 6 / 14
  • 7. Exemplo (pseudo-código) procedimento tenta BEGIN | inicializa seleção de movimentos | WHILE | movimento não bem sucedido | AND | existem candidatos a movimento | DO | seleciona próximo candidato ao movimento | IF | aceitável | THEN | registra movimento | IF | tabuleiro não está cheio | THEN | tenta novo movimento (chamada recursiva) | IF | não sucedido | THEN | apaga registro anterior | FI FI FI OD END Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 7 / 14
  • 8. Solução do exemplo O tabuleiro ⇒ matriz n × n. Situação de cada posição: t[x,y] = 0, <x,y> não foi visitada t[x,y] = i, <x,y> visitada no i-ésimo movimento, 1 ≤ i ≤ n2 . As regras do xadrez são utilizadas para os movimentos do cavalo Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 8 / 14
  • 9. Solução do exemplo public class KnightsTour { final int[] dx = { 2, 1, -1, -2, -2, -1, 1, 2 }; final int[] dy = { -1, -2, -2, -1, 1, 2, 2, 1 }; final int num; final int numSqr; int[][] table; public KnightsTour(int num) { this.num = num; this.numSqr = num * num; this.table = new int[num][num]; } boolean isAcceptable(int x, int y) { boolean result = (x >= 0 && x <= num - 1); result = result && (y >= 0 && y <= num - 1); result = result && (table[x][y] == 0); return result; } ... } Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 9 / 14
  • 10. Solução do exemplo boolean tryMove(int i, int x, int y) { // Verifica a quantidade de movimentos boolean done = (i > numSqr); int k = 0; int u, v; while (!done && k < 8) { u = x + dx[k]; v = y + dy[k]; if (isAcceptable(u, v)) { table[u][v] = i; done = tryMove(i + 1, u, v); // tenta outro movimento if (!done) { table[u][v] = 0; // não sucedido. Descarta movimento } } k = k + 1; } return done; } Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 10 / 14
  • 11. Solução do exemplo void showTour(int x, int y) { table[x][y] = 1; boolean done = tryMove(2, x, y); if (done) { for (int i = 0; i < num; i++) { for (int j = 0; j < num; j++) { System.out.print(table[i][j] + " "); } System.out.println(); } } else { System.out.println("No possible tour"); } } public static void main(String[] args) { int n = Integer.parseInt(args[0]); int x = Integer.parseInt(args[1]); int y = Integer.parseInt(args[2]); new KnightsTour(n).showTour(x, y); } Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 11 / 14
  • 12. Resultado do exemplo Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 12 / 14
  • 13. Resumo Foi apresentada a técnica de projeto de algoritmos: tentiva e erro – tentar todas as alternativas possíveis. Foi apresentado um exemplo de algoritmos de tentativa e erro – passeio do cavalo no tabuleiro de xadrez. Referência utilizadas: [1] páginas 42 a 46, [2] páginas 120 a 125. [1] Nívio Ziviani. Projeto de Algoritmos com implementações em C e Pascal. Editora Thomson, 2a. Edição, 2004. [2] Niklaus Wirth. Algoritmos e Estrutura de Dados. Editora LTC, Rio de Janeiro, 1989. Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 13 / 14
  • 14. Projeto de algoritmos: Tentativa e Erro Projeto e Análise de Algoritmos Delano M. Beder Departamento de Computação (DC) Universidade Federal de São Carlos delano@dc.ufscar.br 11/2011 Estes slides estão protegidos por Licença Creative Commons Delano M. Beder (DC - UFSCar) Tentativa e Erro 11/2011 14 / 14