Você está na página 1de 26

O Algoritmo GRASP

O nome GRASP vem do inglês Greedy Ran-


domized Adaptive Search Procedure, isto é,
um algoritmo heurı́stico construtivo do tipo
guloso mas que usa uma componente aleatória
e adaptativa. GRASP foi usado para resolver vários
problemas complexos de engenharia elétrica como o prob-
lema de planejamento da expansão de sistemas de trans-
missão. Apresentamos uma breve teoria sobre o algorit-
mo GRASP assim como a proposta apresentada em para
o problema de planejamento de sistemas de transmissão.

1
Teoria Básica de GRASP
A idéia básica do algoritmo GRASP é apresentada no
contexto do problema de planejamento da expansão de
sistemas de transmissão. GRASP é uma evolução
dos algoritmos heurı́sticos construtivos, espe-
cialmente do algoritmo guloso. Um algoritmo heurı́sti-
co construtivo guloso encontra uma boa solução factı́vel
de um problema complexo adicionando em cada passo
uma componente da solução. Em cada passo do algorit-
mo é escolhido o melhor componente identificado por um
indicador de sensibilidade. Para o caso do problema de
planejamento de sistemas de transmissão, em cada passo
é adicionado um circuito ao sistema, aquele circuito que
apresenta o melhor critério de desempenho ou indicador
de sensibilidade.

2
Um dos principais problemas dos indicadores de sensi-
bilidade de um algoritmo heurı́stico é que, além de serem
indicadores aproximados, o conceito de melhor circuito
a ser adicionado é dependente da configuração corrente
que está sendo analisada, isto é, existe a melhor proposta
para a topologia corrente o que não significa que seja a
melhor proposta para encontrar a topologia ótima. En-
tretanto, em cada passo do processo heurı́stico, é muito
provável que o melhor circuito que deve ser adicionado
ao sistema, em termos de topologia ótima, se encontre
entre os melhores classificados pelo indicador de sensi-
bilidade mas nem sempre deve ser o melhor classificado.
Portanto, GRASP sugere escolher um circuito
de uma lista dos k circuitos melhores classifi-
cados pelo indicador de sensibilidade porque
é altamente provável que nessa lista de k cir-
cuitos existam circuitos que fazem parte da
topologia ótima.

3
A escolha do circuito, na formulação básica,
é realizada em forma aleatória mas existem
várias formas de realizar essa escolha, por ex-
emplo, usando funções de probabilidade que,
fundamentalmente, fornecem maior probabil-
idade na escolha aos circuitos melhores clas-
sificados. A escolha aleatória de um circuito, de uma
lista de k circuitos, permite encontrar muitas topolo-
gias de qualidade através de processos repetitivos usando
sementes diferentes para gerar a sequência de números
aleatórios. O conceito adaptativo aparece quan-
do é usada uma lista de tamanho variável e que
depende da evolução do processo. Esse tipo de algoritmo
que usa tamanho de lista k variável durante o processo
é chamado de algoritmo GRASP reativo. Obviamente,
cada nova topologia encontrada pode ser submetida a
um processo de busca local tentanto encontrar um ótimo
local a partir da topologia encontrada.

4
O algoritmo GRASP, para um problema genéri-
co, assume a seguinte forma:

1. Implementar a fase de pré-processamento.


2. Realizar a fase de busca construtiva.
3. Realizar a fase de pós-processamento de busca local.
Atualizar a incumbente caso seja possı́vel.
4. Se o critério de parada não for satisfeito, voltar ao
passo 2. Caso contrário, pare. A resposta do algorit-
mo é a incumbente armazenada.

O pre-processamento tenta identificar deter-


minadas subestruturas, isto é, atributos ou con-
junto de atributos, que permitem iniciar o processo de
busca construtiva ou diminuir o espaço de soluções do
problema. Por exemplo, no problema da árvore de ex-
pansão mı́nima, pode-se formar uma lista com as arestas
de menor peso. Cada elemento dessa lista pode ser usado
para iniciar um processo de busca na fase construtiva.

5
A fase de busca construtiva consiste em en-
contrar uma solução de qualidade para o prob-
lema usando um algoritmo heurı́stico construtivo escol-
hendo, em cada passo, um elemento de uma lista de
tamanho k. A fase construtiva do algoritmo GRASP ap-
resenta os seguintes passos:

1. Escolha a solução inicial que pode ser vazia, isto é,


sem adição de variáveis, que se transforma na solução
corrente.
2. Para a solução corrente e usando umı́ndice de desem-
penho ou indicador de sensibilidade, elaborar uma
lista com as k variáveis mais atrativas.
3. Escolha uma variável da lista de k elementos e at-
ualizar a solução corrente com a adição da variável
escolhida.
4. Se a solução corrente é factı́vel ou foi satisfeito o
critério de parada (sem encontrar uma solução factı́vel)
terminar com a fase construtiva. Caso contrário voltar
ao passo 2.

