Vous êtes sur la page 1sur 25

Andr Pimenta Freire GCC111 Projeto e Anlise de Algoritmos Universidade Federal de Lavras 9 de Maio de 2012

Definio de algoritmos gulosos


Procedimentos utilizados em algoritmos gulosos Como construir algoritmos gulosos corretos

Exemplo seleo de atividades


Exemplo Problema da mochila

Ser capaz de... Identificar as aplicaes em que algoritmos gulosos podem ser utilizados Definir os principais procedimentos utilizados para a construo de um algoritmo guloso Identificar os elementos essenciais para mostrar a corretude de algoritmos gulosos

Comumente usados em problemas de otimizao


Problemas que envolvem uma sequncia de passos

Sempre escolhe a opo que parece a melhor a cada momento Nunca reverte ou reconsidera a deciso

Sem backtracking No revisa uma escolha j feita

Escolha a cada iterao feita a partir do uso de um critrio guloso


Deciso do critrio guloso localmente tima Depende da existncia de uma subestrutura tima Escolha gulosa garante que a cada interao, a deciso leva a uma soluo global tima Relativamente simples de projetar um algoritmo guloso, mas difcil de provar que funciona

Pode ser uma maximizao ou minimizao, dependendo do problema


Caminho mais curto, maior nmero de elementos, menor nmero de jogadas, etc.

Funo de seleo de elementos para a soluo


Maximizao escolha do elemento candidato que proporcione maior ganho individual Minimizao escolha do elemento candidato com menor custo associado Importante escolha de como o conjunto inicial ser ordenado

Inicia com uma lista ou conjunto de candidatos Mantem-se dois conjuntos:

Candidatos considerados e escolhidos Candidatos considerados e rejeitados

Uso de uma funo para verificar se um conjunto particular de candidatos produz uma soluo (ainda sem considerar a otimalidade)

Outra funo verifica se o conjunto de candidatos vivel (tambm sem se preocupar com a otimalidade)
Funo de seleo indica a qualquer momento quais dos candidatos restantes mais promissor Funo objetivo fornece o valor da soluo encontrada

Construir por etapas uma soluo tima


Em cada passo, aps selecionar um elemento de entrada (o melhor), decide-se se ele vivel (se poder fazer parte da soluo) Aps uma sequncia de decises, uma deciso tima encontrada Nenhum elemento examinado mais de uma vez: ou far parte da soluo, ou ser descartado

Diversas atividades precisam ser planejadas, mas elas todas dependem de um mesmo recurso
Diversas aulas que precisam ser dadas em uma mesma sala Duas aulas no podem ser dadas na mesma sala ao mesmo tempo

Problema contm uma lista com o horrio de incio e trmino de cada atividade - Como maximizar o nmero de atividades que podem ser realizadas?

Ilustrao grfica
11 atividades, em 14 horas

Definio do problema:
S = {a , . . . , a }: conjunto de n atividades que podem ser executadas em um mesmo local.
1 n

Para todo i = 1, . . . , n, a atividade ai comea no instante si e termina no instante fi , com 0 si < fi < . Ou seja, supe-se que a atividade ai ser executada no intervalo de tempo (semiaberto) [si , fi ).

As atividades ai e aj so ditas compatveis se os intervalos [si , fi ) e [sj , fj ) so disjuntos.

As atividades ai e aj so ditas compatveis se os intervalos [si , fi ) e [sj , fj ) so disjuntos.

Escolher primeiro as atividades que terminam antes Conjunto mximo de atividades compatveis: (a1, a4, a8, a11).

public class SelecaoDeAtividadesGuloso {


static int selecaoGulosa(int[] ini, int[] fim, int n){ int ultimaSelecionada=0; int selecionadas = 0; if (n==0) return 0; // a primeira atividade sempre selecionada System.out.print("a"+0 + " "); selecionadas++; for (int i=1;i<n;i++) if (ini[i]>=fim[ultimaSelecionada]){ System.out.print("a"+i + " "); selecionadas++; ultimaSelecionada = i; } System.out.println(); return selecionadas; } ...

... // as atividades devem ser ordenadas pelo campo fim // ou seja, as atividades que acabam primeiro ficam na frente private static int[] inicio = { 1,3,0,5,3,5, 6, 8, 8, 2,12 }; private static int[] fim = { 4,5,6,7,8,9,10,11,12,13,14 }; private static int numeroDeAtividades = 11; public static void main(String[] args) { int total=selecaoGulosa(inicio,fim,numeroDeAtividades); System.out.println("Foram selecionadas " + total + " atividades."); } }

Dados:
Uma mochila que admite um certo peso; Um conjunto de objetos, cada um com um valor e um peso;

Objetivo:
Selecionar o conjunto de objetos que caibam dentro da mochila de forma a maximizar o valor total dentro da mochila.

Mochila fracionada (objetos podem ser quebrados)


Melhor soluo para ordenar a entrada
ordenar pelo valor/peso

Soluo gulosa tima

Mochila fracionada (objetos podem ser quebrados) Melhor soluo para ordenar a entrada
ordenar pelo valor/peso

Soluo gulosa tima Algoritmo


Para resolver o Problema da Mochila Fracionada ordene os itens por valor/peso decrescentemente Comeando em i = 1 coloque na mochila o mximo do item i que estiver disponvel e for possvel, e se puder levar mais passe para o prximo item.

Mochila fracionada (objetos podem ser quebrados) Melhor soluo para ordenar a entrada
ordenar pelo valor/peso

Soluo gulosa tima Algoritmo


Para resolver o Problema da Mochila Fracionada ordene os itens por valor/peso decrescentemente Comeando em i = 1 coloque na mochila o mximo do item i que estiver disponvel e for possvel, e se puder levar mais passe para o prximo item.

// W = capacidade mxima da mochila // n = nmero de items load = 0 // carga na mochila i=1 while (load < W) and (i <= n) do { if (wi <= (W load) Pegue todo o item i else Pegue (W load)/wi do item i Adicione a load o peso que foi pego i++ }

Ser capaz de... Identificar as aplicaes em que algoritmos gulosos podem ser utilizados Definir os principais procedimentos utilizados para a construo de um algoritmo guloso Identificar os elementos essenciais para mostrar a corretude de algoritmos gulosos

Cormen, Thomas H.; et al. Introduction to Algorithms. MIT Press, 2001 Parte deste material foi baseado nos slides:
Prof. Norton T. Roman, que estendeu o trabalho de Delano M. Beder, Luciano Digianpietri, David Matuszek, Marco Aurelio Stefanes e Nivio Ziviani disponvel em http://www.each.usp.br/digiampietri/ACH2002/nota sdeaula/9-algoritmosGulosos.pdf
Cid Carvalho de Souza Candida Nunes da Silva, Orlando Lee

http://www.ic.unicamp.br/~lee/mo417/guloso.pdf

Vous aimerez peut-être aussi