• Nenhum resultado encontrado

3.3 Formalização do Problema

3.3.3 O Problema da Variabilidade do Tempo de Download (PVTD)

No Respose Time Variability Problem (Corominas, 2007) é dado um conjunto de símbolos e o problema é construir uma sequência justa dos mesmos, atendendo a to- das as demandas e minimizando a distância entre as ocorrências dos símbolos iguais. O Problema da Variabilidade do Tempo de Download, definido neste trabalho, pode ser visto como uma variação do RTVP , onde di não é fixo e cada aplicação (sím-

bolo) deve ocorrer ao menos uma vez no carrossel (solução). Além disso, a distância entre as ocorrências de um mesmo símbolo é afetada pelo tamanho das aplicações e não apenas pela sua quantidade. Sendo assim, o PVTD se torna ainda mais compli- cado do que o Response Time Variability Problem, que é de complexidade NP-difícil (Garey, 1979).

3.4 Modelagem Matemática

O presente modelo matemático é uma extensão da formulação matemática apre- sentada em [Pessoa, 2008], abrangendo as novas restrições descritas no modelo de negócio detalhado na Seção 3.2. Segue abaixo:

Notação

X: Conjunto de aplicações N: Numero de aplicações

ti: Tamanho da aplicacao i em segundos

Tmax: Tamanho máximo do Carrossel em segundos

q: Número de posições ocupáveis no Carrossel M: Um número maior que Tmax

ci : Classe da aplicação i

vi: Número de vezes que a aplicação i foi iniciada

k1: Constante multiplicativa da classe

