Aula 15 - Algoritmos Gulosos: Escalonamento e Particionamento de Intervalos
Universidade Federal do Rio Grande do Sul
Instituto de Informática
Departamento de Informática Teórica
Estes slides utilizam conteúdo adaptado da bibliografia da disciplina e também de notas de aula e slides prévios dos professores Bruno Grisci, Rodrigo Machado, André Grahl Pereira, Lucas Nunes Alegre, Marcus Ritt e Luciana Buriol.
“Embora a gula seja considerada um dos sete pecados capitais, acontece que algoritmos gulosos frequentemente tem uma performance muito boa.”
— Stuart Russell
Ideia Geral:
Premissa dos Algoritmos Gulosos:

Definição. Um algoritmo guloso é aquele que constrói a solução global para o problema a partir de decisões locais ótimas.
Observação. Quando um algoritmo guloso resolve um problema otimamente, isso implica em algo fundamental sobre a estrutura do problema.
Divisão e Conquista vs. Algoritmos Gulosos:
| Divisão e Conquista | Algoritmos Gulosos | |
|---|---|---|
| Propor Algoritmos | Difícil | Fácil |
| Análise de Complexidade | Difícil | Fácil |
| Corretude | Fácil | Difícil Demonstrar |
Observação. A maioria das estratégias gulosas não são corretas (não garantem a solução ótima).
Ficar à Frente:
Argumento da Troca:
O que Funcionar:
Objetivo. Dadas denominações de moedas (ex.: \{1, 5, 10, 25, 100\}), pagar um valor usando o menor número de moedas.
Considere n atividades que devem ser executadas:
Definição. Duas tarefas são compatíveis se elas não se sobrepõem.
Objetivo. Encontrar o subconjunto máximo de tarefas compatíveis.
Entrada: Conjunto de n tarefas com tempos de início ({\color{blue}{s}}_j) e fim ({\color{red}{f}}_j).
Objetivo: Encontrar um subconjunto de tarefas mutualmente compatíveis com tamanho máximo.

Abordagem Gulosa:
P. Qual ordem?
P. Alguma funciona?
Vejamos como essas estratégias funcionam sobre as seguintes instâncias:
Possíveis estratégias gulosas: 1) Inicia mais cedo; 2) Termina mais cedo; 3) Menor intervalo; 4) Menor número de conflitos.
P. Algoritmo e Complexidade?
Afirmação. O algoritmo pode ser implementado em O(n\log n).
P. Como podemos mostrar que a estratégia TerminaMaisCedo gera um resultado correto?
Seja A = [i_1, i_2, \dots, i_k] a sequência ordenada de intervalos do algoritmo.
Seja O = [j_1, j_2, \dots, j_m] a sequência ordenada de intervalos em uma solução ótima.
Precisamos mostrar k = m (a seleção do algoritmo é do mesmo tamanho que uma solução ótima).
Note que tanto A quanto O são compatíveis (nenhum par de intervalos está em conflito).
Seja A = [i_1, i_2, \dots, i_k] a sequência ordenada de intervalos selecionados pelo algoritmo.
Seja O = [j_1, j_2, \dots, j_m] a sequência ordenada de intervalos em uma solução ótima.
Lema. Para todos os índices r \leq k, temos {\color{red}{f}}(i_r) \leq {\color{red}{f}}(j_r).
Prova. Por indução em r:
Afirmação. O algoritmo
TerminaMaisCedoé ótimo.
Prova. Assume que o algoritmo não é ótimo (e mostra uma contradição).
Ideia: Mostra que, a cada passo, a solução gulosa é pelo menos tão boa quanto qualquer outra solução viável (inclusive a ótima) até aquele ponto.
Como funciona:
Uso Típico: Funciona bem quando a solução se constrói incrementalmente e cada passo pode ser comparado diretamente.
Definição (Particionamento de Intervalos).
- Cada aula j inicia em {\color{blue}{s}}_j e termina em {\color{red}{f}}_j.
- O objetivo é encontrar o número mínimo de salas para atribuir as aulas tal que duas aulas não ocorram na mesma sala ao mesmo tempo.
P. Uma solução?
Definição (Particionamento de Intervalos).
- Cada aula j inicia em {\color{blue}{s}}_j e termina em {\color{red}{f}}_j.
- O objetivo é encontrar o número mínimo de salas para atribuir as aulas tal que duas aulas não ocorram na mesma sala ao mesmo tempo.
P. Uma solução melhor?
Definição (Particionamento de Intervalos).
- Cada aula j inicia em {\color{blue}{s}}_j e termina em {\color{red}{f}}_j.
- O objetivo é encontrar o número mínimo de salas para atribuir as aulas tal que duas aulas não ocorram na mesma sala ao mesmo tempo.
P. Uma solução melhor?
Abordagem Gulosa: Considera as aulas em alguma ordem natural. Atribui cada aula para uma sala disponível, seleciona uma nova sala se nenhuma está disponível.
P. Qual ordem?
P. Alguma funciona?
Afirmação. O algoritmo pode ser implementado em O(n\log n).
Definição. A profundidade do conjunto é o intervalo com maior número de conflitos.
Observação. O número de salas \geq profundidade.
P. O número de salas deve ser igual à profundidade?
Afirmação. O algoritmo
IniciaMaisCedoé ótimo.
Prova. Por contradição, assuma que o algoritmo não é ótimo: ele retorna d mas deveria retornar f < d (número de salas mínimo).
https://github.com/BrunoGrisci/projeto-e-analise-de-algoritmos/blob/main/paa1/scheduling.ipynb
?