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) dikj ≥ n ÿ 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