Você está na página 1de 8

Aprendizado de Heurísticas Para o

Escalonamento de Sistemas de Tempo Real


Juan Manuel Adán Coello
PUC-Campinas/Unisantos
juan@ii.puc-campinas.br

Resumo
Apresenta-se um método para a indução de classificadores destinados a guiar a
busca por soluções para problemas de escalonamento. O método é aplicado para a
construção de um escalonador de tarefas periódicas com relações de precedência.
Os experimentos discutidos mostram que o escalonador é capaz de aprender a
partir de experiências passadas, melhorando progressivamente o seu desempenho.

Plavras-chave
Busca heurística, indução de árvores de decisão, C4.5, escalonamento, sistemas
de tempo real, aprendizado de máquina.

1. Introdução
Os problemas de escalonamento de interesse prático são em sua maioria NP-
completos (Blazewicz, et al.,1983), motivo pelo qual costumam ser solucionados usando
métodos de busca guiados por regras heurísticas que procuram soluções factíveis, não
necessariamente ótimas.
A aplicação de heurísticas no processo de busca por uma solução procura
reduzir a porção do espaço do problema a ser percorrido. Pode-se dizer que regras heurísticas
classificam os nós a examinar em promissores e não promissores, podendo associar-lhes
medidas de benefício ou custo, que permitem selecionar para expansão o nó que oferece o
maior benefício ou o menor custo.
Uma parte importante dos trabalhos na área de escalonamento heurístico está,
portanto, associada à identificação de heurísticas que reduzam o tempo de busca e aumentem
a qualidade do escalonamento produzido. A determinação dessas heurísticas é um processo
em grande medida ad hod onde, à medida que aumenta o número de fatores a considerar,
aumenta também a sua complexidade (Zhang et. al., 2001).
A literatura evidência que as técnicas de aprendizado de máquina, como o Raciocínio
Baseado em Casos (RBC), a indução de árvores de decisões e regras e as redes neurais
artificiais podem ser usadas com sucesso para gerar classificadores de forma automática ou
semi-automática. Segundo Langley and Simon (1995), essas técnicas apresentam resultados
muito semelhantes em termos de precisão. No entanto, apenas a indução de árvores de decisão
e regras gera modelos explícitos que são relativamente fáceis de analisar por seres humanos,
permitindo que se entenda o processo de classificação.
O coração de um sistema de indução de regras é um algoritmo de indução. Este, a
partir de uma matriz (grade) de conhecimento de atributos, valores e seleções, gera as regras
correspondentes. Diversos algoritmos com esse propósito existem, sendo populares o ID3 e
suas versão mais recente o C4.5 [Quinlan, 1993].
O princípio do ID3 é a geração de uma árvore de decisão a partir de uma tabela de
conhecimento, utilizando o conceito de “conteúdo de informação” da teoria da informação. A
aparência final da árvore de decisão depende da ordem em que os atributos forem escolhidos
para fins de seleção e irá afetar as regras resultantes. O ID3 é capaz de derivar uma árvore de
seleção mínima que, por sua vez, irá minimizar a complexidade das regras, pois o número de
testes necessários para fazer uma classificação será o menor possível. O algoritmo C4.5
estende o ID3 a fim de tratar conjuntos de treino com registros contendo valores
desconhecidos para alguns atributos, tratar atributos com intervalos contínuos, fazer a poda
de árvores de decisão, reduzindo a sua profundidade, e gerar regras a partir das árvores de
decisão.
A Indução automática oferece a possibilidade de deduzir conhecimento novo, pois
pode-se listar os fatores que influenciam uma decisão, sem entender os seus impactos, e
induzir regras que funcionem adequadamente e possam ser usadas em situações novas.
O objetivo deste trabalho é desenvolver um método para o aprendizado automático de
heurísticas para dirigir algoritmos de busca em problemas de escalonamento. Para testar o
método, foi escolhido como problema alvo o escalonamento de tarefas periódicas
independentes em um sistema monoprocessador. As tarefas são compostas de subtarefas1 não
preemptíveis que apresentam relações de precedência e restrições temporais (tempo de
execução, instante de pronto e prazo de término).
Tarefas são representadas por grafos, onde os vértices, ou nós, representam as
subtarefas e os arcos as relações de precedência entre elas. Os atributos dos nós indicam o
tempo de execução, o instante de pronto, o prazo de término e o prazo da subtarefa
correspondente.

