Escolar Documentos
Profissional Documentos
Cultura Documentos
Mudana de nfase:
da implementao de algoritmos para o desenho de algoritmos
Referncias: Mark Allen Weiss. Data Structures & Algorithm Analysis in Java. AddisonWesley, 1999. Robert Sedgewick. Algorithms in C++. Addison-Wesley, 1992. Steven S. Skiena. The Algorithm Design Manual. Springer 1998.
Algoritmos Gananciosos
Exemplos Anteriores: Dijkstra, Prim, Kruskal Cada fase do algoritmo:
deciso baseada no ganho imediato consequncias futuras no consideradas
Exemplo de problema que resolve bem: fazer trocos, minimizando nmero de notas e moedas
estratgia: dar repetidamente a maior unidade possvel
Exemplo de problema que no resolve bem: caminho mais rpido usando estratgia da melhor aresta adjacente
Problema de escalonamento
Dados: tarefas e tempos Objectivo: minimizar tempo mdio de terminao Tempo mdio: 25 Tarefa j1 j2 j3 j4 Tempo 15 8 3 10
j3 3 j2 11 j4 21 j1 36 15 23 26 36 j1 j2 j3 j4
Escalonamento
2 soluo ptima Porqu: tarefas mais curtas primeiro Tarefas: ji1 , j i2 ,..., j in Terminaes: ti1, ti1+ti2, ... Custo total da soluo:
n (n k +1)t ik k =1
=
n n (n+1) t ik kt ik k =1 k =1
Se existe x>y tal que tix < tiy: troca de jix e jiy diminui custo
Tarefa Tempo j1 j2 j3 j4 j5 j6 j7 j8 j9 3 5 6 10 11 14 15 18 20
j1 j2 j3 3
j5 j4 j6 56 14 15
j9 j7 j8 20 30 34 38
j2 j6 j1 3 5 j3 9
j5 j9 j4 14 16 19
j8
j7 34
Diviso e conquista
Diviso: resolver recursivamente problemas mais pequenos (at caso base) Conquista: soluo do problema original formada com as solues dos subproblemas
H diviso quando o algoritmo tem pelo menos 2 chamadas recursivas no corpo Subproblemas devem ser disjuntos
Algoritmos j vistos:
Travessia de rvores em tempo linear: processar rvore esquerda, visitar n, processar rvore direita Ordenaes: mergesort: ordenar 2 subsequncias e junt-las quicksort: ordenar elementos menores e maiores que pivot, concatenar
Quicksort
function quicksort(array) var list less, greater if length(array) 1 return array select and remove a pivot value pivot from array for each x in array if x pivot then append x to less else append x to greater return concatenate(quicksort(less), pivot, quicksort(greater))
Diviso e conquista: problema partido em subproblemas que se resolvem separadamente; soluo obtida por combinao das solues Programao dinmica: resolvem-se os problemas de pequena dimenso e guardam-se as solues; soluo de um problema obtida combinando as de problemas de menor dimenso Diviso e conquista top-down Programao dinmica bottom-up Abordagem usual na Investigao Operacional
Programao aqui usada com o sentido de formular restries ao problema que tornam um mtodo aplicvel
Programao Dinmica
Quando aplicvel a programao dinmica: estratgia ptima para resolver um problema continua a ser ptima quando este subproblema de um problema de maior dimenso
/** Nmeros de Fibonacci * verso recursiva */ n >= 0 int fib( const unsigned int n ) {
if( n <= 1 ) return 1; else return fib( n-1 ) + fib( n-2 );
/** Nmeros de Fibonacci * verso iterativa */ int fibonacci(int n ) { int last=1, nextToLast=1, answer=1; if( n <= 1 ) return 1; for( int i = 2; i<=n; i++ ) { answer = last + nextToLast; nextToLast = last; last = answer; } return answer; }
Fibonacci
Expresso recursiva: algoritmo exponencial Expresso iterativa: algoritmo linear Problema na formulao recursiva: repetio de chamadas iguais
F6 F5 F4 F3 F2 F1 F0 F1 F2 F1 F0 F2 F1 F0 F3 F1 F2 F1 F0 F3 F1 F4 F2 F1 F0
double eval( int n ) { double sum = 0.0; if( n == 0 ) return 1.0; for( int i = 0; i < n; i++ ) Sum += eval( i ); return 2.0 * sum / n + n; }
Chamadas Repetidas
C5 C4 C3 C2 C1 C0 C0 C1 C0 C0 C2 C1 C0 C0 C1 C0 C0 C2 C1 C0 C0 C3 C1 C0 C0 C2 C1 C0 C0 C1 C0 C0
Soluo iterativa 1
double eval(int n ) { double [ ] c = new double [n+1]; c[0] = 1.0; for( int i = 1; i <= n; i++ ) { double sum = 0.0; for( int j = 0; j < i; j++ ) sum += c[j]; c[i] = 2.0 * sum / i + i; } return c[n]; }
Soluo iterativa 2
double eval(int n ) { double sum = 0.0; double [ ] a = new double [n+1]; a[0] = 1.0; for( int i = 1; i <= n; i++ ) a[i] = a[i-1] + 2.0 * a[i-1] / i + i; double answer = 2.0 * a[n] / n + n; return answer;
Tabela de A(n) guarda valor dos somatrios; para cada entrada basta acrescentar 1 termo
Algoritmos em que se geram escolhas que vo sendo testadas e eventualmente refeitas Problemas para os quais no existem algoritmos eficientes: retrocesso melhor que pesquisa exaustiva
soluo gerada e avaliada parcialmente quando uma soluo parcial no satisfaz objectivos, retrocesso apenas desfaz ltima escolha evita-se a pesquisa em ramos que garantidamente no levam a soluo - poda da rvore de pesquisa
Algoritmos de retrocesso
Problema da portagem
Dados: n pontos p1, p2, ..., pn situados no eixo dos xx
xi a coordenada x de pi x1= 0 determinam n (n-1)/2 distncias d1, d2, ..., dm da forma |xi - xj|
Problema inverso: coordenadas dos pontos a partir das distncias: mais difcil
No h algoritmo garantido como polinomial para o problema
Exemplo
D= {1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 5, 6, 7, 8, 10}
|D| = 15 -> n = 6 x1 = 0, x6 = 10
x6 = 10
x5 = 8 (escolha indiferente)
x1 = 0
x5 = 8 D= {1, 2, 2, 3, 3, 3, 4, 5, 5, 5, 6, 7}
x6 = 10
Exemplo
7 - maior valor em D -> x4 = 7 ou x2 = 3 x4 = 7 x2 = 3 distncias distncias x6 - 7 = 3 e x5 - 7 = 1 3-x1 = 3 esto em D
e x5 - 3 = 5 esto em D
x1 = 0
x4 = 7 D= {2, 2, 3, 3, 4, 5, 5, 5, 6}
x5 = 8
x6 = 10
6 - maior valor em D -> x3 = 6 ou x2 = 4 x3 = 6 x2 = 4 distncia distncias x4 - x3 = 1 impossvel, j no existe 1 em D x2-x1 = 4 e x5 - x2 = 4 impossvel, s 1 vez 4 em D
preciso retroceder!
Exemplo
x4 = 7 no conduziu a soluo x2 = 3 tenta-se agora
x1 = 0
x2 = 3 D= {1, 2, 2, 3, 3, 4, 5, 5, 6}
x5 = 8
x6 = 10
x1 = 0
x2 = 3 D= {1, 2, 3, 5, 5}
x4 = 6
x5 = 8
x6 = 10
Exemplo
x1 = 0 x2 = 3 x3 = 5 D={} x4 = 6 x5 = 8 x6 = 10
x1=0, x5=10
rvore de deciso
x4=6 x3=5
Na ausncia de retrocesso
O(n2) operaes em D
Anlis e
D pode ser mantido como rvore de pequisa equilibrada remoo: D tem O(n2) elementos, no h reinseres, total O(n2) pesquisa: 1 tentativa de colocao faz no mximo 2n, total O(n2) Tempo total O(n2 log n)
Jogos
Como jogar automaticamente um jogo estratgico? Exemplo: jogo do galo
pode construir-se algoritmo que nunca perde e aproveita oportunidades para ganhar posies crticas armazenadas em tabela escolha de jogada baseada na posio corrente usando uma tabela ... todo a anlise do jogo feita pelo programador
Minimax
Estratgia minimax
funo de avaliao da qualidade de uma posio 1 se posio de vitria 0 se empate -1 se para perder se se pode fazer avaliao por inspeco do tabuleiro: posio terminal posio no terminal: valor determinado assumindo recursivamente jogadas ptimas de ambos os lados Um jogador tenta minimizar e o outro maximizar o valor da posio Para posio P: Se a minha vez de jogar
avalio recursivamente as posies sucessoras Ps, escolhendo o valor maior; ao avaliar Ps as suas sucessoras so avaliadas e o menor valor escolhido (caso mais favorvel para o oponente)
Para aumentar o factor de previso - mtodos que avaliam menos ns e no perdem informao sobre posies j avaliadas
X O X X O X
...
tabela de transposio
X O
X O X
...
rvore do jogo
Estrutura da pesquisa de posies (ns) e valores das avaliaes
44
Max
44
Min
44
68
Max
27
44
68
Min
42
27
86
44
68
73
Max
A
42
25
27
72
86
44
50
68
73
44
Min
40
Max
40
27
Min
73
40
27
Max
73
23
30
40
19
27
Corte
44 44 40 40 D? Max Min
Valor em D no pode aumentar resultado na raiz: o seu n pai min e tem valor garantidamente inferior ao conseguido na raiz at ao momento
Corte
44 44 68 68 D? Min Max
Valor em C no pode aumentar resultado na raiz: n pai max e tem valor garantidamente superior ao conseguido na raiz at ao momento