Algoritmos de Grafos e
Patrulha Multiagente
Prof. Pablo Azevedo Sampaio Tópicos Avançados em Inteligência Artificial Universidade Federal Rural de Pernambuco
Objetivos
• Apresentar diversos problemas de grafos e seus algoritmos
• Foco naqueles que são (ou podem ser)
usados em soluções da Patrulha Temporal (MATP)
• Apresento algumas soluções da MATP da literatura
Técnicas Básicas
• Veremos dois algoritmos para percorrer o grafo
– Pesquisa em profundidade – para percorrer em uma ordem qualquer, com mínimo backtracking
– Pesquisa em extensão – para percorrer um “nível” por vez, partindo de um nó s
Pesquisa em Profundidade
• Cada vértice pode estar em um desses estados
– Branco: não-visitado
– Cinza: pesquisa iniciada – Preto: pesquisa terminada
• Vamos usar as seguintes variáveis
– cor[u] –explicado acima
Pesquisa em Profundidade
• Pseudo-código:
DFS-VISIT(grafo G, vértice u)
cor[u] = CINZA;
para cada v de Adj[u] if cor[v] = BRANCO ante[v] = u;
DFS-VISIT(G,v); cor[u] = PRETO;
Pesquisa em Profundidade
• Se o grafo for desconectado ou se não for
fortemente conectado, é necessário iniciar
várias vezes
DFS-START(grafo G, vértice s)
para todo vértice v cor[v] = BRANCO ante[v] = -1
Pesquisa em Profundidade
• Ao final, o array ante[ ] define uma floresta
– Pode variar, conforme a ordem de análise dos vizinhos
Pesquisa em Extensão
• Iniciada em um vértice s (start) qualquer
• Visita todos os vértices de distância k, depois todos os de distância k+1
• Visita todos vizinhos de s
– Depois todos os vizinhos desses vizinhos
Pesquisa em Extensão
(continuação..)
while ( !Empty(Q) ) u = Dequeue(Q);
para cada v na lista Adj[u] if (cor[v] == BRANCO) cor[v] = CINZA; ante[v] = u; d[v]=d[u]+1; Enqueue(v, Q); cor[u] = PRETO;
Pesquisa em Extensão
• O array ante[ ] define a árvore de caminhos mais
curtos (em quantidade de arestas) partindo de s
– O array d[u] guarda a menor distância de s até cada nó u
• Exemplo com s=1: 1 4 2 5 6 3 1 2 4 5 6 3
Principais Problemas e
Algoritmos
Motivação
• Google Maps
– Como achar o menor caminho entre dois endereços? – Tratando como um grafo
• Nós: início, fim e cruzamentos • Arestas: trechos de ruas
• Peso da aresta: distância
Caminhos Mais Curtos (ou
Menos Custosos)
• Problema análogo ao que é resolvido pela
Pesquisa em Extensão
• Porém, considera os custos/pesos das arestas
• Veremos dois algoritmos
– Dijkstra: caminhos de s a todos os outros nós – Floyd-Warshall: todos os menores caminhos
Algoritmo de Dijkstra
• É uma generalização da Pesquisa em
Extensão
• Porém, Q é uma fila de prioridade, onde as chaves são as distância de s até cada nó
– Array c[x]: custo do caminho de s a x
Algoritmo de Dijkstra
• Pseudo-código (loop principal)
– RELAX(x,vi,p) tenta reduzir o caminho (de s) para vi
• Testa se s...x + xvi é melhor que o caminho atual
(...)
while ( !Empty(Q) )
x = Remove-Min(Q);
para cada vizinho vi ligado com peso p
RELAX(x,vi,p)
Algoritmo de Floyd-Warshall
• Baseado em programação dinâmica • Laço principal:
para cada nó k //para cada intermediário
para cada nó i //para cada origem
para cada nó j //para cada destino
if ((c[i,k] + c[k,j]) < c[i,j]) c[i,j] = c[i,k] + c[k,j];
Motivação
• Projeto de Circuitos Eletrônicos
– Um conjunto de pinos podem ser ligados de diferentes maneiras
– As ligações têm custos distintos
– Como interligar os pinos com custo mínimo?
Árvores Espalhadas
• Definição: subgrafo conectado acíclico que interliga todos os vértices do grafo
• Em inglês: Spanning Tree
– Outras traduções: Árvores Geradoras, Árvores de Amplitude
• A árvore espalhada mínima de um grafo é a menos custosa das suas árvores espalhadas
Algoritmo de Prim
• Tem um vértice de início s
– Pouco interfere no resultado
• Muito parecido com o Dijkstra, mas, ao tomar um nó x e atualizar os custos dos
vizinhos vi, ele usa só o custo da aresta x-vi
– Não soma com o caminho anterior!
Árvore Espalhada Mínima
Motivação
• Cidade de Königsberg em 1736:
– É possível fazer um caminho que passe por cada ponte da cidade uma única vez?
Ciclo Euleriano
• Ciclo que atravessa exatamente uma vez cada aresta do grafo
• Condições necessárias e suficientes para um grafo não-direcionado G ser Euleriano:
– G é um grafo conectado – Todo nó tem grau par
• Existem algoritmos lineares para achar este ciclo!
Motivação
• Situação: um almoço em que nem todos os convidados se conhecem
– Modelar como um “grafo de amizades”
• É possível dispor todos ao redor de uma mesa de modo que cada pessoa fique
sentada ao lado de dois conhecidos (um em cada lado)?
Ciclo Hamiltoniano
• Ciclo que passa exatamente uma vez por cada vértice do grafo
• Problema NP-Completo!
• Vamos falar de um problema mais geral a seguir...
Motivação
• Há um conjunto de cidades, todas acessíveis entre si por rodovias
• Como um vendedor pode passar por todas elas uma única vez e voltar para a cidade inicial?
Caixeiro-Viajante (TSP)
• Problema de achar o ciclo hamiltoniano de custo mínimo em um grafo completo
• Também é NP-Completo!
• Vários algoritmos aproximados e heurísticos
Algoritmo Aproximado Baseado em
MST
• Descrição de alto nível:
– Constrói a árvore espalhada mínima (MST) – Faz uma DFS nela
– Cria atalhos para “saltar” nós já visitados
Algoritmo de Christofides
• Melhoria do anterior:
– Constrói a MST
– Adiciona arestas nos nós de grau ímpar (com o mínimo custo) – Constrói um ciclo euleriano
• No pior caso, a solução é 50% maior que a ótima
Outros
• Problema do Caixeiro-Viajante com Múltiplas
Visitas (TSPM)
– Permite passar mais de uma vez por nó – Podem ser aplicadas soluções do TSP
• Aplicar o Floyd-Warshal e usar os caminhos como se fossem arestas (vira um grafo completo)
• Problema do Carteiro Chinês
– Generalização do problema de achar um ciclo euleriano para grafos com pesos
– Permite atravessar mais de uma vez cada aresta, porém deseja-se minimizar o custo dessas repetições
Soluções da MATP
• Vamos falar de soluções (estratégias) da MATP que são fortemente dependentes de conceitos e algoritmos de grafos
Algoritmos Já Apresentados Revistos
• Abordagens swarm
– BaloonDFS
• Implementa uma pesquisa em profundidade (DFS) em tempo real – PVAW1, EVAW, EVAW+
• Convergem para um ciclo hamiltoniano (com repetição de nó, em alguns casos)
• Soluções baseadas em construir caminhos
– Almeida et. al – HPCC
Chevaleyre et al. (2003)
• Para 1 agente, provou que:
– O ciclo de solução do TSP é a solução ótima da MATP na métrica de intervalo máximo (Imax)
• Para n agentes, provou que:
– Dentre as soluções baseadas em partições disjuntas (pré-fixadas),
– A solução ótima (na métrica Imax) consiste em usar os
Chevaleyre et al. (2003)
• Para n agentes: solução Single Cycle (SC)
– Obtém uma solução para o TSP • Algoritmo de Christofides
– Distribui os agentes de forma eqüidistante no ciclo – Eles percorrem o ciclo em uma mesma direção
Elmaliach, Shiloni, Kaminka (2007)
• Basicamente, propôs algoritmos polinomiais baseados na mesma idéia da SC
• Porém, aplicam-se apenas a certo tipo simples de grafo
– Grids de dimensões pares, com pesos
• Algoritmos propostos
– Para calcular o ciclo (resolver o TSP) – Para distribuir os agentes rapidamente
Elmaliach, Shiloni, Kaminka (2007)
• Algoritmo para calcular o ciclo
– Calcula dois grids amplos
• Um com arestas no sentido horário e outro no sentido anti-horário
• Cada célula representa um quadrado 2x2 • Pesos definidos por uma conta esquisita – Depois, acha o MST do grid amplo
– Cria um ciclo no grid original meramente “contornando” a árvore espalhada
Portugal e Rocha (2011)
• Solução GMSP
– Calcula partições balanceadas do grafo
– Dentro da partição, cada agente segue um caminho
principal, que pode ser:
• Um ciclo ou caminho euleriano • Um ciclo ou caminho hamiltoniano
• Ciclo com mais da metade dos nós (alg. próprio) • Caminhos mais longo (alg. próprio)