função BUSCA-GERAL(problema,ENFILEIRA) retorna uma solução ou falha


nós ← CRIA-FILA(CRIA-NÓ(ESTADO-INICIAL[problema]))
faça
se nós for vazia então retorna falha
nó ← REMOVE-INÍCIO(nós)
se TESTE-DO-OBJETIVO aplicado a ESTADO(nó) for bem sucedido então retorna nó
nós ← ENFILEIRA(nós, EXPANDE(nó,OPERADORES[problema]))
fim_faça
fim_função

Figura 1: O algoritmo de busca geral (Russell e Norvig, 1995).

2. O algoritmo de busca
O escalonador de tarefas foi implementado em C++, usando o paradigma de
programação orientada a objetos. O algoritmo de busca implementado pelo escalonador pode
ser descrito, em sua essência, pelo algoritmo geral de busca mostrado na figura 1 e
informalmente descrito a seguir.
A função BUSCA-GERAL recebe como argumentos uma descrição do problema a
resolver e a função ENFILEIRA, responsável por inserir novos nós de busca na lista de nós a

1
Muitas vezes, o termo tarefa será usado no texto como sinônimo de subtarefa. O contexto deverá permitir
estabelecer a devida distinção.
visitar, e retorna um nó solução ou uma indicação
de falha, caso uma solução não seja encontrada.
TESTE-DO-OBJETIVO verifica se o 1
ESTADO representado por um determinado nó é
um estado solução. A partir de um dado nó de
busca e usando os OPERADORES válidos para o 2 3
problema (grafo que descreve o conjunto de tarefas
a escalonar), EXPANDE deriva novos nós.
Como a remoção da fila de nós a visitar
(nós) é sempre feita a partir de seu início, a ordem 4 5 6 7
em que os nós são visitados depende de como
ENFILEIRA insere os novos nós na fila nós. Em
buscas não informadas, os nós serão inseridos no
8 9
início da lista, quando se tratar de uma busca em
profundidade, e no final, quando se tratar de uma
busca em largura. Em buscas heurísticas, a
inserção se dará no início da fila, de acordo com a 10
ordem determinada pelas heurísticas empregadas.
Um nó da árvore de busca2 indica o estado
da busca em um determinado instante. Nesse Figura 2: Exemplo de Árvore de
instante, foi concluída a execução de uma tarefa e Busca em Profundidade
há uma lista de tarefas não executadas, uma lista de
tarefas executadas, uma lista de tarefas esperando a
que chegue o seu instante de pronto e uma listas de tarefas prontas para execução (tarefas
cujos predecessores já terminaram e cujo instante de pronto é maior ou igual ao instante
atual).
A expansão de um nó é feita a partir da lista de tarefas prontas. Para cada tarefa
pronta, é gerado um novo nó que representa o instante em que essa tarefa termina a sua
execução. Ou seja, na geração de cada nó, o instante atual do nó pai é acrescido do tempo de
execução da tarefa pronta escolhida e, a partir disso, atualizadas as diversas listas de tarefas.
O TESTE-DO-OBJETIVO, aplicado a um nó, será bem sucedido se esse nó
representar um estado em que todas as tarefas já foram escalonadas.
A aplicação do algoritmo de busca a um problema produz uma árvore de busca. Por
exemplo, a figura 2 ilustra uma dessas árvores, para um problema hipotético, usando a busca
em profundidade. Os rótulos no centro dos nós indicam a ordem em que foram gerados.
Partindo do nó 1, as setas indicam a ordem em que os nós foram visitados até chegar ao nó
solução (10). Os nós que estão no caminho que conduz a uma solução foram assinalados em
negrito.

