uma soluÇÂo em robÓtica coletiva para...
TRANSCRIPT
UMA SOLUÇÂO EM ROBÓTICA COLETIVA PARA
DESCONTAMINAÇÃO
Bernardo Cid Killer Soares de Souza
Projeto de Graduação apresentado ao Curso de
Engenharia Eletrônica e de Computação da Escola
Politécnica, Universidade Federal do Rio de
Janeiro, como parte dos requisitos necessários à
obtenção do título de Engenheiro.
Orientador: Prof. Felipe M. G. França, Ph.D.
Rio de Janeiro
Março de 2016
ii
UMA SOLUÇÃO EM ROBÓTICA COLETIVA PARA
DESCONTAMINAÇÃO
Bernardo Cid Killer Soares de Souza
PROJETO DE GRADUAÇÃO SUBMETIDO AO CORPO DOCENTE DO CURSO
DE ENGENHARIA ELETRÔNICA E DE COMPUTAÇÃO DA ESCOLA
POLITÉCNICA DA UNIVERSIDADE FEDERAL DO RIO DE JANEIRO COMO
PARTE DOS REQUISITOS NECESSÁRIOS PARA A OBTENÇÃO DO GRAU DE
ENGENHEIRO ELETRÔNICO E DE COMPUTAÇÃO
Autor:
_________________________________________________
Bernardo Cid Killer Soares de Souza
Orientador:
_________________________________________________
Prof. Felipe M. G. França, Ph. D.
Examinador:
_________________________________________________
Prof Flávio Luis de Mello, D. Sc.
Examinador:
_________________________________________________
Prof. Heraldo Luis Silveira de Almeida, D. Sc.
Rio de Janeiro – RJ, Brasil
Março de 2016
iii
UNIVERSIDADE FEDERAL DO RIO DE JANEIRO
Escola Politécnica – Departamento de Eletrônica e de Computação
Centro de Tecnologia, bloco H, sala H-217, Cidade Universitária
Rio de Janeiro – RJ CEP 21949-900
Este exemplar é de propriedade da Universidade Federal do Rio de Janeiro, que
poderá incluí-lo em base de dados, armazenar em computador, microfilmar ou adotar
qualquer forma de arquivamento.
É permitida a menção, reprodução parcial ou integral e a transmissão entre
bibliotecas deste trabalho, sem modificação de seu texto, em qualquer meio que esteja
ou venha a ser fixado, para pesquisa acadêmica, comentários e citações, desde que sem
finalidade comercial e que seja feita a referência bibliográfica completa.
Os conceitos expressos neste trabalho são de responsabilidade do(s) autor(es).
iv
AGRADECIMENTO
A todos que conviveram comigo no percorrer deste trabalho. Agradeço
principalmente aos meus amigos por considerações, ajudas e apoios que foram dados e
pelos momentos descontraídos dividimos. Agradeço também a meus professores, por
sua orientação dentro e fora de sala de aula.
v
RESUMO
Este trabalho trata do desenvolvimento de um sistema de robótica coletiva. Esse
sistema foi focado no problema de descontaminação de grafos em um ambiente
simplificado e controlado. Adicionalmente são discutidas a implementação, estrutura do
código de controle dos robôs, dificuldades do trabalho e pequenas diferenças nos
algoritmos de tomada de decisões. A descontaminação é uma situação na qual se busca
a alocação coordenada de agentes em um grafo e por isso as discussões se centram em
determinação de novas posições e momento de movimentação dos agentes. Como
resultado final o sistema desenvolvido engloba os robôs utilizados, uma central de
comunicação para conectar os robôs, um simulador para casos mais genéricos dos
algoritmos dos robôs e um sistema de projeção do grafo sendo descontaminado sobre a
região na qual os robôs se movem fisicamente.
Palavras-Chave: robótica coletiva, sistema robótico, descontaminação, micro
controladores, descontaminação de grafos, escalonamento por reversão de arestas.
vi
ABSTRACT
This work focus on the development of a swarm robotic system. This system
was built to solve the digraph decontamination problem in a controlled and simplified
environment. In addition the implementations, algorithm choices, the robots code
structure and development difficulties are also discussed. Decontamination focus on the
coordination of agents positioning themselves while moving on the digraph. It may
represents a fire fighting or hunting scenarios. The final system presents a group of
functional robotic agents, a communication central, simulation software and a
projection system to visualize the decontamination over the area the robots are
physically moving.
Key-words: swarm robotics, robotic system, decontamination, micro controllers, graph
decontamination, scheduling by edge reversal.
vii
SIGLAS
UFRJ – Universidade Federal do Rio de Janeiro
ERA – Escalonamento por Reversão de Arestas
ERAh – Escalonamento por Reversão de Arestas com Hibernação
SER – Scheduling by Edge Reversal
NP – Nondeterministic polynomial time
IDE – Integrated Development Environment
viii
Sumário
1 Introdução 1
1.1 - Motivação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 - Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 - Organização do Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2 Descontaminação de Grafos 3
2.1 - Problema de descontaminação de grafos . . . . . . . . . . . . . . . . 3
2.2 - Variantes do problema de descontaminação . . . . . . . . . . . . . 5
2.2.1 - Critério de contaminação . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2.2 - Período de contaminação (TC) . . . . . . . . . . . . . . . . . . . . 6
2.2.3 - Período de descontaminação (Td) . . . . . . . . . . . . . . . . . . 6
2.2.4 - Limpeza de arestas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2.5 - Monotonicidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3 Escalonamento por Reversão de Arestas 8
3.1 - Escalonamento por Reversão de Arestas . . . . . . . . . . . . . . . . 8
3.2 - Orientação Acíclica Inicial do ERA . . . . . . . . . . . . . . . . . . . 9
3.3 - Decomposição por sumidouros/sorvedouros . . . . . . . . . . . . . 10
3.4 - Escalonamento Por Reversão de Arestas com Hibernação . . 12
3.5 - Sistema e Controle Distribuídos . . . . . . . . . . . . . . . . . . . . . . 14
4 Descontaminação por Robótica Coletiva 16
4.1 - Algoritmos distribuídos de descontaminação . . . . . . . . . . . . 16
4.1.1 - Solução utilizando ERA . . . . . . . . . . . . . . . . . . . . . . . . 17
ix
4.1.2 - Outras soluções utilizando agentes distribuidos . . . . . . 17
4.2 - Plataforma robótica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.2.1 - Robôs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.2.2 - Plataforma de programação . . . . . . . . . . . . . . . . . . . . . . 21
4.3 - Metodologia experimental . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
5 Código e comportamento dos robôs 24
5.1 - Algoritmos e estruturas de dados para implementação dos
robôs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
5.2 - Algoritmo de comportamento dos Robôs . . . . . . . . . . . . . . . 26
5.3 - Troca de tarefas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5.4 - Algoritmos de determinação de prioridade . . . . . . . . . . . . . . 30
5.4.1 - Determinação de prioridades utilizando ERAh . . . . . . . 31
5.4.2 - Determinação de prioridades utilizando duas listas . . . . 34
5.5 - Algoritmos utilizados pra a determinação do movimento . . . 34
5.5.1 - Seleção de próximo nó usando ERA . . . . . . . . . . . . . . . 34
5.5.2 - Seleção de próximo nó usando decomposição lambda . 36
5.6 - Algoritmo de determinação de caminho . . . . . . . . . . 36
5.7 - Troca de informações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
5.8 - Algoritmo de orientação inicial dos grafos . . . . . . . . . . . . . . 40
5.8.1 - Algoritmo de orientação acíclica inicial por desempate 40
5.8.2 - Algoritmo de orientação acíclica inicial por pseudo
decomposição em sorvedouros . . . . . . . . . . . . . . . . . . . . . . . . . .
41
5.9 - Análise dos resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.9.1 - Sobre o número de agentes . . . . . . . . . . . . . . . . . . . . . . . 47
5.9.2 - Sobre o número de passos . . . . . . . . . . . . . . . . . . . . . . . . 49
5.9.3 - Comparação das combinações de algoritmos . . . . . . . . 50
x
6 Conclusão 51
6.1 - Contribuições . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
6.2 - Trabalhos futuros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Bibliografia 52
xi
Lista de Figuras
2.1 – Funcionamento do problema de contaminação . . . . . . . . . . . . . . . . . . . . . . . 4
2.2 – Exemplo da descontaminação de um grafo . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.1 – Funcionamento do ERA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.2 – Exemplos de diferentes orientações iniciais acíclicas . . . . . . . . . . . . . . . . . . 10
3.3 – Exemplo da decomposição por sorvedouros de um grafo . . . . . . . . . . . . . . . 11
3.4 – Funcionamento do ERAh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4.1 – Grid de movimentação dos robôs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.2 – Detalhes do robô Beauto Rover, trás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.3 – Detalhes do robô Beauto Rover, frente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.4 – Detalhes do robô Beauto Rover, fundo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5.1 – Diagrama de estados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5.2 – Exemplo de um grafo completo funcionando com ERAh . . . . . . . . . . . . . . . 31
5.3 – Exemplo da dinâmica do ERAh no Grafo de Prioridades em uma situação
de descontaminação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
5.4 – Funcionamento de um algoritmo de busca por inundação de grafos . . . . . . . 38
5.5 – Exemplo do sistema robótico em funcionamento step 0 . . . . . . . . . . . . . . . . 44
5.6 – Exemplo do sistema robótico em funcionamento step 9 . . . . . . . . . . . . . . . . 44
5.7 – Exemplo do sistema robótico em funcionamento step 21 . . . . . . . . . . . . . . . 45
5.8 – Exemplo do sistema robótico em funcionamento step 23 . . . . . . . . . . . . . . . 45
xii
Lista de Tabelas
5.1 – Composição das combinações de algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.2 – Contagem de robôs utilizados por cada combinação em cada caso de teste . 48
5.3 – Número total de passos dado por todos os robôs em cada caso de teste
usando cada combinação de algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
1
Capítulo 1
Introdução
1.1 - Motivação
Robótica coletiva é uma área relativamente recente que busca tratar a execução
de tarefas do mundo real utilizando um conjunto de vários robôs relativamente simples
em detrimento de um único grande robô altamente eficiente. Por sua natureza de
coordenar múltiplos agentes robóticos, é necessário tratar as respostas implementadas
em robótica coletiva como sistemas distribuídos. Ao mesmo tempo também se percebe
que esta é uma alternativa para implementação de soluções de problemas que já sejam
distribuídas.
A descontaminação é um dos problemas com solução distribuída que já é
estudado faz alguns anos. Essa pode ser um exemplo representativo de situações de
busca por indivíduos em cavernas ou prédios, de combate a incêndios em fábricas ou até
mesmo de combate a ataques cibernéticos ou destruição de vírus que tenham se
instalado em diferentes páginas ou servidores na web.
Ainda que haja compatibilidade entre a questão de descontaminação e uma
solução usando robótica coletiva, as respostas conhecidas para este são muitas vezes
específicas ou consideram capacidades que nem sempre são possíveis no mundo real.
Por isso é de interesse verificar as dificuldades da implementação e limitações de um
sistema final que use agentes robóticos reais ao invés de agentes digitais ou idealizados.
Demanda para o uso de robôs em conjunto já existe, mas cada aplicação
apresenta um novo conjunto de variáveis e terrenos a serem analisados e que implicam
no tipo e número de robôs adequados para cada um e como estes devem se relacionar. A
tradução de uma solução para um grafo “mapa” em movimento para os robôs também
não é direta e depende de como estes se relacionam. Com isso em mente, estudar uma
solução para um conjunto de tipos de problema de inteligência artificial distribuída e
como os robôs interpretam o ambiente e implementam esta solução é necessário.
2
1.2 - Objetivos
Esse trabalho visa desenvolver uma plataforma robótica que possa ser utilizada
para demonstrações e na qual possam ser testados algoritmos distribuídos já
considerando as limitações de uma implementação física. Para tal o sistema será
implementado com robôs que irão se coordenar para resolver uma instância do
problema de descontaminação para uma topologia genérica. Os robôs deverão se
coordenar para solucionar o problema de descontaminação em um mapa, mas não
precisarão apresentar habilidade real de combater um tipo de contaminação.
1.3 - Organização do texto
O texto será dividido em 6 capítulos, incluindo a introdução. Os Capítulos 2 e 3
apresentam a base teórica que será utilizada no trabalho. No Capítulo 2 será definido o
problema de descontaminação de grafo, suas definições e variantes. No Capítulo 3
iremos discutir dois algoritmos de reversão de arestas que serão utilizados para solução
do problema de descontaminação e coordenação dos robôs.
Os Capítulos 4 e 5 focam em aspectos da implementação do sistema robótico e o
Capítulo 6 é a conclusão do trabalho. No Capítulo 4 falamos sobre o sistema que foi
implementado, a solução do problema de descontaminação usando múltiplos agentes e
sobre os robôs que serão utilizados. Já no Capítulo 5 iremos falar sobre o código e
inteligência dos robôs, quais algoritmos foram utilizados nestes e os resultados da
implementação do sistema. Finalmente o Capítulo 6 apresenta a conclusão do trabalho.
3
Capítulo 2
Descontaminação de Grafos
Neste capítulo é apresentado o problema de descontaminação, base do cenário
no qual o trabalho se insere.
2.1 – Problema de descontaminação de grafos
Considere um grafo G formado por j nós N e k arestas A. Inicialmente todos os
nós estão contaminados e agentes descontaminadores são liberados dentro do grafo.
Quando um nó contaminado é ocupado por um agente este é descontaminado após um
período de descontaminação Td e não pode ser recontaminado enquanto o agente estiver
presente. Um nó descontaminado que não tenha um agente dentro dele pode ser
recontaminado caso apresente um nó vizinho que esteja contaminado durante um tempo
igual ou maior a um dado período de recontaminação Tr. Dois nós Nj1 e Nj2 são
considerados vizinhos caso Nj1 e Nj2 apresentem uma aresta Ak comum entre eles.
Desse modo um nó pode estar em um de quatro estados:
Contaminado: O nó não possui agente alocado em si e pode
recontaminar nós vizinhos que estejam descontaminados.
Descontaminado: O nó não possui nenhum agente alocado em si e não
recontamina nós vizinhos que estejam descontaminados.
Guardado: Similar ao caso descontaminado, mas com um agente
alocado em si. Não pode ser recontaminado por vizinhos contaminados.
Sendo Descontaminado: Similar ao guardado, mas caso o agente no nó
saia este nó é considerado contaminado.
A figura 2.1 representa o funcionamento da dinâmica de contaminação. Neste esquema
os nós pretos são nós contaminados, os nós cinzas são nós com agentes e os nós brancos
estão descontaminados e sem agentes. Na situação (a) o nó contaminado contamina seus
4
vizinhos descontaminados e o ciclo se repete a cada passo temporal até o grafo inteiro
estar contaminado. Na situação (b) o nó contaminado contamina seu vizinho, mas a
contaminação não se espalha por todo o grafo pela presença de um “cerco” de agentes
no meio do grafo.
Figura 2.1: Funcionamento do problema de contaminação
O problema de descontaminação chega ao fim quando todos os nós forem
descontaminados e não puderem ser recontaminados, o que equivale a todos os nós
estarem descontaminados ou guardados. Essa situação é demonstrada na figura 2.2, na
qual desenvolvemos a descontaminação de um grafo de início ao fim. Inicialmente, no
passo (a), o grafo se encontra completamente contaminado. Um agente robótico é
inserido então no nó marcado pela seta dupla dando início ao processo de
descontaminação, esse nó passa a estar protegido. Nos próximos ciclos outros agentes
robóticos são inseridos e nós que estão ocupados por agentes e cujos vizinhos estão
ocupados por agentes se tornam descontaminados. Isso se repete até os passos (e) e (f)
onde todos os nós foram ocupados ou descontaminados.
5
Figura 2.2: Exemplo da descontaminação de um grafo
Alternativamente uma solução trivial seria posicionar um agente
descontaminador em cada um dos nós. Entretanto esta resposta é pouco eficiente e nem
sempre possível. Se o grafo a ser descontaminado representar um sistema digital (uma
rede de servidores conectados entre si, por exemplo) os agentes que poderiam ser
programas de “limpeza antivírus” e seria possível replicá-los em cada servidor, não
tendo restrição de números, ou poderiam ser implementados em um único servidor
ocupando múltiplos threads (o que permitiria um número não infinito, mas grande, de
agentes). No caso de agentes físicos, como robôs de busca ou robôs detectores de
vazamentos não é possível garantir uma abundância de agentes e se torna mais
importante coordenar eficientemente os agentes disponíveis para solucionar a situação.
2.2 – Variantes do problema de descontaminação
O problema de descontaminação é descrito normalmente apenas como o de se
iniciar com uma região contaminada e depois introduzir agentes na região de modo que
esta se torne descontaminada após diversas interações tendo em conta a possibilidade de
recontaminação de suas subdivisões. Entretanto para cada caso de estudo existem
6
diversas limitações que são impostas criando situações variadas [2] para serem
analisadas. Dentre as características modificadas ou limitações impostas mais comuns
na literatura temos: critério de recontaminação, período de recontaminação, período de
descontaminação, limpeza de arestas e monotonicidade da solução. Estas cinco
características são descritas a seguir.
2.2.1 - Critério de contaminação
O critério de contaminação indica sob quais condições um nó descontaminado (e
não guardado) se torna contaminado. Normalmente o critério de contaminação é
relacionado ao número de nós vizinhos contaminados. Exemplos de critérios de
contaminação são: caso um único vizinho, metade dos vizinhos, todos os vizinhos, pelo
menos quatro vizinhos estejam contaminados pode haver contaminação.
2.2.2 - Período de contaminação (𝐓𝐂)
O período de contaminação diz respeito a quanto tempo um ambiente, nó ou
região descontaminada leva para ser contaminada. Pode ser descrito de forma mais
específica como o tempo que um nó desprotegido sob o critério de contaminação leva
para se tornar contaminado.
2.2.3 - Período de descontaminação (Td)
O período de descontaminação é o tempo mínimo necessário que um agente
deve permanecer em um nó para que ele seja limpo. Ainda que um nó protegido não
esteja limpo, por não ter completado seu período de descontaminação, na literatura se
considera que este nó não irá contaminar nós vizinhos.
Um período de descontaminação igual a zero normalmente indica que o agente
limpa instantaneamente o nó e geralmente é utilizado em simulações nas quais a
disposição dos agentes é o foco.
7
2.2.4 - Limpeza de arestas
A limpeza de arestas se dá quando um agente garante que não haverá
contaminação de um nó por efeito de um nó vizinho para o qual este está se deslocando.
Essa situação é abstraída como se o agente estivesse limpando o canal, isto é, limpando
toda a extensão que conecta o nó em que este estava e o nó para onde se deslocou. Neste
caso um robô que esteja em um nó protegido pode passar para seu último vizinho que
esteja contaminado sem perigo. O efeito prático de haver limpeza de arestas é a
necessidade de um robô a menos para a descontaminação de um nó e em extensão do
grafo.
2.2.5 - Monotonicidade
Monotonicidade é um termo utilizado para um tipo de solução do problema de
descontaminação de grafos. Matematicamente uma função monotônica é aquela cuja
derivada é sempre positiva ou negativa, ou seja, apresenta apenas um sentido. Já em
problemas de descontaminação uma solução monotônica é aquela que gera uma
sequência de descontaminação na qual nenhum nó é recontaminado. Ou seja, o número
de nós não contaminados sempre cresce. Normalmente os nós que serão ocupados
devem ser sempre vizinhos de outros nós já ocupados em uma resposta monotônica,
apesar dessa restrição não ser explicitada.
8
Capítulo 3
Escalonamento por Reversão de Arestas
Neste capítulo é apresentado o algoritmo de Escalonamento por Reversão de
Arestas - ERA (Scheduling by Edge Reversal – SER). Originalmente este é um
algoritmo para compartilhamento de recursos, mas pode ser adaptado para determinar a
ocupação coordenada de um grafo.
3.1 - Escalonamento por Reversão de Arestas
O algoritmo de Escalonamento por Reversão de Arestas é um algoritmo para
compartilhamento de recursos em um grafo orientado no qual cada nó representa um
processo e cada aresta representa um recurso compartilhado entre dois processos
distintos [3],[4],[7]. O grafo ser orientado quer dizer que cada aresta tem um sentido,
apontando para um dos nós que conecta, e representa que um determinado nó (processo)
tem controle daquele recurso. Quando todas as arestas de um nó estão apontando para
ele (ou seja, orientadas em seu sentido) esse nó é considerado um sorvedouro e isso
quer dizer que o nó (processo) domina naquele momento todos os recursos que precisa
para operar e tem prioridade sobre todos s seus vizinhos para operar. Quando um nó
opera (o processo realiza sua função) este libera os recursos que estava utilizando,
representado pela reversão do sentido de suas arestas. Como um nó necessita ter todas
as arestas orientadas para si para operar, após a reversão de arestas todas suas arestas
passam a apontar para seus vizinhos. A figura 3.1 mostra como funciona o ERA.
Inicialmente o nó 1 tem todos os recursos alocados para si e é o único sumidouro, isso é,
o único nó que pode operar. Ao operar o nó 1 reverte suas arestas e o nó 4 se torna o
próximo sumidouro, esse então opera tornando os nós 2 e 3 sumidouros. Esse processo
pode ser repetido indefinidamente se não houverem ciclos na orientação do grafo.
9
Figura 3.1: Funcionamento do ERA
Uma grande vantagem do ERA é que este, considerando a operação correta do
sistema, consegue diminuir a concorrência entre os processos e garantir uma divisão
mais democrática dos recursos. Uma concorrência menor (menor paralelismo) poderia
não ser desejada em um sistema, entretanto nosso problema apresenta uma limitação no
número de agentes totais dentro do sistema em todos os momentos. Por isso é de
interesse encontrar respostas que maximize o uso de cada agente, desse modo utilizando
menos agentes para executar a mesma tarefa. Entretanto este necessita de uma
orientação acíclica do grafo para que funcione corretamente (se não haverá ocorrência
de deadlock).
Para a solução do problema de descontaminação utilizaremos o ERA em um
grafo nos quais os nós representam regiões num espaço físico (posições) e cada aresta
indicará que há fronteira entre os nós (indica que as regiões são vizinhas). Um nó ser
um sorvedouro indica que aquela posição está pronta para ser ocupada e a operação de
um nó indica que aquela região foi ocupada por um agente e descontaminada.
3.2 – Orientação Acíclica Inicial do ERA
Para o Escalonamento por reversão de arestas garantir o funcionamento correto e
divisão democrática de recursos este depende de apresentar uma orientação inicial
acíclica no grafo no qual é aplicado. Uma orientação acíclica é aquela na qual não
existem ciclos. Por simplicidade definiremos uma orientação com ciclos, ou cíclica,
como uma orientação do grafo na qual para um nó 𝑁1 poder se tornar um sorvedouro
(ter todas as suas arestas apontadas para si e então poder atuar) este depende da reversão
de arestas de um outro nó 𝑁2 que dependa da reversão de arestas de 𝑁1 para se tornar
um sorvedouro (e então poder atuar e reverter suas arestas) ou da reversão de arestas de
10
um nó 𝑁3 que dependa da reversão de arestas de 𝑁1 para poder atuar. Gerar uma
orientação acíclica não é difícil, mas determinar a orientação acíclica que minimiza ou
maximiza a concorrência de um grafo foi mostrado ser um problema NP completo.
Figura 3.2: Exemplos de diferentes orientações iniciais acíclicas
A figura 3.2 mostra dois exemplos de orientações iniciais acíclicas para um
mesmo grafo. Orientações acíclicas diferentes modificam a ordem na qual os nós irão
operar, mas não interferem no funcionamento do ERA.
3.3 – Decomposição por sumidouros/sorvedouros
Decomposição por sumidouros é um tipo de análise na qual divide-se os nós de
um grafo em níveis (ou mais genericamente cores). No primeiro nível, ou nível λ0, são
colocados todos os nós que são sumidouros. No nível seguinte, o λ1, são colocados os
nós que se tornarão sumidouros quando os nós do nível λ0 reverterem suas arestas. No
nível λ2 são colocados os nós que se tornarão sumidouros quando os nós dos níveis
anteriores tiverem revertido suas arestas. E assim sucessivamente até que todos os nós
tenham sido posicionados em um nível.
Ao utilizar o escalonamento por reversão de arestas em um grafo decomposto
por sumidouros veremos que quando um sumidouro (no nível λ0) atuar, seus vizinhos
irão passar para um nível inferior e o nó que atuou passará para o maior nível no qual
um de seus vizinhos estava posicionado. Desse modo os nós que estavam em λ1 passam
para λ0 (indicando os novos sorvedouros) e gerando uma nova orientação acíclica,
como é de se esperar do ERA.
11
Essa organização do grafo serve para representar os nós que podem atuar ao
mesmo tempo (considerando que todos os nós que conseguem atuar atuem juntos) e nos
dá informações sobre o nível de concorrência que aparecerá quando os agentes forem
introduzidos no grafo. Aqui um número maior de níveis tende a indica uma menor
concorrência, podendo ser utilizado como métrica para se escolher entre duas
orientações iniciais de um grafo.
Figura 3.3: Exemplo da decomposição por sorvedouros de um grafo
A figura 3.3 mostra uma decomposição em sorvedouros de um grafo orientado.
O esquema (a) mostra a decomposição original do grafo. Após a operação dos nós 1 e 2
estes passam para camadas mais altas e os nós da camada λ1 passam para λ0 tornando-
12
se sorvedoures, como é mostrado no esquema (b). Após isso, os sorvedouros novamente
operam passando para a situação no esquema (c).
3.4 - Escalonamento Por Reversão de Arestas com Hibernação
O outro algoritmo que será utilizado será o Escalonamento por Reversão de
Arestas com Hibernação – ERAh [1]. O ERAh se comporta de forma similar ao ERA,
entretanto no ERAh quando dois processos (nós) compartilham um recurso os nós
associados com tais processos são conectados por duas arestas ao inv és de uma
(ou por uma aresta dupla). A primeira destas arestas, que controla o recurso , funciona
como as arestas do ERA, indicando quando o processo tem posse de um recurso
compartilhado. A segunda aresta controla o recurso . O recurso indica se a aresta de
recurso poderá ser revertida quando o nó operar. Se o nó não controlar a aresta a
arestas não deverá ser revertida. No ERAh a noção de sorvedouro é um pouco
diferente da do ERA. Não é necessário que todas suas arestas estejam apontando para si,
quando todas suas arestas estejam direcionadas para si o nó (processo) é considerado
um sorvedouro e se encontra em condições de operar. Na operação de um nó este
reverte todas suas arestas que também tenham as respectivas arestas orientadas
para si e todas as arestas que controlam.
Alternativamente no ERAh existe uma segunda possibilidade quando um nó
opera. Ao invés de simplesmente reverter suas arestas um nó pode decidir entrar em
hibernação, isso quer dizer que ele abre mão de utilizar os recursos que compartilha
com outros nós enquanto está hibernando. Desse modo os recursos que utiliza ficam a
disposição de seus vizinhos continuamente até que este saia de hibernação. Para passar
para a hibernação o nó, quando for um sorvedouro, deve reverter apenas suas arestas
para todos os seus vizinhos. Tal como na reversão básica de arestas do ERAh deve-se
reverter apenas as arestas que o nó também controlar as respectivas arestas .
Para sair da hibernação um nó deve receber uma reversão de arestas de um de
seus vizinhos. Essa reversão de arestas será da aresta que compartilham. Quando isso
ocorre o nó que estava hibernando passa a controlar os recursos e daquela aresta
dupla e reverte todas suas outras arestas que controla. Se um de seus vizinhos que
13
tiveram a aresta apontada para si estiver hibernando este passa o recurso
correspondente para o nó que está saindo da hibernação. O pseudocódigo do
funcionamento de um nó do ERAh está descrito a seguir.
Pseudocódigo do funcionamento de um nó que opera por ERAh
Se estado == ativo.
{
Se controlar todos os recursos .
{
Nó pode operar.
Se for tirar um vizinho da hibernação.
{
Reverter a aresta de recurso para o vizinho que sairá da hibernação.
}
Se for passar para hibernação.
{
Reverter todas as arestas de recurso que também controla o recurso
correspondente.
Estado = hibernando.
}
Se não.
{
Reverter todas as arestas de recurso e que controla o recurso
correspondente.
}
}
}
Se estado == hibernando.
{
Se receber o controle de um recurso .
{
Reverter o recurso correspondente.
}
Se receber o controle de um recurso .
{
Estado = ativo.
Reverter todas as arestas de recurso que controla e controla o recurso
correspondente.
Reverter todas as arestas de recurso que controla.
}
}
14
Figura 3.4: Funcionamento do ERAh
Um exemplo simples do funcionamento do ERAh pode ser visto na figura 3.4.
Inicialmente nesse grafo temos apenas o nó 3 como sorvedouro, este então opera e passa
a hibernar retendo seus recursos . Com isso os nós 2, 4 e 5 passam a estar aptos a
operar. Os nós 2 e 5 operam, revertendo as arestas que controlam o recurso . O nó 4
também opera passando a hibernar. Depois disso o nó 1 opera despertando o nó 3 que
reverte suas arestas.
No sistema que será implementado para solucionar o problema de
descontaminação de grafo, o ERAh será utilizado para determinar a preferência entre os
robôs, determinando assim de qual robô é a vez de agir. Cada nó do grafo será um robô,
sendo o nó sorvedouro o que deve agir naquele instante. Os nós hibernando
representarão robôs que estão defendendo um nó do grafo a ser descontaminado para
que não haja recontaminação deste.
3.5 - Sistema e Controle Distribuídos
Um sistema distribuído é aquele no qual uma tarefa não é realizada por uma
única peça de hardware ou software, necessitando da comunicação, colaboração ou
interação entre as diversas partes para que a tarefa seja concluída. Existem diversas
montagens que implementam uma arquitetura distribuída, por exemplo, na configuração
mestre-escravo existem dois tipos de dispositivos, o primeiro tipo (mestres) coordena os
dispositivos de segundo tipo passando comandos e dados para estes (escravos). Por sua
vez os dispositivos do segundo tipo efetuam apenas os comandos que lhes são passados
pelos dispositivos do primeiro tipo.
15
Os sistemas distribuídos, por sua natureza, tendem a apresentar algum tipo de
hierarquia ou diferenciação de tarefas. Algumas partes do sistema podem decidir as
ações a serem tomadas e outras apenas implementarem as ações. Outra possibilidade é
que as partes hajam independentemente, mas algumas façam apenas coleta e outras
apenas análise de materiais. Em contraposição, existem tipos de sistema distribuído sem
hierarquia, nos quais todas as partes apresentam o mesmo nível de comando sobre as
outras e os sistemas sem diferenciação de partes, nos quais cada unidade do sistema é
similar as outras, por exemplo um sistema de alarmes baseado apenas em sensores de
presença.
Já o controle distribuído é quando um controlador é designado para cada parte
do sistema, não havendo um controlador central que cuida do sistema inteiro (apesar de
poder haver uma interface que centralize a leitura de informações e estados de cada um
dos controladores). Esse tipo de sistema é muito utilizado em fábricas e usinas. Neste,
cada máquina ou pedaço da linha de produção são controlados individualmente por um
controlador próprio. Comandos podem ser emitidos para cada um dos controladores,
mas não diretamente para as máquinas, ficando a cargo dos controladores implementar
localmente cada comando e manter os elementos sob sua responsabilidade funcionando
corretamente.
16
Capítulo 4
Descontaminação por Robótica Coletiva
Neste trabalho focaremos no problema de descontaminação no caso sem limpeza
de arestas, com período de descontaminação 0 (basta um agente adentrar em um nó que
este será descontaminado), período de contaminação 1 (basta estar um único momento
sem um agente defendendo um nó para que este já possa ser recontaminado) e critério
de contaminação de um vizinho contaminado (para qualquer nó descontaminado basta
haver um vizinho contaminado para haver contaminação). Isso quer dizer que, para um
nó ser realmente descontaminado, ele precisa ter um agente presente nele e todos os
seus vizinhos necessitam estar ou protegidos (com um agente no nó) ou
descontaminados. Nós que não apresentarem estas condições estarão protegidos, caso
haja um agente no nó, ou contaminados, caso não apresentem um agente em si.
Adicionalmente esse trabalho analisará casos implementados com agentes físicos e em
quantidade limitada em um ambiente discretizado.
Com as delimitações do problema bem colocadas iremos mostrar algoritmos
utilizados para solucionar o problema de descontaminação e descrever a base do sistema
robótico que será implementado para realizar a “descontaminação”.
4.1 – Algoritmos distribuídos de descontaminação
Tradicionalmente o problema de descontaminação é resolvido por soluções que
utilizam múltiplos agentes. Os tipos de soluções apresentadas podem tomar várias
formas, como algoritmos de coloração, determinação de caminhos e inundação, dentre
outros. A qualidade das soluções também é variada e pode não ser interessante para um
determinado tipo de implementação do sistema de descontaminação ou variante do
problema. Nesta sessão iremos falar sobre o algoritmo que utilizamos neste trabalho e
alguns outros exemplos de algoritmos distribuídos.
17
4.1.1 - Solução Utilizando ERA
A descontaminação baseada em reversão de arestas funciona da seguinte
maneira: Consideremos um grafo orientado aciclicamente, este apresentará pelo menos
um sorvedouro. Para cada nó sorvedouro será enviado um agente. Os nós com agentes
agora estão protegidos, suas arestas são revertidas e novos nós se tornam sumidouros.
Novamente enviam-se agentes para os nós sorvedouros e se repete os passos anteriores
até que o grafo inteiro tenha sido ocupado.
Um agente deve continuar ativo até o momento que todos os nós vizinhos ao nó
que esteja ocupando tenham sido descontaminados. Depois disso o agente pode ser
desativado ou realocado para um novo nó sorvedouro.
É aqui que entra o fato de suas arestas serem orientadas e o Escalonamento por
reversão de arestas contribuem para a solução do problema. Quando há uma reversão de
arestas apenas nós vizinhos ao nó que está sendo descontaminado podem se tornar
sorvedouros. Desse modo os próximos nós que serão ocupados são nós que contribuirão
para a proteção total do nó que reverteu arestas e para a liberação do agente posicionado
nele.
Pelo fato da orientação ser acíclica todos os nós se tornarão sorvedouros em
algum momento e só se tornarão sorvedouros uma segunda vez quando todos seus
vizinhos tiverem sido ocupados ou descontaminados. Desse modo um nó já ocupado se
tornar um sorvedouro pode ser observado como um critério para saber este já foi
descontaminado.
4.1.2 – Outras soluções utilizando agentes distribuídos
Pelo grande número de variantes do problema de descontaminação, apesar de
serem encontrados vários estudos sobre o assunto, poucas soluções propostas se
enquadram na variante que estamos explorando. Outras soluções, apesar de se
enquadrarem, foram desenvolvidas para casos ou topologias (tipos de grafos)
específicos e não podem ser reaproveitadas. Ainda assim foram encontrados alguns
outros algoritmos de descontaminação que podem ser considerados.
18
Um deles se baseia em escolher um nó base e a partir dele decompor o grafo em
“caminhos”, isso é, remover arestas até que não haja nenhum tipo de ciclo no grafo (um
ciclo não orientado, um caminho que retorna de um nó sem passar repetidamente em um
mesmo outro nó, que nem uma situação com um anel no grafo). Para cada “caminho” é
alocado um agente (ou dois agentes dependendo da variante do problema de
descontaminação) que irão fazer a limpeza de cada caminho (considerando as restrições
do grafo original para saberem quando podem se mover).
Outro algoritmo se baseia em descontaminar uma subseção do grafo [8], manter
agentes nos nós que ainda tiverem vizinhos contaminados e depois alocar mais agentes
para limpar outra subseção. Normalmente o número de agentes alocados representa o
tamanho da subseção que se deseja limpar.
Um terceiro algoritmo é o de descontaminação por inundação [11]. Neste caso
um agente é movido para um nó inicial. Depois disso outros agentes são alocados em
nós vizinhos ao nó previamente ocupado. Os agentes em nós descontaminados são então
liberados e novos agentes são alocados em todos os nós vizinhos (que estejam
contaminados) de nós protegidos.
4.2 – Plataforma Robótica
Esse projeto irá desenvolver uma plataforma robótica física na qual possamos
programar os robôs para que resolvam o problema de descontaminação em uma região
delimitada.
O sistema distribuído que será implementado será formado pelos robôs e por um
computador cujos únicos objetivos são inicializar os robôs com as informações
necessárias do sistema para que estes possam efetuar a limpeza e servir de canal de
comunicação. O sistema também não apresentará uma central de controle ou
coordenação como no caso de configurações mestre-escravo. O sistema apresentará
controle altamente distribuído sem diferença de hierarquia, isto é, não haverá um
dispositivo que avisa para os outros quando agirem e que desse modo controla o que
deve ser feito e como. Ao invés disso cada um dos robôs apresentará capacidade de
19
interpretar o estado atual do sistema e decidir se é momento de agir e qual ação deve ser
tomada.
O ambiente discretizado citado se refere a uma grid preta com linhas de 1 cm de
espessura, sobre uma superfície branca e lisa e com as linhas e colunas um pouco
estendidas como é mostrado na figura 4.1. Cada cruzamento da grid representará uma
posição discretizada no espaço. Ou seja, corresponderá a uma região do ambiente que
está sendo simulado, podendo representar uma sala, parte de um cômodo ou parte de um
corredor. Dois cruzamentos adjacentes na grid indicam dois espaços adjacentes no
ambiente simulado.
Figura 4.1: Grid de movimentação dos robôs
Adicionalmente não será implementado, no primeiro momento, movimentação
paralela dos robôs. Os quais se movimentarão um de cada vez.
4.2.1 – Robôs
Os robôs utilizados são de um kit de desenvolvimento para educação chamado
“Beauto Rover” da empresa Vstone. Apresentam dois motores DC e um
microprocessador ARM montados em uma base perfurada (figura 4.2). Adicionalmente
a montagem que será utilizada usará um transmissor bluetooth e três conjuntos
emissor/sensor de infravermelho, sendo dois presos na parte dianteira do robô e um no
20
lado direito do robô na altura da roda, o que pode ser observado nas figuras 4.3 e 4.4.
Os sensores dianteiros serão utilizados para implementar um seguidor de linha e o
lateral para identificar quando o robô passar sobre uma linha transversal à que está
seguindo. Desse modo o robô pode navegar sobre a grade determinando que chegou a
uma nova posição (cruzamento) pelo sensor lateral. A rotação é feita pelo mesmo
processo, o robô se rotaciona quando está sobre um dos cruzamentos das grades e
identifica o giro de 90 graus quando o sensor lateral passa sobre a linha da grade. Por
causa da limitação de sensores os robôs atualizam sua posição de forma relativa à sua
posição anterior e sua orientação na grade, sendo necessário inicializar esses valores e
posicionar o robô de acordo na grade.
Figura 4.2: Detalhes do robô Beauto Rover, trás
21
Figura 4.3: Detalhes do robô Beauto Rover, frente
Figura 4.4: Detalhes do robô Beauto Rover, fundo
22
4.2.2 – Plataforma de programação
O programa dos robôs foi desenvolvido na IDE LPCXpresso que é uma IDE de
C e C++ especializada para micro controladores. Para a comunicação foi desenvolvido
um outro código, inicialmente em Java e posteriormente em C, que conecta aos robôs
via bluetooth e gerencia a comunicação entre eles. Adicionalmente, como os robôs não
apresentavam uma interface de texto para debug rápido, foi desenvolvido também um
código em C++ que simula os robôs e reproduzia o código em C implementado no
LPCXpresso.
A implementação do código separado para gerenciar a comunicação dos robôs
se deu por uma limitação ainda não bem determinada, ou do hardware ou do código,
disponível para controle do hardware de bluetooth. Por qualquer que seja a origem da
dificuldade, o adaptador bluetooth disponível era capaz apenas de agir como servidor,
mas não como cliente bluetooth. Na programação de bluetooths, o servidor é aquele que
gera um serviço ou conexão para que outros dispositivos, os clientes, se conectem nele.
Isso quer dizer que os robôs não eram capazes de reconhecer os dispositivos de
comunicação dos outros e nem se conectarem a eles.
Para solucionar essa situação foi desenvolvido um código que funcionaria como
um canal de comunicação entre os robôs. Esse programa faz o reconhecimento de todos
os dispositivos bluetooth dos robôs e se conecta a eles, depois repassa as mensagens que
recebesse de cada robô para o robô destinatário correto. Dessa forma a comunicação
seria implementada e o programa não influenciaria no nível de distribuição de controle
do sistema.
O código foi implementado inicialmente em Java (durante a maior parte do
desenvolvimento essa versão foi utilizada) e mais tarde re-implementado em C
utilizando a biblioteca Bluez. A mudança de linguagem se deu por algumas limitações
inesperadas que apareceram e não se conseguiu corrigir. Algumas destas limitações
incluíam a capacidade de se comunicar apenas com 3 robôs por vez e a demora para
conexão.
Já o desenvolvimento do simulador se deu por dois motivos. O primeiro foi a
ausência de uma interface de texto para debug rápido nos robôs. O segundo era a
23
demora para conexão bluetooth e movimentação dos robôs. Um único teste poderia
demorar um tempo elevado, principalmente quando a bateria dos robôs estava fraca,
com uma média de dois minutos nos testes mais simples. Assim, considerando que as
simulações levam apenas alguns segundos para rodar e geram logs com facilidade, foi
desenvolvido um código em C++ que simula os robôs e reproduz o código em C
implementado no LPCXpresso. Deste modo foi possível testar o funcionamento correto
do código que seria utilizado nos robôs.
4.3 – Metodologia Experimental
A primeira parte do trabalho foi focada no desenvolvimento do código de
controle dos robôs (incluindo o de simulação). Esse código foi testado para diversos
tipos de grafos que englobam todos os estados ou situações possíveis entre 2, 3 ou 4
robôs (número suficiente para gerar todas as configurações necessárias). Para cada grafo
testado foram comparadas as movimentações simuladas com as dos robôs e com as
movimentações esperadas.
Os testes utilizando robôs foram feitos sobre uma grade de 7x5, demarcada com
linhas pretas de 1cm de espessura. Nessa grade cada um dos cruzamentos representa
uma região discreta do espaço e será representada por um dos nós dos grafos de
caminho e contaminação.
Na segunda parte, os códigos dos robôs e de simulação foram modificados para
utilizarem outras implementações dos algoritmos de orientação inicial dos grafos,
determinação do robô com prioridade e seleção do próximo nó a ser ocupado. Com isso
observamos se o código dos robôs pode ser modificado com facilidade para serem
reutilizados no futuro e faremos a comparação de desempenho dos diferentes
algoritmos.
24
Capítulo 5
Código e Comportamento dos Robôs
Neste capítulo apresentamos alguns detalhes do código de comportamento dos
robôs, como os robôs utilizam o algoritmo de escalonamento por reversão de arestas
para determinar a movimentação e das informações básicas que devem ser distribuídas
entre eles.
5.1 - Algoritmos e estruturas de dados para implementação dos robôs
Para o sistema robótico solucionar corretamente o problema de descontaminação
de grafos, é necessário determinar a ordem através da qual os nós deste sistema devem
ser descontaminados, qual robô deve se mover para cada nó, garantir a movimentação
dos robôs sem colisões ou erros de navegação e que cada robô não abandone um nó que
ainda possa ser recontaminado (evitando que todo o trabalho de descontaminação seja
desfeito, mantendo a monotonicidade da resposta). Para isso precisamos que cada robô
tenha uma compreensão correta do estado do grafo (quais nós estão ocupados,
contaminados, descontaminados) e da relação do grafo com a região física que deve ser
descontaminada (qual região equivale a cada no do grafo). Adicionalmente é necessário
que estes sejam capazes de se comunicar com os outros robôs para atualizar suas
informações sobre a descontaminação de novos nós do grafo e que identifiquem qual
robô deve seguir para o próximo nó a ser descontaminado (para garantir que não hajam
colisões por dois robôs tentarem ocupar o mesmo nó ou que um nó acabe por não ser
descontaminado).
Isso, no ponto de vista dos robôs, quer dizer que um robô deve saber se é sua vez
de agir (e ainda nesse ponto se pode deixar sua posição), para onde deve seguir, qual
caminho tomar até lá e deve ser capaz de receber atualizações sobre o estado global do
sistema. Para tal, cada robô apresenta um dispositivo de comunicação bluetooth e tem
conhecimento de três grafos: o Grafo de Prioridades que representa todos os robôs e
indica seu status de livre/protegendo uma região, o Grafo de Contaminação [3] que
representa a relação entre os nós (indicando quais regiões podem recontaminar outras
25
regiões) e o Grafo de Caminhos [3] que indica a relação de passagens físicas entre as
regiões (quais regiões tem portas ou passagens entre si).
O Grafo de Caminhos é um grafo não orientado no qual cada nó equivale a uma
posição física discreta, podendo representar uma sala ou área delimitada. As arestas
representam passagens entre essas regiões, como portas, buracos ou apenas
continuidade espacial. Já o Grafo de Contaminação é um grafo orientado que é
atualizado pelo uso do ERA. Ele é o grafo que representa em si o problema de
descontaminação que deve ser resolvido. Ele indica também o estado de um dado nó. Se
este se encontra contaminado, protegido ou descontaminado e se há um robô presente
nele e neste caso qual robô. Adicionalmente o Grafo de Contaminação pode ser igual ao
Grafo de Caminhos, mas não necessariamente, entretanto os dois devem ter algum tipo
de relação entre os seus nós e o Grafo de Contaminação deve sempre ter um número de
nós igual ou menor ao do Grafo de Caminho.
Por fim o Grafo de Prioridades é um grafo completo (todos os seus nós estão
conectados a todos os outros nós) com arestas duplas orientadas e que é atualizado
utilizando o algoritmo ERAh. Cada um de seus nós representa um robô, sendo que nós
que estão ativos representam robôs livres para se moverem, nós hibernando representam
robôs que estão em regiões que não estão protegidas contra recontaminação e o nó
sorvedouro (nessa montagem apenas um nó por vez é capaz de ser um sorvedouro)
representa o robô com prioridade, isso é, o robô que deve se mover até o próximo nó a
ser ocupado.
Desse modo cada robô utilizará o grafo de prioridades para determinar se é sua
vez de tomar ação. Em seguida utilizará o grafo de contaminação para determinar a
posição para a qual deve se mover e o grafo de caminhos para determinar o caminho
pelo qual deve se mover para chegar a posição desejada.
Com essas informações em foco, o programa dos agentes foi dividido em quatro
partes, a primeira é a de inicialização das variáveis do robô e orientação do grafo de
contaminação. A segunda controla a movimentação e comunicação do robô, tratando do
funcionamento do hardware. A terceira parte é composta pelos grafos de caminhos, de
contaminação e de prioridades e determina a compreensão do robô quanto ao ambiente
e quais ações devem ser tomadas. A quarta parte é composta por variáveis internas e
26
lógica de tratamento de mensagens, mudança de estados e representa o comportamento
ou inteligência do robô. Essa última parte é a que interpreta as informações da segunda
parte e com base nelas utiliza os comandos da primeira parte para executar as
movimentações.
Integrando as quatro partes o código final apresenta a seguinte estrutura:
Pseudocódigo da organização do código do Robô
No ponto de vista do robô pode-se dizer que este é dividido em 4 módulos. Um
de boot e inicialização, um que implementa as ações que o robô deseja tomar (controle
de hardware), um que determina onde deve direcionar seus esforços (determinar qual o
próximo nó a ser ocupado) e outro que determina que tipo de ação deve tomar (deve se
mover, esperar, etc.).
5.2 - Algoritmo de comportamento dos Robôs
No pseudocódigo da sessão anterior nos referimos a estados do robô. Um robô
pode estar em um de seis estados que indicam diferentes comportamentos que este pode
apresentar:
Inicializando: Estado no qual o robô está recebendo as informações do
problema, inicializando variáveis e orientando o grafo de contaminação. Este
estado transita apenas para o estado de espera quando a inicialização de
variáveis termina.
Inicializar variáveis internas e buffer bluetooth;
Ler buffer bluetooth até receber informações do grafo (numero nós, nó de entrada, posição
dos nós na grade);
Ler buffer bluetooth até todos os dados do grafo serem transferidos;
Inicializar grafo de caminhos, grafo de contaminação;
Orientar o grafo de contaminação e determinar o número de robôs que serão necessários;
Inicializar grafo de prioridades;
Iniciar variáveis do robô;
Em quanto numeroDeNósDescontaminados for diferente de numeroDeNósDoGrafo
{
Verificar se há uma nova mensagem;
Tratar mensagens (depende do estado do robô);
Executar ações do estado;
}
27
Espera: Estado no qual o robô não tem prioridade para agir e está em uma
posição (nó do grafo) já descontaminada. Este estado pode transitar para o
estado Movimentando quando o robô receber a prioridade ou para o estado
Ajudando quando o robô receber a mensagem de pedido de ajuda.
Movimentando: Estado no qual o robô tem prioridade para agir e está trocando
de posição até chegar na posição equivalente ao nó objetivo (próximo nó a ser
descontaminado). Esse estado pode transitar para o estado Hibernando quando
o robô se mover para a posição objetivo e o nó equivalente no grafo de
contaminação não estiver seguro contra recontaminação, para o estado Espera
quando o robô se mover para a posição objetivo e o nó equivalente no grafo de
contaminação estiver seguro contra recontaminação ou para o estado Pedindo
Ajuda caso o caminho para o nó objetivo esteja obstruído por um robô.
Hibernando: Estado no qual o robô se encontra em uma posição (nó no grafo)
que pode ser recontaminada. Equivale a situação de um nó guardado do
problema de descontaminação. Esse estado pode transitar para o estado Espera
quando o nó equivalente a sua posição estiver protegido contra recontaminação
no grafo de contaminação ou para o estado Ajudando caso receba uma
mensagem de pedido de ajuda.
Pedindo Ajuda: Estado no qual o robô passa para a posição que outro robô está
ocupando e transforma o robô ajudante no robô ativo. É dividido internamente
em cinco sub-estados: Pedido Feito, Pedido Aceito, Reposicionado, Espera_PA
e Resposta Ajudados. Esse estado pode transitar para o estado Hibernando ou
Espera dependendo de se a posição ocupada estará protegida contra
recontaminação quando o nó objetivo for ocupado. Seu funcionamento será
descrito em mais detalhes na sessão 5.3.
Ajudando: Estado no qual o robô se torna ajudante do robô ativo e passa a agir
como o robô ativo. O robô deixa sua posição atual que é ocupada pelo robô ativo
(robô ajudado) e passa a se mover até a posição objetivo. Esse estado pode
transitar para o estado Hibernando ou Espera dependendo de se a posição
ocupada estará protegida contra recontaminação quando o nó objetivo for
ocupado ou para o estado Pedindo Ajuda caso o caminho para posição objetivo
esteja obstruído por outro robô. Seu funcionamento será descrito em mais
detalhes na sessão 5.3.
28
O diagrama de estados correspondente pode ser observado na figura 5.1.
Figura 5.1: Diagrama de estados
5.3 – Troca de tarefas
A escolha do uso da grid se deu pela simplicidade dos robôs e a complexidade
que seria implementar um controle de posicionamento mais livre (que foi determinado
como um projeto a parte). Essa escolha fez com que as posições discretas se tornassem
atômicas, isso é, apenas um robô conseguiria estar em uma posição discreta. Se um
cruzamento representasse uma sala apenas um robô poderia estar na sala. Isso não afeta
a resolução do problema de descontaminação, mas tem grande impacto na
movimentação dos robôs. Nessa montagem um robô não consegue passar por uma
29
posição na qual outro robô esteja parado, o que é uma situação inevitável nesse tipo de
problema.
Esta limitação foi a que mais impactou o projeto, sendo necessário criar um
conjunto de comportamento mais complexo para lidar com ela. Esse novo
comportamento foi baseado em torno de uma funcionalidade nomeada como troca de
tarefas e é implementada utilizando os estados Ajudando e Pedindo Ajuda. A idéia por
trás da troca de tarefas é a de que quando um robô se encontra na situação em precisa
passar por uma posição ocupada, este faz um pedindo para o outro robô trocar de função
com ele. Nesse caso o outro robô passaria a se mover em direção à posição objetivo e o
robô que fez o pedido se posicionaria na posição na qual o outro robô estava. Para tal
foram desenvolvidas seis mensagens para implementar essa funcionalidade, sendo que
uma delas, a de negação de pedido, não é utilizada, apesar de que seria importante para
um caso mais desenvolvido no qual múltiplos robôs se movessem ao mesmo tempo.
O algoritmo para a troca de tarefas é descrito a seguir:
Pseudocódigo básico do pedido de troca de tarefas e do estado ‘Pedindo Ajuda’.
Pedido de troca de tarefas é feito.
Esperar recebimento da mensagem de confirmação.
Passar para o estado Pedindo Ajuda.
Esperar recebimento da mensagem de reposicionamento do outro robô.
Se mover para a posição do próximo robô.
Mandar mensagem de reposicionamento para robô ajudante.
Se estiver ajudando um outro robô e não tiver mandado mensagem de
reposicionamento para o outro robô.
{
Mandar mensagem de reposicionamento para robô ajudado.
Esperar mensagem de reposicionamento do robô ajudado.
}
Esperar mensagem de posicionamento do robô ajudante.
Enviar para todos os robôs mensagem de posicionamento.
Sair do estado Pedindo Ajuda.
30
Pseudocódigo básico de quando se recebe um pedido de troca de tarefas e do
estado ‘Ajudando’.
Com isso diversos robôs podem trocar de tarefa e realizar um único
deslocamento que precisaria passar por diversas posições ocupadas. O fato do robô que
pediu a troca de tarefas indicar seu reposicionamento apenas quando o robô a quem
pediu a troca de tarefas indica que se posicionou faz com que o algoritmo de
determinação de prioridades só mude o robô ativo depois que a posição objetivo já tiver
sido ocupada. Essa funcionalidade cria um pouco de diferença entre as escolhas dos
algoritmos de determinação de prioridades, mas mantém seus funcionamentos corretos.
Adicionalmente este pode ser adaptado , com poucas modificações, para um caso com
múltiplos agentes se movendo ao mesmo tempo.
5.4 – Algoritmos de determinação de prioridade
Determinação de prioridade é como nos referimos à parte da inteligência do
robô que reconhece qual robô (ele próprio ou outro) que deve se movimentar para o nó
Pedido de troca é recebido.
Enviar mensagem de confirmação do pedido de troca.
Passar para o estado de Ajudando.
Determinar caminho até o objetivo.
Repetir até pedir ajuda ou chegar ao objetivo.
{
Checar se próxima posição do caminho está ocupada.
Se próxima posição estiver ocupada
{
Enviar pedido de ajuda.
Passar para o caso no qual está pedindo ajuda.
}
Posicionar-se na próxima posição do caminho.
Se não tiver mandado mensagem de reposicionamento.
{
Mandar mensagem de reposicionamento para robô
ajudado.
Esperar mensagem de reposicionamento do robô
ajudado.
}
}
Mandar mensagem de que se posicionou no objetivo.
Sair do estado Ajudando.
31
que deve ser ocupado. Esta determinação pode ser feita considerando proximidade do
nó ou até mesmo apenas qual robô livre apresenta um id com maior valor. A seguir são
apresentados dois algoritmos para determinação de prioridades que foram utilizados nos
testes com os robôs.
5.4.1 – Determinação de prioridades utilizando ERAh
A determinação de qual robô deve se mover para o próximo nó utilizando ERAh
funciona da seguinte forma: Considerando um grafo completo de arestas duplas
orientado aciclicamente, este apresentará pelo menos um nó que seja um sorvedouro. O
nó que for um sorvedouro corresponde ao robô que deve se mover para o próximo nó a
ser descontaminado. Esse robô tem a prioridade de se mover em relação a todos os
outros robôs. Quando o robô descontaminar o nó que deveria ocupar, este reverte as
arestas duplas do nó que equivale a ele. Isso fará com que outro nó se torne um
sorvedouro indicando o próximo robô a ter prioridade.
Figura 5.2: Exemplo de um grafo completo funcionando com ERAh
32
Esse funcionamento pode ser observado na figura 5.2 na qual um grafo completo
de cinco nós tem inicialmente um nó como sorvedouro em (a). Esse nó representa o
robô ativo, quando este robô se reposiciona este reverte suas arestas passando para a
configuração (b). Em (b) outro nó se torna um sorvedouro, indicando que um outro robô
passa a ser o robô ativo (com prioridade para se movimentar para o nó que deve ser
ocupado no momento). O processo se repete passando para as configurações (c), (d) e
(e) e em um dado momento chegando em (f) que representa uma volta à configuração
(a). Por sua vez cada configuração apresenta apenas um sorvedouro, ou seja, apenas um
robô que detêm a prioridade para se mover.
Entretanto o comportamento dos nós do grafo duplo é um pouco mais complexo.
Caso o robô (que o nó representa) se mova para um nó do grafo a ser descontaminado
que ainda tenha um vizinho que não foi ocupado (como deve ser a maior parte dos
casos), este reverte suas arestas, entrando em estado de hibernação do ERAh. Caso o nó
para o qual o robô se moveu seja um nó no qual todos os seus vizinhos já estejam
ocupados, este simplesmente reverte suas arestas sem entrar em hibernação. Caso um de
seus vizinhos que esteja hibernando esteja em um nó que agora tenha todos seus
vizinhos ocupados ou descontaminados, deve-se reverter a aresta para ele, fazendo-o
despertar da hibernação. Caso o robô esteja em hibernação e seu último vizinho
contaminado tiver sido ocupado, este irá ter a aresta de recurso compartilhada
apontada para si e sairá da hibernação, revertendo a orientação de todas as suas outras
arestas .
O comportamento de entrada e saída de hibernação pode ser observado na figura
5.3. Nas passagens dos momentos (a) para (b), (b) para (c) e (c) para (d), os nós
sorvedouros passam para a hibernação indicando que o robô que representam está
guardando um nó contra recontaminação. Nas passagens de (c) para (d) e (d) para (e),
um ou mais nós são tirados da hibernação, indicando que os nós em que seus
respectivos robôs se posicionaram foram completamente descontaminados. Esses robôs
agora passam a estar livres para se mover para outra posição e isso é indicado pelo nó
que o representa voltar para o estado de ativo.
33
Figura 5.3: Exemplo da dinâmica do ERAh no Grafo de Prioridades em uma situação de
descontminação
Com isso o robô implementa o algoritmo de ERAh corretamente no Grafo de
Prioridades e os robôs com prioridade podem ser facilmente determinados observado o
sorvedouro. O fato do grafo ser completo faz com que sempre haja apenas um
sorvedouro mesmo com múltiplos nós ativos.
Uma característica interessante do algoritmo de ERAh é que este também pode
ser implementado nos agentes como um algoritmo de troca de mensagens fazendo com
que cada robô não precise conhecer todo o Grafo de Prioridades para poder saber
quando agir e podendo guardar as informações necessárias em uma estrutura de dados
bem mais simples. Isso faria com que o número de mensagens trocadas entre os agentes
para determinação do robô com prioridade fosse diminuindo em determinados
momentos. Infelizmente esse fato não pode ser aproveitado na implementação nos
robôs. Isso porque, para os robôs manterem atualizadas as informações de quais
posições foram ocupadas, estes necessitam sempre receber mensagens sobre avisos de
movimentação, as quais já trazem a informação que o ERAh necessita para operar.
34
5.4.2 – Determinação de prioridades utilizando duas listas
Outra opção de algoritmo para determinação de prioridades seria a de utilizar
duas listas ordenadas de robôs. Uma lista de agentes ativos e outra de agentes ocupados
(hibernando no algoritmo de ERAh). O primeiro robô da lista de agentes ativos seria o
robô com prioridade. Quando um robô ocupa um nó que ainda tenha algum vizinho
contaminado este é movido para o final da lista de agentes ocupados. Do mesmo modo,
quando o último nó vizinho contaminado de um nó é ocupado, move-se o robô
posicionado neste nó para o fim da lista de agentes ativos. Caso haja mais de um robô
nessa condição, estes são passados para a lista de agentes ativos na ordem em que
aparecem na lista de agentes ocupados. Esse algoritmo, além de mais simples, também
utiliza uma estrutura de dados bem mais simples que o baseado em ERAh e apresenta
funcionamento similar para o caso de ERAh grafo completo.
5.5 - Algoritmos utilizados para a determinação do movimento
Determinação de movimento, ou seleção de próximo nó, é como nos referimos à
parte da inteligência do robô que indica qual deve ser o próximo nó a ser
descontaminado. Aqui apresentamos dois algoritmos para seleção de próximo nó que
foram utilizados nos testes com os robôs.
5.5.1 – Seleção de próximo nó usando ERA
Utilizamos uma pequena variação do algoritmo de Escalonamento por Reversão
de Arestas para se determinar a próxima posição a ser ocupada. Como comentado em
2.1, o algoritmo de Escalonamento por Reversão de Arestas pode ser utilizado para se
determinar quais nós devem ser descontaminados. Este algoritmo garante que um nó
que está sendo protegido por um robô não será elegível para ser ocupado por outro robô
enquanto não for completamente decontaminado (só será novamente um sumidouro
quando todos seus vizinhos estiverem ocupados ou descontaminados). Um nó (que
equivale a uma região física a ser descontaminada) é elegível como ponto a ser ocupado
35
se este for um sorvedouro (sink) no Grafo de Contaminação, ou seja, tiver todas as suas
arestas apontadas para si.
Note que ser um sorvedouro não indica que o nó deve ser ocupado, mas apenas
que é elegível para ser ocupado e atuar (reverter as arestas). Deve-se também determinar
se o nó está no estado contaminado ou se já foi descontaminado ou ocupado.
Quando um nó for ocupado, por sua vez, este irá reverter a direção de todas as
suas arestas, fazendo com que novos nós se tornem sorvedouros. Adicionalmente o robô
que se posicionou nele indicará para os outros robôs que ocupou uma nova posição
(enviando uma mensagem de movimentação). Ao fazer isso, o grafo de prioridades,
utilizado para determinar qual será o próximo robô a se mover, também é atualizado.
No grafo de prioridades o nó que for um sorvedouro representa o robô que deve
se movimentar. Quando o robô equivalente mandar uma mensagem indicando que
chegou à posição que deveria, é analisado se aquela posição tem algum vizinho
desocupado e contaminado. Em caso positivo, é considerado que o robô passa para o
estado de hibernação, senão se mantém em estado ativo. O grafo de prioridades é então
atualizado de acordo com o novo estado.
As diferenças entre o algoritmo implementado e outras variantes arbitrárias do
ERA são basicamente duas. Primeiramente, os sorvedouros não revertem a direção de
suas arestas (atuam) todos ao mesmo tempo, representando a limitação de um único
robô se movendo por vez. E que dentre os sorvedouros aquele que será o próximo a ser
ocupado é o que apresentar em ordem os seguintes atributos:
1. Ter o menor número de vizinhos em estado contaminado.
2. Ter o maior número de vizinhos já ocupados.
3. Ter o maior número de vizinhos.
4. Ter o maior ID.
Com isso cada vez que um nó é ocupado um novo conjunto de sorvedouros é
formado e um deles é selecionado como a posição objetivo. O robô que estiver marcado
com prioridade no grafo de prioridades passa então a se movimentar para a posição
objetivo.
36
Nos referiremos a esse algoritmo como algoritmo de seleção por desempate.
5.5.2 – Seleção de próximo nó usando decomposição lambda
Um segundo algoritmo de determinação do próximo nó a ser ocupado foi
implementado. Este é baseado na decomposição por sumidouros descrita anteriormente.
Nesse algoritmo os nós na camada λ0 são marcados e selecionados um a um usando os
mesmos critérios de seleção do algoritmo anterior de apresentar em ordem os atributos:
1. Ter o menor número de vizinhos em estado contaminado.
2. Ter o maior número de vizinhos já ocupados.
3. Ter o maior número de vizinhos.
4. Ter o maior ID.
Apenas após todos serem ocupados é que as arestas são revertidas determinando
novos sorvedouros que podem ser selecionados como posição objetivo. Isso equivale a,
na decomposição por sorvedouros, reverter as arestas de todos os nós na primeira
camada e então passar os nós da segunda camada para a primeira.
Nos referiremos a esse algoritmo como algoritmo de seleção por decomposição
lambda.
5.6 - Algoritmo de determinação de caminho
Para a determinação de qual caminho um robô deve tomar para chegar à posição
referente ao nó que deve ser ocupado. Para tal foi implementado um algoritmo de busca
baseado em inundação de grafos. Nesse algoritmo o nó inicial é o nó que equivale à
posição na qual o robô se encontra. O pseudocódigo do algoritmo está descrito a seguir:
37
Algoritmo para determinação de caminho.
O funcionamento desse algoritmo pode ser observado também na figura 5.2.
Aqui o agente se encontra incialmente no nó 4 (nó inicial marcado por P) e deseja
chegar no nó 2 (nó objetivo marcado com X). Desse modo ele manda mensagens para
seus vizinhos que marcam qual nó lhes enviou a mensagem. Isso se repete até o nó X
receber a mensagem. O caminho é então reconstruindo verificando-se quais os nós que
enviaram as mensagens.
Lista_de_busca é uma lista de nós vazia.
Lista_caminho é uma lista de nós vazia.
Nó_inicial é o nó no qual o robô está posicionado.
O nó atual recebe o valor do nó_inicial.
Repetir até um vizinho ser o nó objetivo.
{
Do nó atual todos os seus vizinhos que não estão
marcados são marcados com o ID do nó e adicionados a
lista_de_busca.
Caso um de seus vizinhos seja o nó objetivo saia do
loop.
O próximo nó da lista de busca é selecionado como nó
atual.
}
Adicionar o nó objetivo na lista_caminho.
Nó_atual recebe o nó objetivo.
Repetir até o nó_inicial ser adicionado à lista_caminho.
{
Adiciona o nó com o id que foi marcado no nó_atual
no início de lista_caminho.
Nó_atual recebe o nó com id que está marcado em si.
}
Limpar a marcação em todos os nós.
38
Figura 5.4: Funcionamento de um algoritmo de busca por inundação de grafos
5.7 – Troca de informações
Lembrando que, como os robôs representam um sistema distribuído e de
controle descentralizado (não existe um agente coordenador no sistema), é de suma
importância garantir que todos tenham acesso ao estado atual grafo (tanto que tenham a
mesma informação, quanto que esta informação esteja correta), ou pelo menos das
partes em que devem atuar. Caso não tenha essa informação atualizada, um robô pode
tomar decisões incorretas como achar que não pode deixar sua posição ou achar que um
robô que não está presente esteja em seu caminho.
No ponto de vista dos robôs, seu trabalho está terminado quando todos os nós do
grafo estão descontaminados. Do mesmo modo, observando o estado dos nós do grafo,
estes sabem que podem se movimentar ou se devem permanecer guardar uma posição.
Desse jeito os robôs compreendem parcialmente o problema de
contaminação/descontaminação, sabendo que não estão livres para se movimentar caso
o nó que estejam ocupando não tenha seus vizinhos ocupados ou descontimanados
(exceto no caso de um “pedido de ajuda” de outro robô, como definido na sessão
39
anterior). Entretanto estes não apresentam sensores complexos que obtenham esse tipo
de informação. São capazes apenas de determinar sua própria posição utilizando sua
posição atual (inicializada quando ligamos os robôs) e os movimentos que fazem. Desse
modo dependem que outros robôs informem suas posições atuais para que saibam quais
nós estão ocupados e como devem agir.
Logo, para garantir que todos os robôs tenham o mesmo conjunto de
informações e sejam capazes de articular-se corretamente, devemos definir um conjunto
de protocolos ou mensagens para que estes comuniquem a outros robôs onde se
encontram ou que determinadas ações ou tarefas foram concluídas. Considerando as
limitações físicas do sistema e que os algoritmos de decisão de movimentação são
implementações do algoritmo de ERA, foram implementadas as seguintes mensagens:
Movimentação: Mensagem enviada quando um robô para em uma nova
posição. Esta mensagem não é enviada quando um robô chega em uma posição
qualquer, mas sim apenas quando chega a uma posição final. Indica que um nó
foi ocupado.
Pedido de ajuda: É a mensagem enviada quando um robô chega na situação
limite de precisar passar por uma posição ocupada por outro robô para chegar ao
seu nó objetivo. É enviada para o robô que está “no caminho” e necessita de
uma resposta de aceitação. Caso aceito, o robô que enviou a mensagem de
pedido de ajuda passa para o estado “SENDO AJUDADO” e o robô que
confirmou a ajuda passa para o estado “AJUDANDO”. Sua utilização é
mostrada nos pseudocódigos da sessão 5.3.
Mensagens para ajuda: Mensagens que tratam da situação limite no qual um
robô está pedindo ajuda para outro. Estas são divididas em 5 subtipos:
confirmação, negação, conclusão, liberação e ocupação. A dinâmica básica
dessas mensagens é descrita nos pseudocódigos da sessão 5.3.
Dados de inicialização: Mensagem que contém apena dados para serem
utilizados na inicialização dos grafos.
40
5.8 - Algoritmo de orientação inicial dos grafos
Como foi dito anteriormente, o algoritmo de ERA depende de uma orientação
acíclica das arestas do grafo. Não só isso, mas é a orientação inicial que determina a
ordem em que os nós se tornarão sorvedouros. No problema analisado isso representa a
ordem em que as regiões serão ocupadas para descontaminação. Muitos dos algoritmos
para orientação de grafos são baseados em sorteios de valores para cada um dos nós e
orientação dos nós de acordo com esses valores. Esse tipo de algoritmo pode apresentar
melhoras em algumas características das orientações finais, incluindo a concorrência,
mas não é interessante para nossa implementação onde os robôs são mantidos com o
mesmo nível de hierarquia e funcionalidades. Isso porque não temos um robô que
determina a orientação dos grafos e depois a repassa para os outros robôs (mesmo que
isso seja possível), mas todos os robôs individualmente determinam qual é a orientação
correta que devem seguir. Além disso o algoritmo apresenta outras limitações: o nó de
entrada é pré-especificado, a solução final de descontaminação deve ser monotônica e
tentar minimizar o número de robôs necessários e apenas nós que não tenham nenhum
vizinho no grafo de caminhos ocupado por um agente não podem ser sorvedouros.
Além disso, para garantir que as orientações do Grafo de Contaminação em cada
robô sejam as mesmas (isso é, as informações em cada robô são iguais) o algoritmo de
orientação do grafo deve ser determinístico. Aqui apresentamos dois algoritmos para
gerar a orientação inicial de grafos que foram utilizados nos testes com os robôs.
5.8.1 – Algoritmo de orientação acíclica inicial por desempate
O algoritmo de orientação acíclica inicial por desempate foi montado tendo em
vista todas as limitações impostas para a orientação do grafo. O pseudocódigo do
algoritmo está descrito a seguir.
41
Algoritmo de orientação do Grafo de Contaminação.
Desse modo a orientação montada tenta ocupar o mais rápido possível nós que
descontaminem outros nós protegidos ou que precisem de menos agentes para serem
descontaminados, diminuindo assim o número de agentes necessários para
descontaminação total do grafo.
Nos referiremos a esse algoritmo como algoritmo de orientação por desempate.
5.8.2 – Algoritmo de orientação acíclica inicial por pseudo
decomposição em sorvedouros
Um segundo algoritmo de orientação determinístico também foi implementado.
Neste segundo algoritmo o nó de entrada é pré-determinado e todas suas arestas são
Orientar todos as arestas do nó de entrada para o nó de entrada.
Adicionar a lista de nós candidatos todos os vizinhos do nó de entrada conectados
no Grafo de Caminho.
Inicializar s contadores do total de 1 agente e 0 agentes livres.
Número de iterações = 1;
Repetir até a lista de candidatos estar vazia ou ao numero de iterações ser igual ao
número de nós:
{
Verificar a lista de nós candidatos:
{
Determinar os nós com menor número de vizinhos desocupados.
Caso haja empate determinar o com maior número de vizinhos.
Caso haja empate determinar o com maior número de vizinhos não
ocupados que também são vizinhos no Grafo de Caminho.
Caso haja empate escolher o nó com menor id.
}
Remover o nó escolhido da lista de candidatos.
Orientar as arestas não orientadas do nó escolhido para ele.
Adicionar os nós vizinhos do nó escolhido que também são vizinhos do nó
equivalente no Grafo de Caminhos à lista de candidatos.
Caso haja agentes livres número de agentes livres é decrementado em 1, caso
contrário número total de agentes é incrementado em 1.
Para cada um dos vizinhos do nó escolhido:
{
Caso esteja ocupado e todos os seus vizinhos tenham sido ocupados
número de agentes livres é incrementado em 1;
}
}
42
orientadas para si. Depois disso todos seus vizinhos são postos em uma lista. Esta lista
contém todos os nós vizinhos de nós que já tiveram suas arestas orientadas. Depois
disso para cada nó na lista se verifica se um de seus vizinhos também está na lista. Caso
haja vizinhos na lista, um destes é selecionado utilizando os seguintes critérios:
1. Ter o menor número de vizinhos em estado contaminado.
2. Ter o maior número de vizinhos já ocupados.
3. Ter o maior número de vizinhos.
4. Ter o maior ID.
O nó que não foi selecionado é marcado como não elegível na rodada. Depois de
passar por todos os nós na lista os nós que não foram marcados têm suas arestas não
orientadas direcionadas para si, são removidos da lista e seus vizinhos no Grafo de
Caminhos que não tiveram todos os seus nós direcionados ainda são adicionados à lista
e os nós que foram marcados como não elegíveis na rodada são desmarcados. O
processo é repetido até que todos os nós tenham tido todas suas arestas orientadas.
43
Algoritmo alternativo de orientação do Grafo de Contaminação.
Nos referiremos a esse algoritmo como algoritmo de orientação por pseudo
decomposição em sorvedouros.
5.9 – Análise dos resultados
Primeiramente foi verificado o funcionamento correto do sistema, tanto em
deslocamento correto dos robôs quanto em seleção correta e coerente de quais nós
Orientar todas as arestas do nó de entrada para o nó de entrada.
Adicionar à lista de nós candidatos todos os vizinhos do nó de entrada conectados
no Grafo de Caminho.
Inicializar os contadores do total de 1 agente e 0 agentes livres.
Número de iterações = 1;
Repete até o número de iterações ser igual ao número de nós:
{
Repete até a lista de candidatos estar vazia
{
Verificar a lista de nós candidatos:
{
Determinar os nós com menor número de vizinhos
desocupados.
Caso haja empate determinar o nó com maior número de
vizinhos.
Caso haja empate determinar o nó com maior número de
vizinhos não ocupados que também são vizinhos no Grafo de Caminho.
Caso haja empate escolher o nó com menor id.
}
Marcar o nó escolhido como orientado.
Remover o nó escolhido da lista de candidatos.
Orientar as arestas não orientadas do nó escolhido para ele.
Remover os vizinhos do nó escolhido que também estão na lista de
candidatos da lista de candidatos.
Caso haja agentes livres número de agentes livres é decrementado
em 1, caso contrário número total de agentes é incrementado em 1.
Incrementar o número de iterações em 1.
}
Adicionar os nós que já têm alguma aresta orientada mas não foram
marcados como orientados à lista de candidatos.
}
44
devem ser ocupados. As figuras 5.5, 5.6, 5.7 e 5.8 mostram quatro momentos do
funcionamento do sistema na descontaminação de um grafo.
Figura 5.5: Exemplo do sistema robótico em funcionamento no step 0
Figura 5.6: Exemplo do sistema robótico em funcionamento no step 9
45
Figura 5.7: Exemplo do sistema robótico em funcionamento no step 21
Figura 5.8: Exemplo do sistema robótico em funcionamento no step 23
O sistema foi testado para oito casos distintos, nos quais se esperava verificar
todas as transições de estados e tipos de relação entre nós. Os robôs tanto completam
corretamente os deslocamentos no grafo (considerando as delimitações do problema)
quanto determinam corretamente a ordem de ocupação dos nós.
Após a implementação e teste do sistema dos robôs reprogramamos os robôs a
fim de explorar a dificuldade de reutilização do código dos robôs e os diferentes
algoritmos de orientação acíclica de grafo, determinação do robô com prioridade e
escolha do próximo nó a ser ocupado. As combinações desses algoritmos geraram oito
variantes de códigos para os robôs, exploramos assim algumas variantes de
46
comportamento dos agentes e analisamos os quais tendiam a apresentar um número
menor de agentes. Os algoritmos usados para gerar as variantes foram: o algoritmo de
determinação de prioridades utilizando ERAh, algoritmo de determinação de
prioridades utilizando duas listas, algoritmo de seleção por desempate, algoritmo de
seleção por decomposição lambda, algoritmo de orientação por desempate e algoritmo
de orientação por pseudo decomposição em sorvedouros. Cada variante foi montada
utilizando um algoritmo de orientação acíclica inicial, um algoritmo de determinação de
prioridade e um algoritmo de seleção do próximo nó.
Tabela 5.1 – Composição das combinações de algoritmos
Algoritmo Variante Combinação
1 2 3 4 5 6 7 8
Orientação
Acíclica Inicial
Desempate X X X X
Pseudo
Decomposição em
Sorvedouros
X X X X
Seleção de
Prioridade
ERAh X X X X
2 Listas X X X X
Seleção do
Próximo Nó
Desempate X X X X
Decomposição
Lambda X X X X
As combinações foram montadas como demarcadas em cada coluna da tabela
5.1 e nomeadas de 1 a 8. As combinações são respectivamente:
Variante 1: algoritmo de orientação por desempate com algoritmo de
determinação de prioridades utilizando duas listas e algoritmo de seleção
por desempate.
Variante 2: algoritmo de orientação por pseudo decomposição em
sorvedouros com algoritmo de determinação de prioridades utilizando
duas listas e algoritmo de seleção por desempate.
47
Variante 3: algoritmo de orientação por desempate com algoritmo de
determinação de prioridades utilizando ERAh e algoritmo de seleção por
desempate.
Variante 4: algoritmo de orientação por pseudo decomposição em
sorvedouros com algoritmo de determinação de prioridades utilizando
ERAh e algoritmo de seleção por desempate.
Variante 5: algoritmo de orientação por desempate com algoritmo de
determinação de prioridades utilizando duas listas e algoritmo de seleção
por decomposição lambda.
Variante 6: algoritmo de orientação por pseudo decomposição em
sorvedouros com algoritmo de determinação de prioridades utilizando
duas listas e algoritmo de seleção por decomposição lambda.
Variante 7: algoritmo de orientação por desempate com algoritmo de
determinação de prioridades utilizando ERAh e algoritmo de seleção por
decomposição lambda.
Variante 8: algoritmo de orientação por pseudo decomposição em
sorvedouros com algoritmo de determinação de prioridades utilizando
ERAh e algoritmo de seleção por decomposição lambda.
Para cada caso (grafo a ser descontaminado) rodado foram computados diversos
fatores, como o número de robôs utilizados, se houve algum robô recebendo prioridade
muito mais vezes do que outros, o número médio de movimentos por robô e o número
de pedidos de ajuda que foram feitos. No fim do levantamento de dados se determinou
que os fatores que realmente diferenciavam as combinações de algoritmos eram o
número de robôs utilizados e o total de passos dados. Ao total foram analizadas 19
situações diferentes.
5.9.1 – Sobre o número de agentes
De forma geral, nos casos simulados, os algoritmos se comportaram de forma
similar. Desse modo, o número de agentes utilizados em cada caso tenderam a serem
iguais ou apenas dois valores diferentes (não foram observados casos em que cada
algoritmo utilizou um número diferente de robôs nem que houveram três valores
48
diferentes para o número de robôs utilizados). Os valores levantados podem ser vistos
na tabela 5.2. Dentre as combinações de algoritmos testadas as que apresentaram mais
vezes um número inferior de agentes (7 vezes) e menos vezes um número superior de
agentes (2 vezes) foram as combinações: 1, 3 (algoritmo de seleção por desempate e
orientação por desempate tanto com o uso do ERAh quanto das duas listas para
estrutura de dados de prioridade) e a combinação 5 (algoritmo de seleção por
decomposição lambda e orientação com seleção por desempate utilizando as duas listas
como estrutura de determinação de prioridade).
Tabela 5.2 – Contagem de robôs utilizados por cada combinação em cada caso de teste
Caso de
teste
Combinação
1 2 3 4 5 6 7 8
1 4 4 4 4 4 4 4 4
2 2 2 2 2 2 2 2 2
3 3 3 3 3 3 3 3 3
4 3 3 3 3 3 3 3 3
5 3 3 3 3 3 3 4 4
6 4 4 4 4 4 4 4 4
7 5 5 5 5 5 5 5 5
8 4 3 4 4 4 3 4 4
9 4 5 4 5 4 5 4 5
10 8 8 8 8 6 6 6 6
11 6 6 6 6 6 6 6 6
12 4 6 4 6 4 6 4 6
13 3 3 3 3 3 4 4 4
14 3 3 3 3 3 4 3 4
15 3 3 3 3 3 3 3 3
16 5 5 5 5 5 5 5 5
17 5 5 5 5 7 7 7 7
18 5 5 5 5 5 5 5 5
19 4 5 4 5 4 5 4 5
Total 78 81 78 82 78 83 80 85
A combinação que apresentou o maior número de agentes utilizados foi a
combinação 8 (algoritmo de seleção por decomposição lambda com orientação por
desempate utilizando o ERAh para determinação do agente com prioridade). Este
49
apresentou um número superior de agentes em 8 casos e um número inferior em apenas
1 caso.
5.9.2 – Sobre o número de passos
Considerando as distâncias totais percorridas pelos robôs (considerando que
todas as posições têm mesma distância para todos os seus vizinhos) a combinação 1
(algoritmo de seleção por desempates e orientação por desempate com o uso das duas
listas) foi a que apresentou menor número de passos (percorreu assim menor distância)
no geral. Já a combinação 6 (algoritmo de seleção por decomposição lambda e
orientação por decomposição de sumidouros utilizando as duas listas) foi a que
apresentou maior número de passos dados pelos robôs. Esta seleção foi uma das que
mais alocou agentes, mesmo não tendo sido a combinação que mais alocou. Os valores
levantados podem ser vistos na tabela 3.
Tabela 5.3 – Número total de passos dado por todos os robôs em cada caso de teste
usando cada combinação de algoritmos
Caso de
teste
Combinação
1 2 3 4 5 6 7 8
1 19 20 20 20 19 20 20 20
2 11 11 11 11 11 11 11 11
3 8 8 8 8 8 8 8 8
4 17 17 17 17 17 17 17 17
5 17 17 17 17 17 17 18 18
6 29 30 29 30 32 33 32 33
7 27 27 27 27 27 27 27 27
8 20 19 20 21 18 21 22 23
9 20 20 20 20 20 20 20 20
10 69 69 75 75 69 70 69 70
11 65 65 67 67 79 79 69 69
12 28 37 28 37 30 37 30 37
13 30 30 30 30 30 36 36 36
14 30 30 30 30 30 36 30 36
15 27 27 27 27 27 27 27 27
16 16 16 16 16 16 16 16 16
17 31 31 30 30 30 29 29 29
18 32 33 34 35 36 35 34 33
19 20 21 20 22 20 21 20 22
Total 516 528 526 540 536 560 535 552
50
5.9.3 – Comparação das combinações de algoritmos
Dentre as combinações que utilizaram o menor número de agentes, a
combinação 1 (algoritmo de seleção por desempates e orientação por desempate com o
uso das duas listas) também foi a com menor número acumulado de passos e a que
apresentou menor número de passos na maior parte dos casos (não simplesmente teve
um caso testado em que desempenhou muito melhor do que os outros). Assim a
combinação 1 se mostrou superior às outras . Já a combinação 5 (algoritmo de seleção
por decomposição lambda e orientação com seleção por desempate, utilizando as duas
listas como estrutura de determinação de prioridade) foi a que apresentou maior número
de passos entre as três combinações com menor número de agentes alocados, se
mostrando menos eficiente que as combinações 1 e 3.
Já a combinação 8 se mostrou a menos eficiente em termos de alocação de
agentes, sendo a que utilizou mais agentes. A combinação 6, por sua vez, não utilizou
um número tão elevado de agentes quanto a 8, mas apresentou menor eficiência no uso
de cada agente, computando um maior total de passos.
51
Capítulo 6
Conclusão
Neste trabalho apresentamos o problema de descontaminação e as características
de uma implementação em agentes robóticos que executam uma solução para este.
Adicionalmente descrevemos algumas possíveis variações nos algoritmos e estruturas
de dados principais dos agentes robóticos e comparamos seus desempenhos. Ainda
assim, o dado mais importante foi o levantamento das dificuldades e fatores extras que
devem ser relevados na implementação física dos agentes.
6.1 – Contribuições
O sistema final, englobando grade impressa, conjunto de robôs montados, e
código para os robôs e simulador reconfiguráveis, foi completado e pode ser usado
como base para testar e comparar novos algoritmos já considerando as restrições de uma
implementação física. O sistema deve ficar a disposição no Laboratório de Inteligência
Artificial para desenvolvimento de projetos futuros.
6.2 – Trabalhos Futuros
O próximo passo para progredir o tema seria a criação de um conjunto de
protocolos e mensagens para a movimentação correta de vários robôs ao mesmo tempo.
No momento o sistema pode representar o resultado equivalente a uma movimentação
múltipla, mas não a simula nem a recria tratando sua complexidade. A movimentação
paralela dos agentes é uma das características mais interessantes de um sistema de
robótica coletiva e por isso seria muito desejável que seja implementada e que os
aspectos necessários para sua implementação sejam mapeados.
52
Bibliografia
[1] CARVALHO, D., PROTTI,FABIO, GREGORIO, MASSINO DE, FRANÇA,
FELIPE M. G., A novel distributed scheduling algorithm for resource sharing
under near-heavy load. Lecture Notes in Computer Science, v.3544, p. 431-442,
2005.
[2] FOMIN, FEDOR V., THILIKOS, DIMITRIOS M., An annotated bibliography on
guaranteed graph searching. Theoretical Computer Science, v.399, n.3, p.236-245,
June 2008.
[3] ALVES DS, SOARES EE, STRACHAN GC, CARVALHO GP, XAUD MF,
COUTO MV, MENDONÇA RM, FREITAS RS, SANTOS TM, GONÇALVES
VC, MOURELLE LM, NEDJA N, MACULAN N, LIMA PM, FRANÇA FM. A
Swarm Robotics Approach to Decontamination. Mobile Ad Hoc Robots and
Wireless Robotic Systems: Design and Implementation: Design and
Implementation. 2012 Dec 31:107.
[4] VANESSA CARLA F. GONÇALVES, FELIPE M. G. FRANÇA, NELSON
MACULAN, PRISCILA M. V. LIMA, SER-Based Web Graph Decontamination.
First Worskhop INCT WebScience, PUC-RIO.
[5] DANIEL SANTOS FERREIRA ALVES, Extensões para o Mecanismo ERA
aplicado a Descontaminação de Grafos. Trabalho de conclusão de curso (Instituto
de Ciência da Computação) da Universidade Federal do Rio de Janeiro, Maio 2011.
[6] DIEGO MOREIRA DE ARAUJO CARVALHO, Escalonamento distribuído por
reversão de arestas com reconfiguração dinâmica de carga. M.Sc. dissertation,
COOPE/Universidade Federal do Rio de Janeiro, Maio 2004.
[7] VANESSA CARLA FELIPE GONÇALVES, Descontaminação distribuída de
grafos. M.Sc. dissertation, COOPE /Universidade Federal do Rio de Janeiro, Junho
2011.
[8] JOHN PENUEL, J. COLE SMITH, SIQIAN SHEN, Integer Programming Models
and Algorithms for the Graph Decontamination Problem with Mobile Agents.
Journal Networks, v.61, n.1, p. 1-19, January 2013.
[9] JIE CAI, PAOLA FLOCCHINI, NICOLA SANTORO, Distributed Black Virus
Decontamination and Rooted Acyclic Orientations. CIT/IUCC/DASC/PICom 2015:
1681-1688.
[10] ALVES, DANIEL S. F., GONÇALVES, VANESSA C. F., LIMA, PRISCILA M.
V., MACULAN, NELSON, França, Felipe M. G., G-DI: a Graph Decontamination
Iterator for the Web. ACM Web Science 2011, 2011, Koblenz Proceedings of the
ACM WebSci’11, 2011, p. 1-4.
53
[11] FLOCCHINI,, Paola, HUANG, MIAO JUN, LUCCIO, FLAMINIA L.,
Decontamination of Hypercubes by Mobile Agents. Jurnal Networks v. 52(n. 3),
p.167-178, October 2008.