Fundamentos de Programação II Estratégias algorítmicas de resolução de problemas Prof. Msc. Everton Fernando Baro 2014/01 Agenda ● Estratégias algorítmicas – Recursividade – Divisão e conquista ● Balanceamento – Tentativa e erro – Algoritmos gulosos e aproximados – Programação dinâmica Algoritmos gulosos “A melhor solução é a que resolve o problema mais imediato” ● ● ● Também chamados algoritmos gananciosos Escolhem a opção que parece ser a melhor no momento (escolha ótima) e esperam que desta forma consiga-se chegar a uma solução ótima global Utilizada para resolução de problemas de otimização, que lidam com sequências de passos que exigem decisão/escolha Algoritmos gulosos ● ● Tomam decisões com base apenas na informação disponível, sem se preocupar com os efeitos futuros Algoritmos gulosos nunca reconsideram as decisões tomadas, independentemente das consequências Algoritmos gulosos ● Características gerais – Existe um problema a ser resolvido e um conjunto de candidatos à solução – Durante a execução do algoritmo são criados dois conjuntos ● ● – Avaliados + rejeitados Avaliados + escolhidos Uma rotina verifica se um conjunto de candidatos produz uma solução Algoritmos gulosos ● Características gerais – Uma segunda rotina verifica se é ou não possível adicionar candidatos a este conjunto para obter pelo menos uma solução ótima – Uma rotina de seleção identifica qual dos candidatos restantes é o melhor – Uma rotina objetivo retorna o valor da solução encontrada Problema do Troco ● ● ● Suponha que tenhamos disponíveis moedas com valores de 1.00, 0.50, 0.25, 0.10, 0.05 e 0.01 O problema é criar um algoritmo para obter um determinado valor com o menor número de moedas possível O problema do troco é um algoritmo guloso quando, após escolhida uma moeda para fazer parte do conjunto solução, ela nunca mais é retirada do conjunto Problema do Troco Problema do Troco Problema do Troco Dúvidas Agenda ● Estratégias algorítmicas – Recursividade – Divisão e conquista ● Balanceamento – Tentativa e erro – Algoritmos gulosos – Algoritmos aproximados – Programação dinâmica Algoritmos aproximados ● ● ● Algoritmos com soluções polinomiais são considerados fáceis Algoritmos com soluções exponenciais são considerados difíceis Os algoritmos vistos até o momento tem solução polinomial – ● O tempo computacional para apresentar a solução cresce geometricamente em função do tamanho do problema Algoritmos difíceis são comuns na natureza Algoritmos aproximados ● ● Problemas de solução exponencial são computacionalmente relacionados e formam uma classe conhecida como NP (nondeterministic polynomial) A teoria do NP-Completo diz que um problema NP tem solução polinomial se, e somente se, todos os outros problemas NP puderem ser resolvidos em tempo polinomial Algoritmos aproximados ● O problema do Caixeiro Viajante – Um caixeiro viajante deseja visitar n cidades de tal forma que sua viagem inicie e termine em uma mesma cidade, e cada cidade seja visitada uma única vez – Supõe-se que sempre existe uma estrada entre duas cidades quaisquer, o problema é encontrar a menor rota que o caixeiro viajante pode utilizar em sua viagem Algoritmos aproximados ● Para o exemplo abaixo, o percurso <C1, C3, C4, C2, C1> é solução para o problema, com distância 24 C1 4 9 8 C3 3 5 C2 8 C4 Algoritmos aproximados ● ● Um algoritmo simples deveria verificar todas as rotas possíveis e escolher a menor Existem (n - 1)! rotas possíveis – ● ● ● permutação dos caminhos entre uma cidade e outra Para n cidades, n – 1 caminhos chegam até ela Para cada caminho, são feitas n operações de soma para calcular a distância No total, n! operações de soma são realizadas Algoritmos aproximados ● No exemplo, n = 4 cidades – Para esse percurso, o algoritmo demoraria em torno de 4! = 24 unidades de tempo C1 4 9 8 C3 3 5 C2 8 C4 Algoritmos aproximados ● Para 50 cidades, o algoritmo demoraria em torno de 50! =~ 1064 unidades de tempo – ● !!!!!!!!!! O que fazer? – Algoritmos aproximados geram soluções aproximadas dentro de um limite para a razão entre a solução ótima e a solução aproximada Algoritmos aproximados ● Enfoques para desenvolver algoritmos aproximados – Algoritmos exponenciais usando Tentativa e Erro ● ● ● Utiliza técnicas de poda para eliminar caminhos que não levarão à solução ótima Encontrar um algoritmo eficiente que não leva à solução ótima, mas garantidamente próxima da ótima Encontrar algoritmos que, na média, é eficiente, funcionando bem para as entradas que ocorrem usualmente na prática Dúvidas