3. Método para a geração de classificadores

3.1 Geração de exemplos para indução


O nosso objetivo é obter heurísticas que permitam à função ENFILEIRA (v. fig. 1)
inserir novos nós no início da fila nós, a fim de reduzir o número de nós a examinar para
chegar a uma solução.

2
Não se deve confundir um nó do grafo que representa o problema de escalonamento, que descreve a uma
subtarefa, com um nó da árvore de busca, que descreve o estado da busca por uma solução (um escalonamento
factível) em um determinado instante.
Para induzir os classificadores que embutirão essas heurísticas, usando algoritmos de
indução de árvores de decisão e regras, precisamos de exemplos de escolhas bem sucedidas e
mal sucedidas. As bem sucedidas podem ser determinadas seguindo o caminho que levou ao
nó solução. Cada nó nesse caminho representa uma decisão correta. Os exemplos de escolhas
mal sucedidas resultam dos nós que não conduziram a uma solução.
Contudo, nem todos os nós que conduziram ou não a uma solução são de fato
exemplos interessantes. Para que se possa afirmar que uma dada decisão foi "errada", é
preciso que houvesse outras que poderiam ter sido tomadas em seu lugar e que possam ser
ditas "corretas", e vice-versa. Deste ponto de vista, na figura 2, os nós 3 e 9 são bons
exemplos de decisões corretas e os nós 2 e 8 de decisões erradas.
Um nó da árvore de busca está associado à execução de uma determinada tarefa da fila
de tarefas prontas do nó pai. Logo, um exemplo deve capturar as características relevantes
dessa tarefa frente às demais tarefas prontas. Nos experimentos descritos neste artigo, isso é
feito através dos atributos apresentados na tabela 1.

Atributo Critério
TempoComp-C tempo de computação
Prazo-C prazo
Sucessores-D número de subtarefas sucessoras diretas
TempoCompSuc-D somatório dos tempos de computação das subtarefas sucessoras diretas
Predecessores-D número de subtarefas predecessoras diretas
TempoCompPred-D somatório dos tempos de computação das subtarefas predecessoras diretas
MenorInstPartida-D menor instante de partida: indica o instante mais cedo em que a subtarefa
poderá ser executada. É calculado levando em conta os instantes de pronto
e de computação das predecessoras.
MaiorInstPartida-C maior instante de partida: indica o instante mais tarde em que deverá ser
iniciada a execução da tarefa, sem comprometer a execução das tarefas
sucessoras. É calculado levando em consideração os tempos de execução e
prazos das sucessoras
Status Atributo categórico. Indica se se trata de um exemplo de "sucesso" ou
"fracasso".
Tabela 1: Estrutura de um exemplo.
Na tabela 1, cada atributo indica a posição da subtarefa pronta escolhida para execução
relativamente às demais subtarefas prontas. "-C" indica que as subtarefas foram ordenadas em
ordem crescente e "-D" decrescente. Por exemplo, o exemplo (2,1,3,4,1,1,2,1,sucesso)
corresponde a uma decisão que conduziu a um escalonamento factível. A tarefa escolhida era
a de segundo menor tempo de computação, a de menor prazo, a terceira em número de
sucessoras etc.

3.2 Indução de classificadores


De posse de um conjunto de exemplos, um algoritmo de indução, como o C4.5, pode
ser usado para gerar modelos de classificação, ou simplesmente classificadores.
Dado em exemplo novo, para o qual são conhecidos os valores dos atributos não
categóricos, o classificador deverá ser capaz de prever o valor do atributo categórico
desconhecido, indicando a confiança nessa previsão. No nosso problema, os atributos não
categóricos são os oito primeiros da tabela 1 e o categórico é o último ("status").
Conjunto de Estrutura das Tarefas Fator de Número de
Problemas (grafos) Folga Problemas
1ª 2ª 3a
cp1 geral geral cadeia 3,0 50
cp2 geral geral cadeia 3,5 50
cp3 geral geral geral 3,0 50
cp4 geral geral geral 3,5 50
cp5 árvore árvore cadeia 3,0 50
invertida
cp6 árvore árvore cadeia 3,5 50
invertida
cp7 * * * * 300
cp1 ∪ ... cp6