zi: Prioridade da aplicação i, definidar por:cik1+ vik2 Variáveis de Decisão xij = Y ] [

1 se a aplicação i ocorrer na posição j 0 caso contrário

dk

ij: Soma dos tempos das aplicações entre as posições i e j, com relação a

aplicação k

Di: Maior tempo (em segundos) entre duas ocorrências consecutivas da aplicação i

max: Maior Di multiplicado por sua prioridade (zi)

Minimize max (3.4.1)

Sujeito a: max ≥ zi× Di ∀i ∈ X (3.4.2) n ÿ i=1 q ÿ j=1 tixij ≤ Tmax (3.4.3) n ÿ i=1 xij = 1 ∀j ∈ [1...q] (3.4.4) xij = xi(j+q) ∀i ∈ X ∀j ∈[1...q] (3.4.5) dikjn ÿ s=1 j≠1 ÿ l=k tsxsl− M(1 − xik) − M(1 − xij) − j≠1 ÿ l=k+1 M xil ∀i ∈ X ∀k, j ∈[1...2q], k ≤ j (3.4.6) Di ≥ dikj ∀i ∈ X ∀k, j ∈[1...q], k < j (3.4.7) xij ∈ {0, 1} ∀i ∈ X ∀j ∈[1...2q] (3.4.8) Di, dikj ≥0 ∀i ∈ X ∀k, j ∈[1...2q] (3.4.9) q ÿ j=1 xij ≥1 ∀i ∈ X (3.4.10)

Como pode ser observado, o modelo busca otimizar o pior tempo de carregamento de uma aplicação multiplicada por sua prioridade. A prioridade é calculada por dois fatores: a classe da aplicação e o número de vezes que foi utilizada. Com isso, a tendência é que o fator ZxD de cada aplicação seja próximo, e assim o Carrossel seja montado da forma mais justa.

A representação do Carrossel está sendo feita na forma de uma matriz nx2q, onde as linhas são as aplicações e as colunas são as posições ocupáveis do carrossel.

Dessa forma, se xij for verdadeiro, significa que a aplicação i está na posição j do

Carrossel. Foram utilizadas duas vezes o número de colunas para que não fosse necessário se girar o carrossel por completo para calcular as distâncias máximas de cada aplicação.

A restrição 3.4.2 está diretamente ligada à função objetivo, enfatizando que o valor de maxD deve ser o maior que todos os (zix Di), para qualquer i. A restrição

3.4.3 está ligada ao limite de tempo que o carrossel pode ter em seu total, isto é, a soma dos tempos de todas as aplicações do carrossel não pode ultrapassar Tmax. A

restrição 3.4.4 garante que em cada posição, apenas e necessariamente uma aplicação estará lá. A restrição 3.4.5 foi feita para que a matriz com 2q colunas represente na verdade o carrossel dando dois giros a partir da primeira aplicação. Para isso, foram replicadas as posições a partir da metade até a última.

A restrição 3.4.6 trata justamente de todas as possíveis maiores distâncias entre cada aplicação consigo mesma. O valor de di

kj é alterado para a distância entre

as posições k e j, se a aplicação i estiver nelas, e entre essas posições não houver nenhuma ocorrência da aplicação i. Depois, com a restrição 3.4.7, é calculada a maior distância de cada aplicação para sua possível replicação no carrossel. Caso a aplicação só apareça uma vez no carrossel, a distância será a soma dos tempos das aplicações em cada posição ocupável do carrossel.

A restrição 3.4.8 garante que toda aplicação estará presente no Carrossel. Já as restrições 3.4.9 e 3.4.10 determinam os possíveis valores para cada x, D e d, e também asseguram que as maiores distâncias de cada aplicação devem ser maiores que 0.

Capítulo 4

Metodologia

Neste capítulo serão abordadas as metodologias utilizadas para a concepção e implementação do gerador de carrossel otimizado. É mostrado como foi feita a implementação do GRASP e do ILS para resolver o problema proposto. Além disso, é feita a descrição dos arquivos de entrada e saída utilizados para os testes, além de mostrar a forma que as instâncias foram geradas.

4.1 GRASP Aplicado ao Problema

O GRASP, como descrito anteriormente, é um algoritmo guloso, mas ao mesmo tempo randômico e adaptativo. Tem como característica trazer boas construções, que podem ser utilizadas por algum algoritmo de refinamento.

Para se aplicar o GRASP ao problema, inicialmente um carrosel é construído, contendo todas as aplicações em uma ordem aleatória. Em cada passo do GRASP, o algoritmo insere uma nova aplicação no Carrossel, sendo esta retirada aleatoria- mente de uma lista restrita de candidatos (LRC). A lista restrita é composta pelas aplicações que tendem a melhorar mais a função objetivo. Nesse caso, após vários testes com diferentes valores, ficou definido que a lista seria composta pelos 25% melhores aplicativos do momento.

A função objetivo é minimizar o valor de Max, que é o pior zi × Di. O zi é

referente a prioridade da aplicação i, e Di é o valor do tempo máximo de espera

da aplicação i. Logo, para se calcular a LRC, em vez de calcular o ganho com a inserção de cada aplicação, foram tomadas as aplicações cujo valor de zi× Di estava

mais prejudicando o carrossel.

Devemos notar que a cada passo a lista de candidatos é alterada, para tornar o algoritmo adaptativo e gerando soluções diferentes, mas com uma certa qualidade. A rodada do GRASP para quando são inseridas 2*n aplicações em cima do carrossel inicial. Esse número foi o que mostrou trazer os melhores resultados, tanto no trabalho corrente como no de (Pessoa, 2008). Isso porque se percebe que a medida

que se adiciona mais aplicações, pelo fato da solução ser cíclica, os resultados vão se aproximando de similares alcançados previamente com menos aplicações.

Após a construção, o GRASP ainda é responsável por uma busca na vizinhança de soluções, para alcançar o ótimo local. Essa vizinhança foi definida como a troca entre 2 ou 4 posições no carrossel e a remoção / inserção de uma aplicação em qualquer posição no carrossel. O Pseudo-código do programa pode ser visto no Algoritmo 3

Algoritmo GRASP(n, Aplicacoes)

1 melhor ←∞; 2 para 1, 2, ..., 10000 faça 3 Carrossel ←ConstroiCarrosselPadrao(); 4 para 1, 2, ..., 3n faça 5 CriaLRC(Carrossel, Aplicacoes); 6 Elemento ←SorteiaElementoLRC(LRC); 7 InsereElemento(Carrossel, Elemento); 8 fim para 9 aux ←BuscaLocal(Carrossel);

10 se aux < melhor então

11 melhor ← aux;

12 fim se

13 fim para

14 devolva s∗;

fim

Documentos relacionados