6
Analisamos, brevemente, uma forma adequada para
encontrar os elementos da lista. Seja z(x) a função obje-
tivo de um problema com variáveis x. Tipicamente, uma
função de mérito ou indicador de sensibilidade apresenta
a seguinte forma:

∂z
h(xi) ∝
∂xi

A função h(xi) permite encontrar a lista de variáveis


atrativas que fazem parte do conjunto RCL. Consideran-
do que o problema é de minimização da função objetivo
z(x), então a variável mais atrativa, xi, identificado por
um algoritmo guloso, é aquele que apresenta um menor
valor de h(xi).

7
Portanto, fazem parte do conjunto RCL todas as variáveis
cujos ı́ndices satisfazem a seguinte relação:

min min max min


 
RCL = i ∈ X/. h ≤ h(xi) ≤ h + α(h −h )
(1)
em que X é o conjunto de ı́ndices das variáveis que ainda
podem ser adicionadas e α é um parâmetro fornecido pe-
lo usuário com valores 0 ≤ α ≤ 1. hmax e hmin assumem
a seguinte forma:

hmax = máx {h(xi)}


i∈X

hmin = mı́n {h(xi)}


i∈X

8
Logicamente, um algoritmo heurı́stico con-
strutivo (guloso) escolheria a variável xi com
h(xi) = hmin. O parâmeto α representa um compromis-
so entre escolha aleatória e gulosa e, pode-se verificar
que α = 1 representa um processo totalmente aleatório e
α = 0 um processo guloso. A escolha da variável da lista
pode ser realizada de duas formas: (1) aleatoriamente e,
(2) usando uma função de distribuição de probabilidade
como, por exemplo, a função de distribuição de probabil-
idade linear bi = 1/ri em que ri representa a posição que
ocupa a variável i na lista de variáveis atrativas RCL.
Portanto, a probabilidade de escolha da variável i é en-
contrada usando a relação:

bi
pi = (2)
bj
X

j∈RCL

9
Exemplo 8.4: Escolha de uma
variável da lista
Na resolução de um problema usando GRASP foram
selecionadas as seguintes variáveis ordenadas em ordem
de qualidade: x2, x4, x32, x9 e x7. Calcular a probabil-
idade de escolha de cada variável usando a função de
distribuição de probabilidade linear, assim como a escol-
ha aleatória.
Usando a função de distribuição de probabilidade lin-
ear (bi = 1/ri) e a relação (2) se encontra facilmente a
probabilidade de escolha de cada variável mostrada na
tabela 8.3. Para o caso alatório a probabilidade é igual
para cada uma das variáveis e igual a 0,20.

Tabela 8.3: Probabilidade de escolha das variáveis.


Variável xi ri bi pi
x2 1 1 60/137
x4 2 1/2 30/137
x32 3 1/3 20/137
x9 4 1/4 15/137
x7 5 1/5 12/137

10
Logicamente, a soma de probabilidades deve
ser igual à unidade. A escolha da variável pode ser
implementada usando um gerador de números aleatórios
como na implementação da seleção proporcional no algo-
ritmo genético. O leitor está convidado a refletir sobre as
semelhanças existentes entre a escolha de uma variável
usando uma função de distribuição de probabilidade lin-
ear em GRASP e a seleção usando escalonamento linear
no algoritmo genético.

11
Um tipo especial do algoritmo GRASP é o
chamado algoritmo GRASP reativo que usa
um valor de α adaptativo, isto é, são usados valores
diferentes de α durante o processo e, portanto, o taman-
ho da lista RCL também deve ser variável. A idéia básica
consiste em escolher um conjunto de valores para α e
usar, preferencialmente, aquele valor de α que está ap-
resentando melhor desempenho durante o processo. Foi
mostrado experimentalmente que o GRASP reativo ap-
resenta melhor desempenho comparado com o GRASP
convencional. Seja A um conjunto de m valores para
α previamente especificados. Pretende-se encontrar uma
estratégia para identificar aquele valor de α mais atrati-
vo. Assim, deve-se determinar a probabilidade pi de que
o valor especificado αi seja escolhido numa iteração do
algoritmo GRASP.

12
No GRASP reativo, o processo é iniciado dando igual
probabilidade para cada um dos m valores de α especi-
ficados, isto é, pi = 1/m; i = 1, . . . , m. Durante o
processo, a distribuição de probabilidades é atualizada
com o histórico do processo. Para um problema de mini-
mização com função objetivo v(x) são calculados os val-
ores médios da função objetivo para cada um dos valores
αi usados durante as últimas np transições para encon-
trar a distribuição qi da seguinte forma:

v ∗ δ
 

qi =  

i = 1, . . . , m (3)
vi
em que v ∗ é a incumbente do processo GRASP reativo e
v i é o valor médio dos valores da função objetivo obtidos
usando αi. Para encontrar a distribuição de probabili-
dade padronizada pi deve ser usada a relação:

qi
pi = m (4)
qj
X

j=1

13
A relação anterior permite selecionar o αi que deve ser
usado em cada passo do processo GRASP reativo. Após
np transições, os valores dos pi são atualizados, recalcu-
lando os valores médios v i e usando (3) e (4). Esses novos
valores dos pi são usados para selecionar o αi nas próxi-
mas np transições. Este processo de escolha também
é muito parecido com a seleção por escalonamento lin-
ear no algoritmo genético. O processo GRASP deve pri-
orizar o uso daquele αi que está encontrando soluções
com funções objetivo de melhor qualidade porque esse
αi deve apresentar um maior valor de pi e, portanto,
com maior chance de ser selecionado. Para selecionar
o αi que deve ser usado pode ser implementada uma
estratégia similar que na seleção proporcional no algo-
ritmo genético usando um gerador de número aleatório
p ∈ {0, 1}.

14
Exemplo 8.5: Escolha do parâmetro
αi
Supor um problema de minimização com função ob-
jetivo v(x), que penaliza as infactibilidades na função
objetivo e usa um valor de αi em cada transição. Na res-
olução desse problema, nas últimas np = 10 transições
foram obtidos os resultados mostrados na tabela 8.4 e
usando 4 valores de α, isto é, A = {α1, α2, α3, α4} =
{1/5, 1/3, 1/2, 3/4}.

Tabela 8.4: Funções objetivo de 10 transições.


Teste 1 2 3 4 5 6 7 8 9 10
αi α3 α2 α4 α1 α1 α2 α1 α2 α4 α2
v(x) 80 52 56 64 60 48 56 51 52 49

15
Calcular os valores de probabilidade pi que permitam
encontrar o αi para continuar o processo GRASP reati-
vo. Considere dois casos: (1) δ = 1 e, (2) δ = 5.
Da tabela 8.4 se encontra facilmente os valores médios:
v 1 = 60, v 2 = 50, v 3 = 80 e v 4 = 54.
Com os valores anteriores e considerando que a incum-
bente é v ∗ = 48 podem ser encontrados os valores dos qi
e os valores de probabilidade pi usando as relações (3) e
(4). Os resultados, para δ = 1 e δ = 5 são apresentados
na tabela 8.5

Tabela 8.5: Valores de probabilidade pi.


δ=1
q1 q2 q3 q4 p1 p2 p3 p4
0,800 0,960 0,600 0,889 0,246 0,295 0,185 0,274
δ=5
0,328 0,815 0,078 0,555 0,185 0,459 0,044 0,312

16
Deve-se observar que o algoritmo GRASP
reativo apresenta em cada passo duas decisões
de caráter aleatório: (1) escolha de uma variável da
lista RCL e, (2) escolha do parâmetro αi que determina
o tamanho da lista RCL.
A fase de busca local no algoritmo GRASP procu-
ra encontrar uma solução ótima local na vizinhança da
solução encontrada na fase de busca construtiva. Esta
fase é praticamente equivalente a um processo de inten-
sificação no algoritmo tabu search. O processo consiste
em definir uma vizinhança da solução encontrada pela
fase construtiva e encontrar uma solução factı́vel de mel-
hor qualidade nessa vizinhança. Sempre que é encontra-
da uma solução factı́vel de melhor qualidade a busca
local deve ser reinicializada encontrando uma nova viz-
inhança da nova solução para reiniciar a busca local.
Este processo, em geral, também pode precisar de um
esforço computacional relativamente elevado dependen-
do do tipo de problema. Em geral, a fase de busca local
pode ser um processo muito simples ou muito complexo,
na implementação e no esforço computacional.
As principais fases do algoritmo GRASP são ilustradas
usando o problema de encontrar o conjunto máximo de

17
vértices independentes de um grafo.

18
Exemplo 8.6: Conjunto máximo de
vértices independentes de um grafo.
Dado um grafo G = (V, E) em que V é o número de
vértices e E é o número de arestas do grafo, pretende-se
encontrar um conjunto de vértices independentes com o
maior número de elementos. Um vértice é independente
de outro se não existe uma aresta ligando esses vértices.
Seja o grafo mostrado na figura 8.24 com 6 vértices e 7
arestas. Mostramos um passo do algoritmo GRASP para
este problema.

1
a v v b v c

5 |V | = 6
2 3 6 V = {a, b, c, d, e, f }
E = {1, 2, 3, 4, 5, 6, 7}

d v v v f
4 e 7

