Aula 16 - Algoritmos Gulosos: Escalonamento para Minimização de Atraso Máximo e Caching
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:
Definição:
- Um único recurso que processa uma tarefa por vez.
- A tarefa j requer tempo {\color{green}{t}}_j para completar e tem um deadline de {\color{purple}{d}}_j.
- Se a tarefa j inicia em {\color{blue}{s}}_j, ela termina em {\color{blue}{s}}_j + {\color{green}{t}}_j.
- O atraso da tarefa j é {\color{orange}{l}}_j = \max\{0, {\color{red}{f}}_j - {\color{purple}{d}}_j\}.
- Objetivo é alocar todas as tarefas minimizando o atraso máximo {\color{orange}{L}} = \max_j {\color{orange}{l}}_j.
Note que aqui estamos minimizando o atraso máximo, mas poderíamos ter outros objetivos:
Cada objetivo pode necessitar de algoritmos diferentes, e pode não haver uma estratégia gulosa ótima.
Considere as seguintes tarefas:
Observe que a seguinte alocação não é ótima: a tarefa 1 possui atraso 2, e a tarefa 4 possui atraso 6 (no caso, o atraso máximo):
Estratégia Gulosa: Considera alocar as tarefas em alguma ordem natural.
P. Qual ordem?
Pergunta: Alguma funciona?
Teste as seguintes estratégias para minimizar o atraso máximo:
Instância 1:
| Tarefa | a | b | c |
|---|---|---|---|
| Duração ({\color{green}{t}}) | 1 | 2 | 6 |
| Deadline ({\color{purple}{d}}) | 3 | 2 | 7 |
Teste as seguintes estratégias para minimizar o atraso máximo:
Instância 2:
| Tarefa | a | b | c |
|---|---|---|---|
| Duração ({\color{green}{t}}) | 4 | 5 | 3 |
| Deadline ({\color{purple}{d}}) | 10 | 6 | 9 |
Observação 1. Existe uma solução ótima sem tempo ocioso.
Observação 2.
MenorDeadlinePrimeiroproduz uma alocação sem tempo ocioso.
Definição. Dado um escalonamento S, uma inversão é um par de tarefas i e j tal que: d_i < d_j, mas j é alocado antes de i (onde d_i e d_j correspondem aos deadlines das tarefas).
Observação 3.
MenorDeadlinePrimeironão tem inversões.
Observação 4. Se um escalonamento tem uma inversão, ele tem uma inversão com tarefas consecutivas.
Afirmação. Trocar duas tarefas adjacentes invertidas reduz o número de inversões e não aumenta o atraso máximo.
Demonstração. Seja {\color{orange}{l}} o atraso antes da troca, e {\color{orange}{l}}' o atraso depois da troca.
Primeiro, {\color{orange}{l}}_k' = {\color{orange}{l}}_k para toda tarefa k diferente de i, j, e {\color{orange}{l}}_i' \leq {\color{orange}{l}}_i.
Se j possui atraso: \begin{aligned} {\color{orange}{l}}_j' &= {\color{red}{f}}_j' - {\color{purple}{d}}_j \\ {\color{orange}{l}}_j' &= {\color{red}{f}}_i - {\color{purple}{d}}_j \\ {\color{orange}{l}}_j' &\leq {\color{red}{f}}_i - {\color{purple}{d}}_i \\ {\color{orange}{l}}_j' &\leq {\color{orange}{l}}_i \qquad \blacksquare \end{aligned}
Teorema. O
MenorDeadlinePrimeiroé ótimo.
Demonstração. Seja S^* uma solução ótima.
Objetivo: Escalonamento de remoção que minimize o número de faltas na cache.
Exemplo: k = 2, cache inicial = \{a, b\}, requisições: a, b, c, b, c, a, b.
Escalonamento ótimo: 2 remoções (cache misses).
Aplicações:
Visualização: https://brunogrisci.github.io/schedulingalgorithms
LIFO/FIFO: Remove o item trazido para a cache mais (menos) recentemente.
LRU (Least Recently Used): Remove o item cujo acesso recente foi o mais antigo.
LFU (Least Frequently Used): Remove o item que foi menos frequentemente requisitado.
Farthest-in-future (Mais distante no futuro): Remove o item da cache que não será requisitado até o momento mais distante no futuro.
Teorema [Bélády 1966]. FF (Farthest-in-future) produz o escalonamento ótimo de remoções.
Demonstração. O algoritmo e o teorema são intuitivos; a prova é sutil.
Pergunta: Qual item vai ser removido seguindo o algoritmo FF?
Definição. Um escalonamento reduzido é um escalonamento que traz um item d para a cache no passo j somente se houver uma requisição por d no passo j e d não estiver já na cache.
Ideia Intuitiva: Não faz sentido trazer itens para a cache antes que eles sejam necessários, ou quando já estão lá.
Afirmação. Dado qualquer escalonamento não-reduzido S, podemos transformá-lo em um escalonamento reduzido S' com o mesmo número ou menos remoções.
Demonstração [por indução no número de passos j]:
Afirmação. Dado qualquer escalonamento não-reduzido S, podemos transformá-lo em um escalonamento reduzido S' com o mesmo número ou menos remoções.
Demonstração [por indução no número de passos j]:
Afirmação. Dado qualquer escalonamento não-reduzido S, podemos transformá-lo em um escalonamento reduzido S' com o mesmo número ou menos remoções.
Demonstração [por indução no número de passos j]:
Afirmação. Dado qualquer escalonamento não-reduzido S, podemos transformá-lo em um escalonamento reduzido S' com o mesmo número ou menos remoções.
Demonstração [por indução no número de passos j]:
Demonstração [continuação]:
Observação: Resolver o Caso 1 pode acabar engatilhando o Caso 2.
Teorema. FF é o algoritmo ótimo de remoção.
Demonstração. Segue diretamente do seguinte invariante:
Invariante. Existe um escalonamento ótimo reduzido S que realiza as mesmas remoções que o S_{FF} durante os primeiros j passos.
Prova completa: Seção 4.3 do livro Algorithm Design, de Kleinberg e Tardos.
Algoritmos Online vs. Offline:
Teorema. FF é o algoritmo ótimo de remoção offline.
- Fornece uma base teórica para entender e analisar algoritmos online.
- Experimentalmente, variantes do LRU funcionam muito bem no caso online.
https://github.com/BrunoGrisci/projeto-e-analise-de-algoritmos/blob/main/paa1/scheduling.ipynb
?