para todos os outros robôs (linha 5). Em seguida, o robô aguarda um tempo para receber os lances dos demais (linha 6). Após receber os lances de todos os outros, o robô computa o lance vencedor (linha 7). A computação do vencedor consiste apenas em procurar o menor lance na lista de lances e tem complexidade O(r), onde r é o número de robôs. Caso o próprio robô seja o vencedor do alvo, este robô adiciona o alvo a sua lista de alvos visitar (linha 9). Em caso de empates, o robô que possui o menor índice é o vencedor. Na linha 10, o robô remove o alvo analisado da lista de alvos a serem leiloados e o processo se repete até a lista estar vazia. Ao nal do leilão cada robô possui uma lista contendo os alvos vencidos durante o leilão e precisa visitar estes alvos. O laço nas linhas 110 é executado n vezes, onde n é o número de alvos a serem leiloados, e a operação de maior custo neste laço é a computação do vencedor, cuja complexidade é O(r). Sendo assim, a complexidade total do leilão de único item implementado é da ordem O(n · r).
Algoritmo 1: Leilão de Único Item.
Entrada: listaAlvosAmbiente enquanto leilao não acabou faça
1
alvo ← proximo alvo a ser leiloado
2
valor_lance ← distancia(posicao_robo, posicao_alvo)
3 adicionarLance(lance) 4 broadcastMensagem(lance) 5 aguardarTempo(∆) 6 lanceVencedor ← computarVencedor(listaDeLancesRecebidos) 7
se lanceVencedor.robo=proprio robo então
8
adcionar(listaAlvosRobo, alvo)
9
remover(listaAlvosAmbiente, alvo)
10
A Figura 3.2 ilustra como ocorre o processo de leilão de único item. Inicialmente, todos os robôs conhecem a posição dos alvos a serem leiloados. A cada etapa, um alvo da sequência é atribuído ao robô que apresenta menor distância entre sua posição inicial e o alvo oferecido. Na Figura 3.2(a), os robôs oferecem como lance a distância entre si e o alvo t1, vencendo o robô R1. Na Figura 3.2(b), o robô R1 é novamente o
vencedor, pois sua distância para o alvo t2 é a menor. O processo se repete até que
todos os alvos tenham sido leiloados, como pode ser visto na Figura 3.2(j).
3.2 Leilões Sequenciais de Único Item
Leilões Sequenciais de Único Item (do inglês, Sequential Single-Item − SSI) são uma extensão dos leilões de único item capazes de prover soluções melhores que os
3.2. Leilões Sequenciais de Único Item 27 leilões de único item por captar algumas sinergias entre os itens durante o leilão [Lagoudakis et al., 2004]. Em um cenário onde a função objetivo consiste em mini- mizar as distâncias viajadas pelos robôs durante a missão, quanto menor a distância entre dois alvos, maior a sinergia entre eles. Em leilões de único item, um robô com- puta o lance para um alvo oferecido de forma independente dos alvos já oferecidos em etapas anteriores do leilão. Em leilões SSI, por outro lado, os robôs utilizam algum algoritmo para computar lances para um novo alvo com base nos alvos que ele venceu em etapas anteriores do leilão, tentando adquirir alvos que apresentam alguma sinergia com os alvos já vencidos.
O Algoritmo 2 descreve o protocolo de leilão SSI, que é similar ao protocolo de leilão de único item (Algoritmo 1), com a diferença na função que computa o lance para o alvo na linha 3. A computação do lance no leilão SSI é realizada por um algoritmo capaz de analisar os alvos que o robô já venceu anteriormente. Os algoritmos utilizados neste trabalho para computação de lances durante o leilão sequencial serão descritos adiante. Ao nal do leilão cada robô possui uma lista contendo os alvos vencidos durante o leilão e precisa visitar esses alvos. O custo computacional do leilão SSI depende do algoritmo utilizado para computar os lances.
Algoritmo 2: Leilão Sequencial − SSI.
Entrada: listaAlvosAmbiente enquanto leilao não acabou faça
1
alvo ← proximo alvo a ser leiloado
2
valor_lance ← computarLance(algoritmo, alvo, lista de alvos já alocados para o robô)
3 adicionarLance(lance) 4 broadcastMensagem(lance) 5 aguardarTempo(∆) 6 lanceVencedor ← computarVencedor(listaDeLancesRecebidos) 7
se lanceVencedor.robo=proprio robo então
8
adcionar(listaAlvosRobo, alvo)
9
remover(listaAlvosAmbiente, alvo)
10
O algoritmo utilizado para computar os lances durante o leilão SSI inuencia diretamente na qualidade da solução nal provida pelo leilão. Neste trabalho, dois algoritmos para computar lances em um leilão SSI foram implementados e serão dis- cutidos a seguir.
O primeiro algoritmo implementado foi proposto em [Lagoudakis et al., 2004] e será referido no presente trabalho como PRIM Allocation, assim como no trabalho original. As posições dos robôs e dos alvos são modeladas como um grafo G = (V, E) e, durante o leilão, cada robô tenta construir uma Árvore Geradora Mínima (do inglês Minimum Spanning Tree − MST) com os alvos leiloados. Ao se iniciar o leilão, cada
robô possui uma MST contendo somente o vértice que representa sua posição como raiz dessa MST. O lance de um robô para um novo alvo oferecido no leilão é o custo de uma nova MST com a adição do vértice que representa esse novo alvo menos o custo da MST antiga. O robô que menos incrementa o custo de sua MST com a adição do novo vértice será o vencedor do alvo, atualizando a sua MST, que será mantida durante todo o leilão. A computação de lances utilizando o algoritmo PRIM implementado neste trabalho tem complexidade computacional O(n2).
A Figura 3.3 ilustra o processo de leilão SSI utilizando o algoritmo PRIM Allo- cation. Cada robô inicia com uma MST contendo apenas sua posição inicial como raiz da árvore. Na Figura 3.3(a), cada robô dá lance para o alvo t1 como sendo o custo
para se inserir este alvo em sua MST, que é o custo da aresta entre a raiz da árvore e o novo alvo. O robô R1 ganha o alvo pois apresenta o menor custo. Na Figura 3.3(b),
os robôs novamente computam a diferença de custo com a inserção do alvo oferecido em suas MSTs. O robô R1 vence novamente, ligando o alvo t2 a raiz de sua MST. Na
Figura 3.3(c), o robô R1 dá lance para o alvo t3 como sendo o custo da aresta (t1,t3),
pois o custo dessa aresta representa a diferença entre a nova MST com a inserção do novo alvo e a MST antiga. O processo se repete até que todos os alvos estejam na MST de algum robô.
Uma segunda forma computar lances em leilões SSI implementada neste trabalho é baseada na ideia proposta por Koenig et al. [2006], no qual os autores sugerem o uso de heurísticas polinomiais capazes de resolver o problema do Caixeiro Viajante (TSP) para computar lances para os alvos durante o leilão SSI. Neste trabalho foi implementada a heurística de Inserção do Mais Distante (Farthest Insertion Heuristic FI), uma heurística construtiva capaz de prover uma solução candidata de baixo custo para o TSP em tempo polinomial.
A heurística FI modela as posições do robô e dos vértices como um grafo G = (V, E)completo. FI inicia com um circuito vazio e gradualmente constrói um circuito de menor custo com os alvos, sempre inserindo no circuito o alvo que está mais longe do circuito. A lógica por trás desta heurística é que alguns alvos serão mais caros para inserir no circuito. Logo tenta-se inserir primeiro os alvos mais caros formando um esboço inicial do que será o circuito nal, e em seguida insere-se os alvos restantes nas posições mais adequadas desse circuito inicial. Dessa forma, tenta-se evitar a criação de arestas cruzadas, que incrementam o custo do circuito nal.
O Algoritmo 3 descreve os passos da heurística FI para computação de um circuito de menor custo a partir de uma lista de alvos e a posição inicial do robô. Inicialmente, cria-se uma aresta entre a posição inicial do robô e o alvo mais distante dessa posição, (linhas 3 e 4). Procurar pelo alvo mais distante é uma operação de complexidade O(n),
3.2. Leilões Sequenciais de Único Item 29
para n alvos na lista. Em seguida, o algoritmo procura pelo alvo que se encontra mais distante da aresta criada, na linha 5, e com esse novo alvo, fecha-se um circuito inicial. Para todo os outros n − 2 alvos, no laço das linhas 7 − 11, o algoritmo procura o alvo mais distante do circuito em O(n), na linha 8, e adiciona esse novo alvo na posição que menos incrementa o custo do circuito (linhas 8 − 11). A operação de procurar pela posição mais adequada tem complexidade O(n) também. Dessa forma, o custo total do algoritmo é O(n2).
Algoritmo 3: Heurística Inserção do Vizinho Mais Distante (FI).
computarCicloFI(posição do robô, lista de alvos)
1
início
2
encontre o alvo v1 mais distante do vértice do robô vr na lista de alvos
3
crie uma aresta (vr,v1)
4
encontre o alvo v2 mais distante da aresta (vr,v1)
5
crie uma aresta (v2,vr) fechando um circuito
6
para todos os outros alvos vi na lista de alvos faça
7
encontre o alvo vx mais distante do circuito
8
encontre a aresta (va,vb) do circuito da qual vxestá mais próximo
9
remova a aresta (va,vb) do circuito
10
crie duas novas arestas (va,vx) e (vx,vb)
11
retorne circuito
12
m
13
A Figura 3.4 ilustra a criação de um circuito de menor custo com a utilização da heurística FI para um conjunto de 9 alvos. Inicialmente, encontra-se o alvo mais distante do robô, que é o alvo t4 (Figura 3.4(b)), criando-se uma aresta entre os robô e
este alvo. Em seguida, encontra-se o vértice mais longe da aresta criada, que é o alvo t9, fechando-se um circuito, como pode ser visto na Figura 3.4(c). Nos passos seguintes,
o algoritmo encontra o alvo mais distante do circuito formado, sempre inserindo esse alvo na posição do circuito que menos incrementa o custo desse circuito. O algoritmo termina quando todos os alvos da lista se encontram no circuito, como pode ser visto na Figura 3.4(j).
Durante o leilão, o lance de um robô para um novo alvo oferecido é a diferença no custo do novo circuito contendo os alvos já alocados para este robô e o novo alvo menos o custo do circuito anterior. A Figura 3.5 ilustra o processo de leilão SSI que utiliza a heurística FI para computação de lances. Na Figura 3.5(a), cada robô oferece como lance para t1 o custo do circuito contendo apenas sua posição inicial e o alvo t1,
que corresponde ao custo de o robô ir até t1 e retornar a sua posição inicial. O robô
R1 apresenta o menor custo e ganha o alvo. Na 3.5(b), os robôs dão lance para t2 e,
como robô R1 é aquele que menos incrementa o custo do circuito com a inserção do
3.2. Leilões Sequenciais de Único Item 31
menos incrementa o custo de seu circuito com a inserção do novo alvo. Ao nal do leilão, cada robô possui um circuito de menor custo, como pode ser visto na 3.5(j), sendo necessário que cada robô realize esse percurso para visitar os alvos.