Tabela 2: Conjuntos de problemas usados para aprendizado

4. Indução e avaliação de classificadores


O objetivo desta seção é descrever e discutir alguns dos experimentos realizados para
avaliar o método de indução de classificadores apresentado na seção anterior.

4.1 Geração dos problemas


Foram gerados grafos representando problemas envolvendo tarefas periódicas
independentes, compostas por subtarefas com relações de precedência. As subtarefas (nós do
grafo) têm tempo de execução uniformemente distribuído entre 50 (t_comp_min) e 100
(t_comp_max) unidades de tempo. O período P, da tarefa de menor período é dado por:
P = C * tamanho_da_tarefa * fator_de_folga.
onde C representa o tempo médio de computação das subtarefas (75 nos experimentos),
tamanho_da_tarefa indica o número de subtarefas da tarefa sendo gerada (4 nos
experimentos).
O fator_de_folga, ou simplesmente folga, indica a dificuldade potencial para encontrar
uma solução para um problema. Quando a folga é pequena, a diferença entre o tempo
disponível para escalonar as tarefas (prazo da última tarefa menos o instante de pronto da
primeira tarefa) e o somatório dos tempos de execução das tarefas é pequeno, e
consequentemente o número de possíveis seqüências de execução factíveis é pequeno. À
medida que a folga aumenta, aumenta o grau de liberdade do escalonador e tende a aumentar
a taxa de tarefas escalonáveis. Foram gerados problemas com os valores de 3,0 e 3,5 para
fator_de_folga.
Os resultados apresentados referem-se a problemas compostos por três tarefas
periódicas. A primeira com 4 subtarefas (tamanho_da_tarefa = 4), a segunda com oito e a
terceira com 12. O período da primeira tarefa é dado por P, da segunda por 2*P e a da terceira
por 3*P. Assim, para cada problema, será buscado um escalonamento de tamanho igual ao
mínimo múltiplo comum dos períodos das três tarefas, ou seja, 6P. Portanto, o grafo
representando esse escalonamento terá 6 instâncias da primeira tarefa, 3 da segunda e 2 da
terceira, o que corresponderá a um total de 72 nós.
Usando os parâmetros acima, foram produzidos os conjuntos de problemas mostrados
na tabela 2. Usou-se para isso o gerador de grafos denominado Randog que produz grafos
compostos de subgrafos com formas de árvores, árvores invertidas, cadeias, e grafos gerais.

4.2 Geração de exemplos para indução


Os exemplos para indução foram obtidos a partir do conjunto cp7 da tabela 2. O
procedimento inicia-se com uma tentativa de resolver os problemas usando busca em
profundidade não informada. A seguir, a partir dos problemas para os quais foi possível
encontrar solução, são produzidos os exemplos conforme explicado na seção 3.1.
Dos 300 problemas do conjunto 7, 67,2% foram resolvidos. A partir das soluções,
foram gerados 685 registros de exemplos. Destes 685 registros, 42,6% representam casos de
decisões que conduziram a um escalonamento bem sucedido.

4.3 Indução de classificadores


