• Nenhum resultado encontrado

Construção de uma solução viável a partir de uma quase viável Trata-se de um algo-

Os modelos heurísticos

Algoritmo 7.7 Construção de uma solução viável a partir de uma quase viável Trata-se de um algo-

até que

∀cm de fδcm(Sn+1) ≤

∀cm de fδcm(S ).

Assim a seqüência de movimentos escolhidos nesta busca compõem o movSeqQV (dh,dh, T ).

7.3

Heurística para aproximação de uma solução viável ótima

A segunda etapa usa uma solução viável encontrada pelo método de Programação Inteira ou pela heurística que descrevemos na Seção 7.2 como ponto de partida para se aproximar de uma solução viável ótima. A busca é realizada através de uma meta-heurística Busca Tabu no espaço das soluções viáveis.

A função objetivo é dada por

fob j(S ) = ct·nT (S )+cw1·nW 1(S )+cw·nW (S )+cf·nF(S )+ce·nE(S )+cgi·nGI(S )+

cj· nJ(S ) + cjs· nJs(S ) + cjS· nJS(S ) + cjM· nJM(S ). E reflete as sete características desejáveis de nosso problema (de 0 a 6).

• nT (S ) = ∑pnTp(S ): número de turnos trabalhados em S por todos os professores. • nW 1(S ) = ∑pnW 1p(S ): número de dias de trabalho com um encontro apenas em S

para todos os professores.

• nW (S ) = ∑pnWp(S ): número de dias trabalhados em S por todos os professores. • nF(S ) = ∑pnFp(S ): número de professores que trabalham todos os dias letivos em

S; p sem dia de folga implica nFp(S ) = 1, e caso contrário nFp(S ) = 0.

• nE(S ) = ∑cmnEcm(S ): número de espalhamentos ruins em S para todas as disciplinas das turmas.

• nGI(S ) = ∑cmnGIcm(S ): número de aulas geminadas separadas por intervalo em S . • nJ(S ) = ∑pnJp(S ): número de janelas em S no quadro de horários dos professores

que não trabalham como substitutos.

• nJs(S ) = ∑pnJsp(S ): número de janelas em S no quadro de horários dos professores que trabalham como substitutos levando em conta apenas suas próprias aulas.

• nJS(S ) = ∑pnJSp(S ): número de janelas em S no quadro de horários dos professores que trabalham como substitutos levando em conta suas próprias aulas e mais as que substitui.

• nJM(S ) = ∑pnJMp(S ): número de janelas em S no quadro de horários dos profes- sores (com suas aulas) por dia que excedem o máximo desejávelς (dado da instância).

7.3 HEURÍSTICA PARA APROXIMAÇÃO DE UMA SOLUÇÃO VIÁVEL ÓTIMA 109 A característica 1 está sendo avaliada por nT (S ) e nW (S ). A insatisfação das carac- terísticas desejáveis 0,2,4,5 e 6 são representadas por nJM(S ), nE(S ), nGI(S ), nF(S ) e

nW 1(S ), respectivamente. A característica 3 (que junto a 0 e 1, informa o desejo de compacti- cidade dos quadros de horários dos professores) está relacionada em nJ(S ) para os profes- sores que não tem alterações previstas em seus quadros de horários por não serem substitutos, em nJs(S ) e nJS(S ) para os demais, avaliando o período em que trabalham apenas com as próprias disciplinas e o período em também substituem.

Se há apenas um turno no problema a função objetivo usada é:

fob j(S ) = cw1· nW 1(S ) + cw· nW (S ) + cf· nF(S ) + ce· nE(S ) + cgi· nGI(S )+

cj· nJ(S ) + cjs· nJs(S ) + cjS· nJS(S ) + cjM· nJM(S ).

Os valores ct, cw1, cw, cf, ce, cgi, cj, cjs, cjS, cjM são parâmetros do modelo. Assim também o tamanho da lista tabu, tamLT , o número numItr de iterações, o número máximo de iterações

maxRep sem melhora no valor fob j(S ) da solução corrente e o número numMov (explicado mais adiante).

Os movimentos usados são mov(dh,dh, T ) e movSeq(dh, dh, T ) (Definição 6.3 e 6.5).

Sendo que movSeq(dh,dh, T ) foi definido para encontrar uma solução viável após a aplicação

de mov(dh,dh, T ) numa solução viável que resultou numa solução apenas quase viável, num

contexto bem específico: para recuperar a viabilidade perdida devido a separação de aulas geminadas que provocou o não atendimento do mínimo número de aulas geminadas semanais de alguma disciplina numa turma, ∑∀cmde fδcm(mov(dh, d

h, T )S ) > 0.

A vizinhança da solução atual S pesquisada é dada por

Q(S ) = {R viável : R = mov(dh, dh, T )S ou R= movSeq(dh, dh, T )mov(dh, dh, T )S para

∀cm

de fδcm(mov(dh, dh, T )S ) > 0}. O critério de parada é alcançar o número de iterações numItr.

A lista tabu tem tamanho fixo tamLT . Como na primeira heurística, cada tabu é represen- tado por uma lista

((d, h), (d, h), (c, m)1, . . . , (c, m)|T |),

com os horários e a identificação dos encontros em um T ∈ T (dh,dh, S ) no qual foi definido

um movimento mov(dh,dh, T ) já aplicado. Para cada movimento escolhido e aplicado numa

iteração, mov(dh,dh, T ) ou mov(d

ihi, dihi, Ti) (i = 1, . . ., n) que compõe movSeq(dh, dh, T ), o tabu correspondente entra no final da lista tabu (na ordem em que foi aplicado) e o primeiro tabu da lista é retirado desta. Assim, o número de iterações em que um movimento permanece tabu é variável (e no máximo igual ao tamanho da lista), pois numa iteração podem entrar pra lista vários tabus e igual quantidade deixa a lista, uma quantidade igual a 1 + k, sendo k o número de movimentos que compõem um dado movimento seqüencial.

