Anda di halaman 1dari 30

Tcnicas de Desenho de Algoritmos

Mudana de nfase:
da implementao de algoritmos para o desenho de algoritmos

A ver: 5 tipos de algoritmos


abordagem ao problema exemplos complexidade em tempo e espao

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

Algoritmo atinge ptimos locais


se ptimo global, soluo se no, pode servir para obter aproximao

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

Tempo mdio: 17.75

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

Escalonamento multiprocessador Exemplo com 3 processadores


Total de tempos: 165 Tempo mdio: 18.33
j1 j2 j3 3 5 6 13 j4 j5 j6 16 20 28 j7 j8 j9 34 40

Tarefa Tempo j1 j2 j3 j4 j5 j6 j7 j8 j9 3 5 6 10 11 14 15 18 20

Soluo ptima no nica


Para cada i, o i < n/P
as tarefas j iP+1 a j (i+1)P so alocadas a processadores diferentes

j1 j2 j3 3

j5 j4 j6 56 14 15

j9 j7 j8 20 30 34 38

Minimizar tempo de completao


Tempo a minimizar o da ltima tarefa a terminar

j2 j6 j1 3 5 j3 9

j5 j9 j4 14 16 19

j8

j7 34

Este problema variante do empacotamento, logo NP-completo!

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

Aplicao directa - Fibonacci


Problemas expressos recursivamente que podem ser reescritos em formulao iterativa Exemplo: nmeros de Fibonacci

/** 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

Exemplo: Equao de recorrncia


2 n1 C(n) = C(i) + n n i =0
Para resolver numericamente, expresso recursiva directa

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; }

Algoritmo recursivo exponencial!

Problema: repetio de chamadas

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]; }

Algoritmo iterativo O(n2)

Evita chamadas recursivas guardando tabela de 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;

Algoritmo iterativo O(n)

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

Exemplo: arranjo da moblia numa casa


grande nmero de possibilidades cada pea de moblia colocada, soluo arranjo satisfatrio chegando a ponto onde qualquer arranjo inconveniente, desfaz-se o ltimo passo e tentase alternativa muitos arranjos nunca so testados

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|

Distncias podem ser geradas em tempo O(n2)

Problema inverso: coordenadas dos pontos a partir das distncias: mais difcil
No h algoritmo garantido como polinomial para o problema

D - conjunto das distncias |D| = m = n (n-1) / 2

Algoritmo que se segue: O(n2 log n) - conjectura

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

x1 = 0 D= {1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 5, 6, 7, 8} maior distncia: 8 ento x2 = 2 ou

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

6 - maior valor em D -> x4 = 6 ou x3 = 4 x3 = 4 impossvel, s 1 vez 4 em D

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

x5=8 x** 4=7 * x3=6 * x2=4 x3=4 x2=3

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)

Com retrocesso: perde-se eficincia


no existe limite polinomial para o retrocesso requerido no esto identificados exemplos patolgicos com pontos de coordenadas inteiras e distribudas uniformemente, conjectura que retrocesso no ocorre mais que O(1)

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

Em geral, em jogos no triviais


no possvel dispor de decises para todos os caminhos a partir de uma posio preciso recomputar a cada jogada impraticvel explorar todas as hipteses

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)

Pesquisa com limite de profundidade


Em jogos complexos: invivel pesquisar todos os ns terminais para avaliar a posio
parar a determinada profundidade ns onde pra a recurso tratados como ns terminais funo de estimativa para avaliar ns terminais Ex: xadrez - avaliar peas e suas posies

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

Cortes Estrutura da pesquisa de posies (ns) e valores das avaliaes


Max
40

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