Usando os 685 registros de
exemplos disponíveis e o algoritmo de
indução C5.0, foram produzidos e
avaliados vários classificadores. Para MaiorInstPartida-C
tanto, ora foram usados todos os
registros e atributos ora apenas uma
=< 1 >1
parte deles.
Por limitações de espaço, Sucesso
Prazo-C
examinaremos aqui apenas o (259; 1,0)
classificador apresentado na figura 3. =< 1 >1
Esse classificador foi induzido a partir
dos 685 exemplos disponíveis, Fracasso
MenorInsPartida-D
considerando todos os atributos de (261; 0,985)
cada um. Entre parênteses é indicado o
=< 2 >2
suporte (número de registros de
exemplo que respaldam a Fracasso
classificação) e a confiança na (140; 0,871) TempoComp-C
classificação.
O classificador indica que o =< 1 >1
atributo mais relevante para prever se a
Sucesso Fracasso
escolha de uma subtarefa pronta (11; 0,818) (14; 0,857)
conduzirá ou não a um escalonamento
bem sucedido é MaiorInstPartida-C. Se
esse atributo for menor ou igual a 1, a Figura 3: Classificador induzido com 685
previsão é feita com índice de exemplos derivados do conjunto de
confiança 1,0. Quando esse atributo for problemas 7, da tabela 2.
maior que 1, o atributo mais
importante para fazer a classificação
passa a ser Prazo-C, e assim
sucessivamente.
4.4 avaliação do classificador induzido
O classificador mostrado na figura 3 foi traduzido para uma função em linguagem C e
incorporado ao algoritmo de busca. Usando o classificador, os novos nós gerados como
resultado da expansão de um nó visitado são inseridos em uma lista ordenada. Na frente da
lista ficará o nó classificado como 'Sucesso' com o maior índice de confiança e no final o nó
classificado como 'Fracasso' com o maior índice de confiança.
Foram implementadas e avaliadas várias estratégias de inserção dos novos nós
produzidos como resultado da expansão de um visitado na fila de nós a examinar (nós).
Compararemos aqui três delas. Na primeira, denominada P (Profundidade), que corresponde a
uma busca em profundidade não dirigida, os novos nós são escolhidos aleatoriamente e
inseridos no início da fila sem considerar a ordenação feita. Na segunda, denominada SFIO
(Sucesso e Fracasso no Início em Ordem), todos os nós, tanto de Sucesso como de Fracasso,
são inseridos no início da fila nós respeitando a ordenação feita. Na terceira, denominada SIO
(Sucesso no Início em Ordem), apenas os nós classificados como 'Sucesso' são inseridos no
início da fila, respeitando a ordenação feita. Os demais nós são simplesmente descartados.
A tabela 3 sintetiza os resultados do escalonamento de quatro conjuntos de problemas,
usando o classificador da figura 3 e as estratégias de inserção acima. Os testes foram feitos
com os 300 problemas do conjunto cp7, também usado para a indução do classificador (v.
Tabela 2), e com 3 novos conjuntos, cp1-3-5b, cp2-4-6b e cp7b. O conjunto cp1-3-5b reúne
150 conjuntos de tarefas com fator de folga 3,0 e com as mesmas características estruturais
das tarefas contidos nos conjuntos cp1, cp3 e cp5 da Tabela 2. O conjunto cp2-4-6b contém
problemas com características análogas às das tarefas contidos nos conjuntos cp2, cp4 e cp6
da Tabela 2. O arquivo cp7b, com 300 problemas, corresponde à união dos arquivos cp1-3-5b
e cp2-4-6b. Em todos os experimentos, a busca foi interrompida ao ser ultrapassado o limite
de 3000 nós gerados sem que tivesse sido encontrada uma solução.

# Médio de Nós Gerados # Médio de Nós Visitados

# Tarefas Fila % Sucesso Sucesso Fracasso Sucesso Fracasso


1 cp7 P 67,2 237 3001 103 2887
2 cp7 SFIO 70,2 184 3002 76 2847
3 cp7 SIO 70,2 184 2589 76 1196
4 cp7b P 67,4 241 3002 102 2891
5 cp7b SFIO 68,5 186 3002 76 2854
6 cp7b SIO 68,5 186 2580 76 1104
7 cp1-3-5b P 36,2 297 3002 140 2891
8 cp1-3-5b SFIO 38,9 206 3002 75 2855
9 cp2-4-6b P 96,0 235 3002 104 2869
10 cp2-4-6b SFIO 98,0 178 3002 76 2821