O tabu impede que o movimento correspondente inverso (ou o próprio) seja realizado no- vamente enquanto o tabu permanece na lista. E este movimento impedido pelo status tabu não pode ser aplicado mesmo como parte de um movimento seqüencial.

O critério de aspiração para uma solução S impedida pela lista tabu é que esta tenha valor da função objetivo fob j(S ) menor que o da melhor solução guardada (em xM) e o único movi- mento tabu usado para encontrá-la seja o primeiro, isto é, se em seguida a este é aplicado um movimento seqüencial nenhum tabu o compõe.

Também faz parte do algoritmo uma estratégia de diversificação. Aqui também são usa- dos os movimentos seqüenciais. A cada maxRep iterações sem melhora no valor fob j(S ) da solução corrente é aplicado um método que vamos chamar aqui de Mudando de Direção. Ele avalia os movimentos não tabu definidos sobre S para os pares de horários numa ordem randômica, e aceita as primeiras soluções S′viáveis que satisfazem:

nW 1(S′) < nW 1(S ) ou nF(S) < nF(S ) ou

(cw1· nW 1(S) + ce· nE(S) + cgi· nGI(S) ≤ cw1· nW 1(S ) + ce· nE(S ) + cgi· nGI(S ) e

nJM(S′) ≤ nJM(S ) e nF(S) ≤ nF(S ))

até que o número de movimentos usados (inclusive compondo movimentos seqüenciais) até a última solução aceita seja maior ou igual a numMov. Todos os movimentos usados vão para a lista tabu. E permitimos aqui apenas um movimento seqüencial por par de horários diferentes.

Outras expressões lógicas poderiam ser usadas em Mudando de Direção. Contudo nossa escolha se baseia na importância dada às características desejáveis citadas na expressão e uma relativa negociação entre piora e melhora de algumas características. Desta forma esperamos nos distanciar de ótimos locais, mas com uma direção de melhora para pelo menos algumas características desejáveis.

No Algoritmo 7.8 há uma apresentação desta etapa de AST.

Quanto ao procedimento de busca por um movimento seqüencial movSeq(dh,dh, T ), ele é

espelhado na definição deste movimento. Trata-se de um ciclo onde a cada iteração i encontra- se o melhor movimento (que produz o menor de f (.)) não tabu usando um par de horários {dhi, dhi} ∈ {{d(h − 1), d(h− 1)}, {d(h − 1), d(h+ 1)}, {d(h + 1), d(h− 1)}, {d(h + 1),

d(h+ 1)}}, com dhi6= dhie {dhi, dhi} 6= {dh, dh′}, que faz

∀cm de f(Si+1) <

∀cm de f(Si), i = 1, . . ., n, até que

∀cm de f(Sn+1) = 0.

Assim a seqüência de movimentos escolhidos nesta busca compõem o movSeq(dh,dh, T ).

Saiba que na busca por um movSeq(dh,dh, T ) não consultamos _gra f oH, pois este só

será atualizado depois de escolhermos o melhor S′em Q(S ). Para avaliar os possíveis movi-

mentos nós construímos os conjuntos T (dhi, dhi, mov(dh, dh, T )S ).

A busca por um movSeq(dh,dh, T ) se dá apenas na situação em que há chance de corrigir

o defeito provocado por mov(dh,dh, T ). Conforme foi explanado no final da Seção 6.4. Na

Figura 7.1 apresentamos o que seria um procedimento de “Branch and Bound” para encontrar

7.3 HEURÍSTICA PARA APROXIMAÇÃO DE UMA SOLUÇÃO VIÁVEL ÓTIMA 111

AlgoritmoAproximação de uma solução ótima. Entrada

S0: solução viável inicial.

x: com as variáveis xcdhde decisão representando a solução atual.

_gra f oH: cada _gra f oHdhdhguarda T (dh,dh′, S ).

maxRep: número máximo sem melhora no valor fob j corrente.

tamLT : tamanho da lista tabu. numItr: número de iterações.

numMov: parâmetro para Mudando de Direção.

Saída xM

1 xM= x {Guarda a melhor solução S.}

2 S = S0{Solução atual.}

3 S′′ = null {Melhor solução candidata.} 4 de f(S′′) = ∞

5 LT= /0 {Lista tabu inicialmente vazia, com tamanho tamLT .}

6 cont= 0

7 ainda= 0

8 enquanto cont< numItr faça

9 para cada dh e dh∈ H, dh 6= dhfaça{Os dh numa ordem randômica.}

10 para cada T ∈ _gra f oHdhdhfaça

11 Avalie S′= mov(dh, dh, T )S

12 se∀cmde fδcm(S

) > ∑

∀cmde fδcm(S ) então

13 se∃ movSeq(dh, dh, T ) então{Busca movimento seqüencial sem tabu.}

14 S′= movSeq(dh, dh, T )mov(dh, dh, T )S

15 se de f(S′) = 0 e fob j(S′) ≤ fob j(S′′) então

16 se fob j(S′) < fob j(S∗) ou S′não é impedida por LT então

17 S′′= S′ 18 se fob j(S′′) ≥ fob j(S ) então 19 ainda= ainda + 1 20 senão 21 ainda= 0 22 S = S′′

23 Atualize x, LT e _gra f oH. 24 cont= cont + 1

25 se fob j(S ) < fob j(S∗) então

26 S∗= S

27 xM= x

28 se ainda= maxREP então

29 Aplique Mudando de Direção com numMov.

30 ainda= 0

31 devolva xM

Outline

Documentos relacionados