Uma heurística de trocas para o problema de sequenciamento de tarefas em
processadores uniformes
1 INTRODUÇÃO
Neste artigo propõe-se um novo procedimento heurístico para o problema de
sequenciamento de n tarefas independentes J1, J2, ... , Jn em mprocessadores
uniformes M1, M2, ... , Mm, sem preempção. Cada tarefa Jj tem um tempo de
processamento positivo pj e cada processador tem uma velocidade positiva si que
são normalizadas de modo que s1 = 1£s2£s3£ ...£sm.
Sendo Ci o tempo de finalização do processador Mi, significando o somatório dos
tempos de processamento de todas as tarefas alocadas ao processador Mi dividido
pela velocidade deste processador, denominada de si. Então, o problema é
determinar a alocação das tarefas que minimize o tempo máximo de finalização do
processador mais carregado (makespan), definido como, Cmax =
{ Ci }. Usando a classificação de três campos introduzida
por Graham et al. (1979), o problema é definido como sendo o Q½½Cmax.
Considerando o caso em que as velocidades s1 = s2 = ... = sm = 1, tem-se o
problema de sequenciamento em processadores paralelos idênticos.
Vários exemplos podem ser encontrados no mundo real, tais como: indústrias com
um parque de máquinas de diversas gerações e, no ambiente computacional, o
problema pode ser considerado quando se trata de sistemas de processamento
distribuído e em redes heterogêneas. Muitos outros exemplos de problemas reais
podem ser encontrados, modelados e resolvidos como um Q½½Cmax .
O propósito do presente artigo é o de apresentar a heurística KPROC, um
procedimento composto por três fases: uma fase construtiva e duas fases de
melhoramento. Este algoritmo é descrito na seção 2. Os resultados
computacionais são apresentados na seção 3. Os resultados computacionais
indicam que o algoritmo proposto apresenta resultados muito próximos a um
limitante inferior, encontrando a solução ótima em um grande número de casos,
superando os resultados obtidos por outras heurísticas.
A maioria dos algoritmos desenvolvidos para o problema Q½½Cmax são adaptações
de heurísticas inicialmente desenvolvidas para solucionar o problema P½½Cmax.
Estas heurísticas podem, de maneira genérica, ser classificadas em heurísticas
construtivas e heurísticas de melhoramento. Grande parte destes algoritmos são
do tipo construtivo, conforme pode ser observado nos estudos sobre heurísticas
exatas e aproximadas apresentados por Horowitz & Sahni (1976) e Lawler et
al. (1989).
Uma das heurísticas construtivas mais conhecida para o P½½Cmax é a desenvolvida
por Graham (1969), denominada LPT (Longest Processing Time first). LPT propõe
um sequenciamento através da alocação das tarefas aos processadores obedecendo
uma ordem não crescente dos seus tempos de processamento. Considera-se
inicialmente a alocação da tarefa de maior tempo de processamento e então
aloca-se cada uma das tarefas restantes da seqüência ao processador que
primeiro ficar ocioso até que todas elas estejam alocadas.
Duas adaptações da heurística LPT foram propostas para o problema Q½½Cmax,
baseadas nos estudos iniciados por Liu & Liu (1974). Na primeira variante,
apresentada por Gonzalez et al. (1977) e Dobson (1984) em trabalhos
independentes, ordenam-se as tarefas em ordem não crescente do seu tempo de
processamento. Considera-se inicialmente a alocação da tarefa de maior tempo de
processamento e então, seguindo a lista ordenada, a próxima tarefa considerada
para a alocação é designada ao processador que primeiro ficar ocioso. Em
igualdade de condições a tarefa é alocada ao processador de maior velocidade de
processamento.
A segunda variante do algoritmo LPT, apresentada por Morrison (1988), mantém a
ordenação das tarefas, mas as tarefas são alocadas ao processador que primeiro
ficar ocioso, uma vez processada a tarefa a ser alocada. Em igualdade de
condições em dois ou mais processadores, a tarefa é alocada ao processador de
maior velocidade.
Outro algoritmo originalmente proposto para o problema P½½Cmax e também
adaptado para o problema Q½½Cmax é o MULTIFIT, Coffman et al. (1978). A
adaptação é proposta por Friesen & Langston (1983) e Kunde (1983), também
em trabalhos independentes, esta implementação transforma o problema de
sequenciamento de tarefas em um problema de empacotamento (bin packing
problem). Para transformar o problema de sequenciamento em um problema de
empacotamento, considera-se que cada processador corresponde a uma caixa, no
caso de processadores idênticos, a caixa mais carregada corresponde ao
processador mais carregado. As tarefas a serem processadas correspondem aos
itens a serem armazenados. Estendendo esta analogia ao caso de processadores
uniformes, define-se o tamanho das caixas como variável, sendo função da
velocidade do processador. O tamanho da caixa i é definida como sendo o valor
determinado para a capacidade de cada caixa multiplicado por si , que
corresponde a velocidade do processador i.
O algoritmo de empacotamento FFD (First Fit Decreasing) faz uma pré-ordenação
dos itens a serem alocados em ordem não crescente de seu tamanho. No momento da
alocação, o item é designado à primeira caixa, na qual este é passível de
alocação (não excede a capacidade da mesma) ou, então, uma nova caixa é criada.
Na implementação do algoritmo MULTIFIT necessita-se de um limitante superior e
um limitante inferior para o tamanho das caixas utilizadas no algoritmo FFD.
Então faz-se um processo iterativo atualizando os limitantes inferiores e
superiores da solução, considerando as seguintes situações: no caso de falta de
espaço para a alocação das tarefas, necessita-se aumentar o tamanho das caixas
e caso haja sobra de espaço, diminui-se o tamanho das caixas.
2 A HEURÍSTICA KPROC
O algoritmo heurístico proposto KPROC, pode ser resumido como: na fase 1, as
tarefas são classificadas de acordo com seu tempo de processamento e designadas
aos processadores de forma a obter uma distribuição razoavelmente balanceada.
Na fase 2, um balanceamento de carga é efetuado pela movimentação de uma tarefa
do processador mais carregado para o processador menos carregado. Finalmente na
fase 3, um balanço ainda melhor é efetuado através da troca de tarefas a serem
efetuadas, entre o processador mais carregado e um dos outros processadores.
Uma descrição mais detalhada das fases do algoritmo KPROC é realizada a seguir.
Fase 1: Alocação inicial. Diferente de diversos algoritmos construtivos
conhecidos, não é necessário uma ordenação das tarefas em função do seu tempo
de processamento. A vantagem de não se fazer a ordenação inicial das tarefas é
que se elimina a maior parcela da complexidade computacional deste tipo de
algoritmo, podendo utilizar o tempo economizado para realizar outras tarefas.
Além disso a divisão das tarefas em intervalos facilita bastante a busca das
tarefas a serem movidas ou trocadas, eliminando muitas pesquisas
desnecessárias.
Para realizar a divisão das tarefas em subintervalos, deve-se conhecer apenas
os limitantes inferior e superior dos valores dos tempos de processamento, ou
seja, os valores de = min {pj} e [/img/
fbpe/pope/v20n1/a05img03.gif] = max {pj}. Então, [[/img/fbpe/pope/v20n1/
a05img02.gif], <formula/>] é dividido em k intervalos
iguais I1, I2, ... , Ik, onde k é um parâmetro de entrada do algoritmo. A
tarefa Jj é chamada de uma l-tarefa se pjÎIl.
Inicialmente inicializa-se nir = 0, i = 1, 2, ... , m e r = 1, 2, ..., k, onde
nir é o número de tarefas do intervalo r designadas ao processador i. Então
aloca-se cada l-tarefa ao processador com a menor razão de nil/si. Em caso de
igualdade, a tarefa é alocada ao processador que tiver maior velocidade. Esta
política busca um balanceamento de carga por intervalo, ou seja, o número de
tarefas alocadas a cada intervalo é proporcional a velocidade do mesmo.
Fase 2: Fase de Balanceamento. Seja
o tempo médio de finalização, independente em relação a uma distribuição
particular das tarefas aos processadores. Esta fase consiste na repetição do
movimento de transferência de tarefas do processador mais carregado (com o
maior Ci ), para o processador menos carregado, tendo como alvo [/img/fbpe/
pope/v20n1/a05img05.gif], buscando reduzir o tempo de finalização do
processador mais carregado (makespan). O procedimento é descrito a seguir.
Passo Identifique os processadores mais e menos carregados e chame-os de M1 e Mm,
1 - respectivamente.
Passo Calcule D1 = C1 - <formula/>, Dm = [/img/fbpe/pope/v20n1/
2 - a05img05.gif]- Cm , D= min{D1,Dm} e D'=C1-Cm.O cálculo de D é utilizado para que
se possa identificar quais tarefas poderão trazer melhorias.
Se sm D < <formula/>, Termina a FASE 2.Isto significa que
não existem tarefas que, se executadas no processador m, produziriam um novo Cm
menor ou igual a D . Observe que a velocidade do processador m, sm , é utilizada
para que possamos ter a noção exata do impacto que o tempo de processamento de uma
tarefa teria no tempo de finalização deste processador (por exemplo, se a tarefa
Jj com tempo de processamento pj fosse processada em Mm, produziria um acréscimo
de pj / sm no tempo de finalização).
Se sm D > <formula/> faça l := k ( o maior intervalo ).
Isto significa que qualquer uma das tarefas, se executada no processador m, produz
um novo Cm menor ou igual a D .
Caso contrário sm D pertence a algum intervalo I1. Ou seja, identifico o intervalo
a partir do qual devo buscar tarefas que são possíveis de produzir um novo Cm
menor ou igual a D.
Passo Se nenhuma tarefa Jj com pjÎIl e pj£smD está alocada em Ml, vá para o passo 4.
3 - Caso contrário realoque a tarefa com pjÎIl de M1 em Mm e vá para o passo 1. Neste
passo busca-se uma tarefa no intervalo de maior índice para ser trocada, neste
intervalo tem-se as tarefas que produzem novos Cm mais próximos de D.
Passo Se nenhuma tarefa Jj com pjÎ<formula/> = I1 È I2 È ... È
4 - Il-1 está alocada em M1, vá para o passo 5. Caso contrário, realoque a tarefa com
pjÎ <formula/>de Ml em Mm e vá para o passo 1.
Aqui busca-se uma tarefa nos intervalos de índice menor que l, pois é o local
onde ainda posso obter uma tarefa que produza um novo Cm menor ou igual a D quando
alocadas a Mm.
Passo Se l = k vá para a FASE 3. Não há tarefas possíveis de ser alocadas em Mm
5 - produzindo um novo Cm menor ou igual a D .
Se nenhuma tarefa Jj com pj Î Il+ = { È Ii, i = l + 1, ... / pi< sm D' ou i = k} e
pj< sm D', vá para a FASE 3, caso contrário, realoque uma tarefa de Il+ de Ml para
Mm e vá para o passo 1. Aqui busca-se nos intervalos de índice maior que luma
tarefa que produza um novo Cmmenor que D', ou seja, não atinge o alvo, mas ainda
assim diminui o makespan.
Observa-se que as tarefas são agrupadas em conjuntos de acordo com o seu tempo
de processamento, de tal forma a tornar mais eficiente a busca das tarefas
candidatas a transferência entre os processadores
Fase 3: Fase de duplas trocas. Novamente M1 e Mm referem-se aos dois
processadores, mais e menos carregados respectivamente. (Os demais
processadores são aleatoriamente relacionados). Nesta fase procura-se uma
tarefa para troca do processador mais carregado M1 ( a tarefa chamada Jj ) com
uma tarefa de um outro processador Mh (chamada de tarefa Jj'), começando pelo
processador h = m, m-1, ..., até que uma tarefa seja encontrada.
A idéia é delimitar o intervalo de tarefas nos processadores alvo que
possibilitem uma redução no valor de solução para cada tarefa do processador
mais carregado, para isto busca-se um valor que minimize a diferença de tempos
de processamento entre M1 e Mh.
O valor de q representa a diferença em tempo entre as de tarefas Jj e Jj' que
possibilitam aos processadores envolvidos atingirem o equilíbrio de suas cargas
<formula/>(que é o alvo da busca nesta fase do
algoritmo), ou seja, q = pj'<formula/>. Ele é
determinado, conforme equilíbrio de carga no final da transferência que ocorre
entre os processadores envolvidos durante a fase 3.
Sendo C1' e Ch' o valor dos tempos de finalização de M1 e Mh , respectivamente,
após a troca ser realizada, formulados como:
C1' = C1' (pj'<formula/>)/s1e Ch' = Ch(pj'[/img/fbpe/
pope/v20n1/a05img07.gif])/sh.
Portanto no ponto de equilíbrio a igualdade C1' = Ch' é válida, desenvolvendo-
se esta equação e isolando o valor de q , obtém-se q = [/img/fbpe/pope/v20n1/
a05img08.gif]. Observa-se que o ponto de equilíbrio é função das velocidades e
dos tempos de finalização de M1 e Mh.
Portanto as tarefas disponíveis para transferência, são as que se encontram
dentro dos limites obtidos pela seguinte fórmula:
(pj- pj' )sh < C1 - Ch, que, rearranjada, pode ser expressa como, pj' > pj - [/
img/fbpe/pope/v20n1/a05img09.gif].
Então procura-se um par de tarefas Jj e Jj' com pj' < pj, onde | pj - pj' | é o
mais próximo ao valor de q de tal forma a melhorar a qualidade da solução.
Procurando manter uma boa relação entre o esforço computacional e a qualidade
da solução o procedimento é baseado na quantidade de tarefas do problema, como
descrito a seguir.
Passo Se n < 100 vá para o Passo 2.
1 - Caso contrário
Identificar o primeiro par Jj' da tarefa Jj , considerando h = m, m - 1, ... ,
e de tal forma que pj'< pj e que pj' > pj - [/img/fbpe/pope/v20n1/
a05img09.gif]. Caso um par de tarefas que satisfaça estas condições for
encontrado, volte a Fase 2. Caso contrário o algoritmo TERMINA.
Passo Para cada processador h = m, m-1, ... , calcular q = [/img/fbpe/pope/v20n1/
2 - a05img08.gif] e identifique o par de tarefas Jj e Jj' onde | pj - pj'| é mais
próximo ao valor de q ( pois, quanto mais próximo do valor de q for esta
diferença, melhor será a qualidade da solução ) de tal forma que pj' < pj e que
pj' > pj - <formula/>. Caso um par de tarefas que
satisfaça a condição for encontrado, volte a Fase 2. Caso contrário o algoritmo
TERMINA.
Considerando o fato que a heurística pode interagir uma quantidade
indeterminada de vezes entre as fases 2 e 3, não é possível obter facilmente a
avaliação da complexidade de pior caso do algoritmo. Pode-se empiricamente
observar a boa performance do algoritmo KPROC em relação aos demais algoritmos.
Os resultados obtidos são apresentados na seção 3 a seguir.
3 RESULTADOS COMPUTACIONAIS
A heurística KPROC foi comparada com três outras heurísticas conhecidas:
(1) LPTU1, uma variante do LPT proposta por Gonzalez et al. (1977) e
Dobson (1984).
(2) LPTU2, uma variante do LPT proposta por Morrison (1988).
(3) MFIT, uma variante do MULTIFIT proposto por Friesen &
Langston (1983) e Kunde (1983).
Usou-se o termo variante porque todas as três implementações de heurísticas são
adaptações originalmente propostas para o solução do problema P½½Cmax como
afirmado anteriormente.
As quatro heurísticas são comparadas umas com as outras, e estas são comparadas
com um limitante inferior definido como <formula/>
(limitante inferior do valor ótimo). Também forma feitas algumas comparações
com a solução ótima, porém com um conjunto diferente de problemas teste, pois o
procedimento ótimo só aceita valores inteiros.
Testes foram executados para o problema com m = 2, 3, 7, 10, 15, 20 e n= 10,
50, 100, 500, 1000 e tempos de processamento nos intervalos [1,100], [1,1000] e
[1,10000], com distribuição uniforme, considerando valores inteiros e valores
reais. A escolha destes problemas se deve ao fato de se buscar um algoritmo que
seja bastante robusto e não tenha restrição quanto aos valores dos tempos de
processamento. Os valores do tipo real são uma constante neste tipo de
problema, uma vez que divisões entre o tempo de processamento e a velocidade do
processador no qual ele vai ser processados são uma necessidade para se
determinar a solução do problema. Os resultados aqui apresentados referem-se a
distribuição uniforme e valores inteiros nos intervalos [1,100] e [1,10000]
(tabelas_2 e 3), pois estes representam bem o desempenho do algoritmo.
Primeiro foi analisado o efeito do parâmetro k, o número de intervalos dos
tempos de processamento, no desempenho do algoritmo. Foram testados diversos
valores para k, dentro do intervalo [1,28]. Dentre estes, observando-se as
melhores relações entre qualidade da solução e esforço computacional para obtê-
la, definiu-se o kem função do valor da relação (m/n). Os valores recomendados
de k* são apresentados na Tabela_1, considerando o valor de solução e o tempo
computacional necessário para a obtenção da melhor solução segundo apresentado
abaixo.
Em todos os problemas apresentados foi usado k = k* e todos os casos foram
testados para um conjunto de 10 instâncias teste.
As variáveis utilizadas nas Tabelas_2, 3 e 4 são definidas abaixo:
LB : média dos valores de
considerando dez instâncias teste.
KPROC, LPTU1, LPTU2 e MFIT : média dos valores de solução encontrados por
KPROC, LPTU1, LPTU2 e MFIT, respectivamente, considerando dez instâncias teste.
SO : média dos valores de solução ótima, considerando dez instâncias teste.
TKPROC, TLPTU1, TLPTU2 e TMFIT : média dos tempos de CPU, em segundos, gastos
por KPROC, LPTU1, LPTU2 e MFIT, respectivamente, considerando dez instâncias
teste.
As quatro heurísticas foram implementadas em linguagem C, testadas e executadas
em uma estação de trabalho IBM RISC/6000 Modelo 25T.
Os resultados indicam que a heurística KPROC produz valores de solução,
geralmente inferiores a 1% do valor do limitante inferior, que significa que a
solução é muito próxima aos valores ótimos da solução. O algoritmo KPROC,
comparado com as três outras heurísticas, apresenta na absoluta maioria das
instâncias apresentadas o melhor resultado.
A heurística KPROC é também mais rápida que a MFIT, sendo que apresenta, na
relação de tempo de CPU, a mesma magnitude apresentada pelas heurísticas LPTU1
e LPTU2, conhecidas por seu bom desempenho computacional. Em resumo, a
heurística proposta produz soluções ótimas ou quase ótimas, com tempo
computacional relativamente baixo e apresenta a melhor solução entre as
heurísticas comparativas apresentadas. Para confirmar ainda mais esta
afirmação, desenvolveu-se um esquema ótimo para solução deste problema baseado
na analogia com o problema de alocação generalizada (PAG).
O PAG pode ser descrito, usando-se a terminologia do problema da mochila, ou
seja, dados nitens e mmochilas, com pijsendo o lucro do item jse alocado a
mochila i; wijsendo o peso do item jse alocado a mochila i; e cisendo a
capacidade da mochila i; aloque cada item a exatamente uma mochila de modo a
maximizar o lucro total, respeitando as restrições de capacidade de cada
mochila.
Este problema já apresenta uma relação com os problemas de sequenciamento, pois
muitas vezes aparece utilizado para alocação ótima de n tarefas a
mprocessadores, considerando pijo lucro; wija quantidade de recurso
correspondente a alocação da tarefa jao processador i; e cia quantidade de
recurso disponível em cada processador i.
No caso aqui apresentado, processadores uniformes, a analogia foi feita do
seguinte modo:
- considerou-se todos os lucros pij= 1;
- os pesos wijforam considerados iguais a pi/ sj (onde pi é o tempo de
processamento da tarefa ie sj é a velocidade do processador j);
- a capacidade da mochila ci é inicializada com o valor da solução encontrada
pela heurística KPROC, para todo i = 1 , ... , m, ou seja, um limitante
superior para a solução ótima.
Para se encontrar a solução ótima do problema, utilizou-se um código para
resolução do PAG denominado MTG, desenvolvido por Martello & Toth (1990).
Considerou-se a analogia apresentada anteriormente e seguiu-se o seguinte
procedimento iterativo para obter a solução ótima.
Passo Faça a Solução Ótima receber, inicialmente, a Solução encontrada pela heurística
1 - KPROC.
Faça o valor de ci ser igual ao valor da solução encontrada pela heurística KPROC
subtraída de uma unidade, para todo i = 1 , ... , m.
Passo Resolva o PAG correspondente.
2 -
Passo Se a solução do PAG for factível, então
3 - - Faça a Solução Ótima ser igual a Solução encontrada pelo PAG;
- Faça o valor de ci ser igual ao valor da solução encontrada pelo PAG
subtraída de uma unidade, para todo i = 1 , ... , m; e volte para o passo 2.
Se a solução do PAG for infactível, então, apresente a solução ótima e PARE.
Uma vez que o código MTG só trabalha com valores inteiros, foram gerados alguns
novos conjuntos de dados para realizar os testes comparativos da heurística
KPROC com a solução ótima. Para cada combinação de m= 2 , 3 e n =10 , 20 , 50 ,
100, dez instâncias são geradas, considerando si = i,para i = 1 , ... , m e pj,
para j = 1 , ... , n, gerado aleatoriamente no intervalo [1,100] considerando
uma distribuição uniforme. Os tempos de processamento gerados devem obedecer a
restrição de serem divisíveis por si = i,para i = 1 , ... , m, para que toda
alocação, independente da velocidade do processador, gere tempos de finalização
inteiros.
Uma síntese destes resultados é apresentada na tabela_4, onde os resultados
apresentados são a média de dez instâncias teste. Desta tabela, pode-se notar
que a maioria das soluções encontradas por KPROC é ótima. De fato, nas 80
instâncias testadas, foi observado somente um caso (m = 2 e n= 10) em que o
resultado encontrado por KPROC foi uma unidade superior ao valor da solução
ótima.
4 CONCLUSÃO
A heurística KPROC demonstrou ser um algoritmo robusto em comparação com os
outros métodos testados e com o limitante inferior. Também demonstrou um bom
desempenho obtendo soluções bastante próximas da ótima e, em muitos casos a
própria solução ótima, as custas de um esforço computacional razoável.