Tabela 3: Resultados de experimentos usando o classificador da figura 3.

Os resultados apresentados na tabela 3 mostram que o uso do classificador leva a um


pequeno aumento do percentual de problemas resolvidos. Como esperado, o aumento é
superior para as tarefas usada para gerar o classificador. Destaca-se um aumento de 7,5% na
taxa de problemas do conjunto cp1-3-5b escalonadas (experimentos 7 e 8). Nesses
experimentos é usado o conjunto de tarefas com a menor taxa de folga, justamente o mais
difícil de escalonar.
Entretanto, o resultado mais expressivo verificado nos experimentos é a redução dos
números médios de nós gerados e visitados para resolver problemas. A redução do número
médio de nós gerados varia de 22,4% no conjunto cp7 (experimentos 1, 2 e 3), a 30,6% no
conjunto cp1-3-5b, justamente o mais difícil de escalonar. A redução do número de nós
visitados varia de 25,5% no conjunto cp7b (experimentos 4, 5 e 6), a 46,4% no conjunto cp1-
3-5b.
É interessante notar que o uso da estratégia SIO – que descarta os nós classificados
como 'Fracasso' – não conduz a uma redução perceptível da taxa de problemas resolvidos,
porém reduz expressivamente a quantidade de nós gerados e visitados, tanto para problemas
resolvidos como para problemas não resolvidos. Isto indica que o classificador identificou
corretamente nós que efetivamente não conduzem a uma solução.

5. Conclusão
Os experimentos discutidos neste artigo mostraram que a indução automática de
classificadores é um método de grande potencial para a construção de escalonadores para
sistemas de tempo real. O método apresentado permite construir sistemas de busca que à
medida que são executados podem melhorar o seu desempenho, a partir da análise dos
sucessos e fracassos verificados na solução de problemas passados.
Foi possível constatar que o classificador induzido levou a uma significativa redução
do número de nós de busca produzidos e visitados, reduzindo consequentemente o consumo
de memória e o tempo de execução do escalonador.
Os experimentos discutidos comparam o desempenho do escalonador usando as
heurísticas aprendidas com relação à escolha aleatória do próximo nó a examinar. Esses
experimentos permitiram verificar a capacidade de aprender do método empregado, mas não a
qualidade das heurísticas aprendidas. Em trabalhos futuros, a comparação deverá ser feita
também com outras heurísticas discutidas na literatura.
A comparação e a integração do método indutivo aqui descrito com outras abordagens
da área de aprendizado de máquina, particularmente o raciocínio baseado em casos (Adán
Coello e Camilo dos Santos, 1999), deverá também ser objeto de trabalhos futuros.
Finalmente, deve-se salientar que o método de produção de heurísticas para o controle
de busca apresentado neste trabalho transcende os problemas de escalonamento de sistemas
de tempo real, podendo ser usado em outros contextos que possam ser formulados como
problemas de busca.

Referências
Adán Coello, J.M., Santos, R. C., Integrating CBR and Heuristic Search for Learning and
Reusing Solutions in Real-Time Task Scheduling. Lecture notes in computer science; Vol.
1650. Springer-Verlag, Germany. pp. 89-103. 1999.
Blazewicz, J., J.K. Lenstra and A.H.G.R. Kan. (1983). "Scheduling Subject to Resource
Constraints: Classification and Complexity". Discrete Applied Mathematics 5, 11-24.
Langley, P. and H. A. Simon. Applications of Machine Learning and Rule Induction. Comm.
of the ACM, nov. 1995.
Quinlan, J.R., C4.5: Programs for machine learning. Morgan-Kaufmann, 1993.
Russell, S., Norvig, P. Artificial Intelligence: A Modern Approach. Prentice Hall, 1995.
Zhang, W., Dechter, R., Korf, R. E. (eds.). Special Issue: Heuristic Search in Artificial
Intelligence. Artificial Intelligence, Vol. 129, nos. 1-2, june 2001.