Figura 8.24: Grafo do exemplo 8.6.

19
Neste problema aparece o conceito de grau
de um vértice v, d(v), como sendo o número
de vértices vizinhos ao vértice v no grafo cor-
rente. Assim, na figura 8.24, o grau do vértice a é d(a) =
2 e do vértice e é igual a d(e) = 4.
A fase de pré-processamento pode consistir em sele-
cionar um conjunto reduzido de vértices no grafo inicial
para iniciar a busca a partir de um desses vértices escol-
hidos aleatoriamente. Outra alternativa pode ser identi-
ficar todos os vértices de grau zero (sem ligação através
de arestas) e incorporar esses vértices na solução inicial
ou ainda uma combinação dessas alternativas.

20
A fase construtiva pode ser um algoritmo heurı́stico
construtivo:

1. Seja S ∗ o conjunto de vértices independentes que


deve ser encontrado em forma construtiva. Iniciar o
processo com S ∗ = ∅ ou com um S ∗ montado na fase
de pré-processamento. Seja S ∗ a solução corrente.
Fazer o contador de iterações k = 1.
2. A partir da solução corrente S ∗ montar um subgrafo
Gk após eliminar todos os vértices que estão em S ∗
ou possuem uma aresta comum com um vértice em
S ∗. Seja Vk o conjunto de vértices de Gk . Se Vk = ∅
então foi encontrada uma solução do problema na
fase construtiva e terminar o processo. Caso con-
trário, ir ao passo 3.
3. Encontre o grau mı́nimo D do subgrafo Gk usando
a relação:

D = mı́n {dk (v); v ∈ Vk }


4. Monte o conjunto reduzido de arestas RCL, que de-
fine os vizinhos atrativos da solução corrente, usando
a relação:

RCL = {v ∈ Vk |. dk (v) < (1 + α)D; α > 0}


21
5. Selecionar uma aresta j de RCL aleatoriamente e
atualizar o conjunto S ∗: S ∗ = S ∗ ∪ {j}. Atualizar o
contador de iterações e voltar ao passo 2.

22
Usando o algoritmo anterior, usando um valor de α =
0, 6, a fase construtiva do exemplo pode ser resolvida
através dos seguintes passos:
Primeira iteração:
Passo 1: Iniciamos com S ∗ = ∅.
Passo 2: G1 é o grafo completo com V1 = {a, b, c, d, e, f }.
Passo 3: D = mı́n{d1(a), d1(b), d1(c), d1(d), d1(e), d1(f )}

D = mı́n{2, 2, 2, 2, 4, 2} = 2

Passo 4: (1 + α)D = (1 + 0, 6)(2) = 3, 2

−→ RCL = {a, b, c, d, f }

Passo 5: Aleatoriamente é selecionado o vértice a

−→ S ∗ = {a}

k = 2.

23
Segunda iteração:
Passo 2: O subgrafo G2 apresenta a seguinte forma:

u c

u u
f
e
com V2 = {c, e, f }.
Passo 3: D = mı́n{d2(c), d2(e), d2(f )}
D = mı́n{2, 2, 2} = 2.
Passo 4: (1 + α)D = (1 + 0, 6)(2) = 3, 2

−→ RCL = {c, e, f }

Passo 5: Aleatoriamente é selecionado o vértice e

−→ S ∗ = {a, e}

k=3

24
Terceira iteração:
Passo 2: O subgrafo G3 = ∅ −→ S ∗ = {a, e}
é uma solução encontrada na fase construtiva.
A fase construtiva encontrou uma solução factı́vel que
não é uma solução ótima. O leitor está convidado a en-
contrar as soluções ótimas alternativas do problema tais
como os conjuntos: {b, d, f } e {b, c, d}.

25
Na fase de pós-processamento pode ser usado qual-
quer algoritmo de otimização local. Assim, pode-se us-
ar um processo de busca através de uma vizinhança de
tamanho k. Esse processo de busca pode ser resumido
nos seguintes passos:

1. Seja S uma solução com m elementos encontrada na


fase construtiva.
2. Encontrar todos os subconjuntos de S com cardinal-
idade k. Supor que existe p subconjuntos desse tipo:
W1, W2, . . . , Wp.
3. Para cada subconjunto Wj fazer seguinte:
a) Identificar o conjunto Sj cujos elementos são ele-
mentos de S que não estão em Wj .
b) Montar um grafo Gj formado pelos vértices do
grafo que não estão em Sj nem são vizinhos de
um vértice que está em Sj .
c) Encontrar o conjunto máximo de tamanho Nj do
grafo Gj por busca exaústiva.
d ) Se a cardinalidade de Sj ∪Nj é maior que m então
foi encontrada uma solução de melhor qualidade
que S.

26

Você também pode gostar