Universidade Federal do ABC
Centro de Matematica, Computacao e Cognicao (CMCC)
Curso de Pos-Graduacao em Ciencia da Computacao
Dissertacao de Mestrado
Andreia Cristina dos Santos Gusmao
UM ALGORITMO PARALELO PARA CICLOS HAMILTONIANOS EM GRAFOS
KNESER
Santo Andre - SP
2013
Curso de Pos-Graduacao em Ciencia da Computacao
Dissertacao de Mestrado
Andreia Cristina dos Santos Gusmao
UM ALGORITMO PARALELO PARA CICLOS HAMILTONIANOS EM GRAFOS
KNESER
Trabalho apresentado como requisito
parcial para obtencao do tıtulo de
Mestre em Ciencia da Computacao, sob
orientacao da Professora Doutora Letı-
cia Rodrigues Bueno e do Coorienta-
dor Professor Doutor Rodrigo de Alen-
car Hausen.
Santo Andre - SP
2013
Este exemplar foi revisado e alterado em relacao a versaooriginal, de acordo com as observacoes levantadas pela banca nodia da defesa, sob responsabilidade unica da autora e com aanuencia de sua orientadora.
Santo Andre, 22 de junho de 2013.
Assinatura da autora:
Assinatura da orientadora:
Andreia Cristina dos Santos Gusmao
UM ALGORITMO PARALELO PARA CICLOS HAMILTONIANOS EM GRAFOS
KNESER
Essa Dissertacao de Mestrado foi jul-
gada e aprovada para a obtencao do grau
de Mestre em Ciencia da Computacao no
curso de Pos-Graduacao em Ciencia da
Computacao da Universidade Federal do
ABC.
BANCA EXAMINADORA
Profa. Dra. Letıcia Rodrigues Bueno
CMCC/UFABC
Prof. Dr. Ademir Aparecido Constantino
DIN/UEM
Prof. Dr. Raphael Yokoingawa de Camargo
CMCC/UFABC
Prof. Dr. Candido Ferreira Xavier de Mendonca Neto
EACH/USP
Prof. Dr. Jair Donadelli Junior
CMCC/UFABC
Santo Andre - SP
2013
ii
Este trabalho contou com auxılio financeiro da Universidade Federal do ABC – UFABC
(bolsa de mestrado, institucional), de maio/2011 a janeiro/2013 e da Coordenacao de
Aperfeicoamento de Pessoal de Nıvel Superior – CAPES (bolsa de mestrado, demanda
social), de fevereiro/2013 a maio/2013.
iii
Dedico aos meus pais, Cida e Juraci pelo
amor incondicional e ao meu primo querido
Neliton Gusmao, que tao jovem foi morar
com Deus.
iv
Agradecimentos
A Deus, por me dar forca, coragem, paciencia e por ter sido meu fiel companheiro e
me livrado de todo o mal, em todas as noites nesses dois anos em que voltei para casa
sozinha, depois de um dia de muita luta e trabalho.
A minha famılia que amo muito, em especial a minha mae Cida e ao meu pai Ju-
raci Gusmao, que sofreram com minha ausencia, vibraram com cada vitoria e atraves
de oracoes, secaram cada lagrima que derramei nos momentos mais difıceis. Pai, mae:
mestres sao voces, que me ensinaram a viver com humildade e dignidade.
A minha irma Micheli Gusmao que amo tanto, que mesmo de longe torceu por mim e
que muitas vezes, nao conseguiu compreender minha ausencia, e; ao meu primo querido
Neliton Gusmao, que teve a alegria em ver iniciando o mestrado, mas que o destino nao
permitiu que estivesse aqui hoje. Certamente foi meu anjo protetor em todos os momentos.
A minha orientadora Letıcia Rodrigues Bueno e ao meu coorientador Rodrigo de Alen-
car Hausen, por terem acreditado em mim, pelo esforco que fizeram para que cada trabalho
fosse realizado com sucesso. Obrigada por toda a orientacao, pela paciencia e por terem
confiado em mim um trabalho tao importante e tao difıcil. Minha eterna gratidao a voces,
que me ajudaram a crescer nao so profissionalmente, mas tambem como ser humano.
A todos os professores do Centro de Matematica, Computacao e Cognicao (CMCC),
em especial a Karla Vittori, Raphael Camargo, Siang Song, Daniel Martin, Ronaldo Prati
e Andre Balan, que foram tao importantes no processo da minha formacao. E ao professor
Francisco Zampirolli, com o qual tive a honra de trabalhar durante um quadrimestre e
que muito me ensinou.
Ao meu amigo Wellington Santos, por ter sido a primeira pessoa a me ajudar quando
me mudei para Sao Paulo.
Ao meu amigo e irmao Paulo Cesar Angelo, pessoa incrıvel, que nao conseguiria descre-
ver com poucas palavras. Voce foi meu alicerce nos momentos que mais me senti sozinha,
longe da minha famılia.
A minha amiga Silvia Scheunemann, amiga para todas as horas. Juntas choramos,
sorrimos, brincamos, aprendemos e nos desesperamos. Dois anos vividos intensamente,
v
onde a superacao e a amizade foram fundamentais para seguir a diante.
A minha amiga Sheila leal, por todos os momentos descontraıdos, pelas brincadeiras
e pelo carinho constante. Agradeco tambem a todos os colegas do curso de Ciencia da
Computacao da turma de 2011, que juntos, formamos uma so famılia no laboratorio 407-2.
Aos meus eternos amigos do INPETTECC, Colegio Objetivo e Eleven Tecnologia de
Pouso Alegre - MG, que sempre torceram por mim, em especial ao Elton Rodrigo de Souza,
obrigada por toda a compreensao; Tatiane Nunes, por estar presente nos momentos que
mais precisei; Jeane Rodrigues, por todo o carinho nesses longos anos; Cassandra Heringer,
pela forca e pelo carinho, voce nao sabe o quanto foi importante saber que posso contar
com voce e; Marilene Moreira e Silvia Silva, por todo o cuidado e atencao que sempre
tiveram por mim.
A Universidade Federal do ABC e a CAPES, pelo investimento financeiro, sem o qual,
seria impossıvel eu realizar esse trabalho.
A todos os funcionarios da UFABC e aos amigos de Natercia - MG, em especial ao
motorista Marcio Arantes de Freitas.
Enfim, a todos que direta ou indiretamente colaboraram para essa vitoria, meu sincero
agradecimento. Aos que acreditaram, essa vitoria e nossa. Aos que duvidaram, mostrei
que a minha forca de vontade e a minha determinacao fizeram muito mais diferenca para
chegar ate aqui, que a minha propria formacao profissional.
vi
Resumo
O grafo Kneser K(n, k) tem como vertices os subconjuntos de cardinalidade k do
conjunto {1, 2, . . . , n}. Dois vertices sao adjacentes se os subconjuntos correspondentes
sao disjuntos. O grafo Kneser bipartido B(n, k) tem(nk
)∪(
nn−k
)como seu conjunto de
vertices e dois vertices sao adjacentes se um e subconjunto do outro. Uma conjectura de
Lovasz afirma que todo grafo nao-direcionado, conexo e vertice-transitivo tem um cami-
nho hamiltoniano. Para n ≥ 2k + 1, os grafos K(n, k) e B(n, k) formam uma famılia
de grafos vertice-transitivos conexos podendo, assim, fornecer mais evidencia para apoiar
a conjectura de Lovasz ou fornecer um contra-exemplo para a mesma. Foi provado que
um caminho hamiltoniano particular em um grafo reduzido de K(2k + 1, k) leva a um
caminho e a um ciclo hamiltoniano em K(2k + 1, k) e B(2k + 1, k), respectivamente.
Propomos um algoritmo paralelo utilizando MPI para a busca destes caminhos hamilto-
nianos particulares nos grafos reduzidos. Provamos que os emparelhamentos modulares
no grafo reduzido de K(2k+1, k) determinam dk2e coberturas de vertices por ciclos disjun-
tos nestes grafos. Escolhemos aleatoriamente uma destas coberturas para ser a entrada
do algoritmo paralelo que procura concatena-los em um unico caminho. Um algoritmo
sequencial e utilizado para adicionar apropriadamente ao caminho os vertices que nao
puderam ser concatenados pelo algoritmo paralelo. Ate agora, encontramos um caminho
hamiltoniano particular no grafo reduzido de K(2k + 1, k) para k ≤ 14.
Palavras-chaves: Caminhos hamiltonianos, computacao paralela, grafos Kneser, grafos
Kneser bipartidos.
vii
Abstract
The Kneser graph K(n, k) has as vertices the k-subsets of the set {1, 2, . . . , n}. Two ver-
tices are adjacent if the corresponding subsets are disjoint. The bipartite Kneser graph
B(n, k) has(nk
)∪(
nn−k
)as its set of vertices and two vertices are adjacent if one is a
subset of the other. A conjecture of Lovasz claims that every undirected connected vertex-
transitive graph has a hamiltonian path. For n ≥ 2k + 1, the graphs K(n, k) and B(n, k)
form a family of vertex-transitive connected graphs, so they can provide more evidence to
support conjecture of Lovasz or even provide a counterexample for it. It was proved that a
specific hamiltonian path in a reduced graph of K(2k+ 1, k) gives a hamiltonian path and
a hamiltonian cycle in K(2k + 1, k) and B(2k + 1, k), respectively. We propose a parallel
algorithm using MPI to search for that specific hamiltonian path in the reduced graphs.
We prove that the modular matchings in the reduced graph of K(2k+ 1, k) determine dk2e
vertex cover by disjoints cycles. We choose randomly one of these covers as an input of
the parallel algorithm that tries to concatenate them in one path. A sequential algorithm is
used to add properly to the path the vertices that could not be concatenated by the parallel
algorithm. At the moment, we found a specific hamiltonian path in the reduced graph of
K(2k + 1, k) for k ≤ 14.
Keywords: Hamiltonian paths, parallel computation, Kneser graphs, bipartite Kneser
graphs.
LISTA DE ALGORITMOS viii
Lista de Algoritmos
1 Algoritmo SS99 para encontrar um caminho viavel em Bk . . . . . . . . . 22
2 Algoritmo BFSExtend para procurar uma ou mais sequencias de rotacoes . 23
3 Algoritmo FindPosition para encontrar a nova posicao de um vertice v ∈ Pe adjacente a q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4 Algoritmo FindVertex para encontrar um novo vertice w uma posicao apos
o vertice v . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
5 Algoritmo DoReversals para fazer rotacoes em P e ao final das rotacoes q = u 25
6 Algoritmo para determinar se dois vertices sao adjacentes . . . . . . . . . . 31
7 Algoritmo paralelo para encontrar um caminho viavel em Ok . . . . . . . . 40
8 Algoritmo sequencial para encontrar um caminho viavel em Ok . . . . . . . 41
Lista de Figuras
1.1 Um ciclo e um caminho hamiltonianos no dodecaedro. . . . . . . . . . . . . 1
2.1 Em (a) um grafo simples; Em (b) um grafo com laco e aresta paralela. . . . 3
2.2 Um grafo ponderado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.3 Grafos completos para m = 2, 3, 4, 5. . . . . . . . . . . . . . . . . . . . . . 4
2.4 Um grafo bipartido. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.5 Dois grafos isomorfos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.6 Subgrafos em um grafo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.7 Um emparelhamento em um grafo bipartido. . . . . . . . . . . . . . . . . . 5
2.8 Uma 1-fatorizacao de um grafo G: tres emparelhamentos perfeitos. . . . . . 6
2.9 Um automorfismo no grafo K3: α(1) = 2, α(2) = 3 e α(3) = 1. As
adjacencias sao preservadas. . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.10 No grafo, (v1, v2, v6, v8, v4, v2, v1) e um passeio fechado; (v1, v2, v4) e (v1, v5, v7, v8, v4)
sao dois caminhos entre v1 e v4, e; (v1, v2, v4, v3) e um ciclo. . . . . . . . . 6
2.11 (a) Um grafo G (b) Cobertura de vertices por ciclos disjuntos em G. . . . 7
2.12 (a) Um grafo conexo (b) Um grafo desconexo. . . . . . . . . . . . . . . . 7
2.13 Alguns grafos Kneser. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.14 Grafos ımpares Ok para k = 1, 2, 3. . . . . . . . . . . . . . . . . . . . . . . 8
2.15 Grafos Kneser bipartidos B(4, 1), B(5, 1) e B(6, 2). . . . . . . . . . . . . . 9
2.16 Grafos Bk para k = 1, 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.17 Grafo Kneser bipartido B2 e o grafo reduzido B2. . . . . . . . . . . . . . . 11
2.18 Em (a) o grafo reduzido O3 de O3 (Figura 2.14(c)) e em (b) um caminho
viavel em O3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.19 O grafo O3 com vertices identificados pelo representante da classe. . . . . . 13
ix
LISTA DE FIGURAS x
2.20 Os emparelhamentos modulares em B2. . . . . . . . . . . . . . . . . . . . . 14
2.21 Os (k2
= 1) 2-fatores e o emparelhamento perfeito em O2. . . . . . . . . . . 15
2.22 Diagrama de funcionamento da computacao paralela para um problema
dividido em quatro subproblemas . . . . . . . . . . . . . . . . . . . . . . . 17
2.23 Estrutura basica de um programa que use MPI . . . . . . . . . . . . . . . 19
3.1 Rotacoes em P para que o vertice 000101101 seja o ultimo vertice em P . . 27
3.2 Um caminho viavel do grafo B4 = O4. . . . . . . . . . . . . . . . . . . . . . 27
4.1 Os grafos B2, O2 e O2 em representacao binaria. . . . . . . . . . . . . . . . 32
4.2 Possıveis concatenacoes de P1 e P2 para α = 0. . . . . . . . . . . . . . . . . 36
4.3 Possıveis concatenacoes de P1 e P2 para α = 1. . . . . . . . . . . . . . . . . 36
4.4 Um exemplo de concatenacao de P1 e P2 em O4 no caso (1) com ρ = 0. . . 37
4.5 Possıveis concatenacoes de P1 e P2 no caso (2), σ(r1) ∈ P1 e α = 0. . . . . 37
4.6 Possıveis concatenacoes de P1 e P2 no caso (2), σ(r1) = v1 ∈ P1 e α = 1. . . 38
4.7 O grafo O4 e o 2-fator Π(m2) = Π(m4). . . . . . . . . . . . . . . . . . . . . 42
4.8 Caminho final P da fase paralela com 92% dos vertices de O4. . . . . . . . 43
4.9 Diagrama do algoritmo paralelo para O4 e o 2-fator Π(m2) = Π(m4). . . . 44
LISTA DE TABELAS xi
Lista de Tabelas
2.1 Numero de vertices de alguns grafos Ok, Bk e numero de arestas de Ok. . . 10
2.2 Numero de vertices de alguns grafos Ok, Bk e Ok = Bk. . . . . . . . . . . . 12
5.1 Configuracoes das Filas do Altix 4700 Bachianas utilizadas nos testes . . . 45
5.2 Resultados do algoritmo proposto para Ok e k ≤ 14. . . . . . . . . . . . . . 46
5.3 O 2-fator com melhor tempo de execucao em Ok, para 3 ≤ k ≤ 14. . . . . . 48
5.4 Resultados parciais do algoritmo proposto em Ok, para 15 ≤ k ≤ 18. . . . . 48
5.5 Tempo de execucao do algoritmo para gerar as coberturas de vertices por
ciclos disjuntos para Ok e k ≤ 17. Continuacao na Tabela 5.6. . . . . . . . 49
5.6 Tempo de execucao do algoritmo para gerar as coberturas de vertices por
ciclos disjuntos para Ok e k ≤ 17. Continuacao da Tabela 5.5. . . . . . . . 50
5.7 Comparativo de tempo de execucao entre os algoritmos para Ok ou Ok.
NC: nao consta. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.8 Comparativo do tempo de execucao entre o algoritmo GBH e nossa imple-
mentacao do algoritmo SS99 para Ok. . . . . . . . . . . . . . . . . . . . . . 51
Sumario
Lista de Algoritmos viii
Lista de Figuras x
Lista de Tabelas xi
1 Introducao 1
2 Fundamentacao Teorica 3
2.1 Definicoes em Grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2 Grafos Kneser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3 Grafos Kneser Bipartidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4 Grafos Reduzidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.5 Emparelhamentos Modulares . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.6 Ciclos e Caminhos Hamiltonianos em K(n, k) e B(n, k) . . . . . . . . . . . 16
2.7 Computacao Paralela e MPI . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3 Algoritmos para Grafos Kneser e Kneser Bipartidos 21
3.1 O Algoritmo SS99 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.2 O Algoritmo SS04 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.3 O Algoritmo SSS09 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4 Algoritmo Proposto 30
4.1 Representacao Computacional da Solucao e do Grafo Ok . . . . . . . . . . 31
4.2 Entrada do Algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
xii
SUMARIO xiii
4.3 Fase paralela . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.3.1 Inıcio do algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.3.2 Comportamento dos processos . . . . . . . . . . . . . . . . . . . . . 34
4.4 Fase sequencial para concatenacao dos prejuızos . . . . . . . . . . . . . . . 39
4.5 Exemplo de execucao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
5 Analise dos Resultados 45
6 Conclusao 52
Referencias Bibliograficas 54
Capıtulo 1
Introducao
O Problema do Ciclo Hamiltoniano (“Hamiltonian Cycle Problem”, em ingles) foi pro-
posto em 1859 por William Rowan Hamilton [13] como um jogo matematico, a princıpio
sem aplicacao pratica. Originalmente, tratava-se da busca por um ciclo gerador em um
dodecaedro regular ou, em outras palavras, um ciclo que passa por todos os pontos do
dodecaedro, exatamente uma vez, e volta ao ponto de origem.
Uma versao do problema proposto por Hamilton e o Problema do Caminho Hamil-
toniano (“Hamiltonian Path Problem”, em ingles) que pede por um caminho que passa
por todos os pontos exatamente uma vez, porem, nao volta ao ponto de origem. Veja um
exemplo no dodecaedro da Figura 1.1 (a) de um ciclo hamiltoniano e na Figura 1.1 (b)
de um caminho hamiltoniano.
(a) Um ciclo hamiltoniano (b) Um caminho hamiltoniano
Figura 1.1: Um ciclo e um caminho hamiltonianos no dodecaedro.
O problema do ciclo hamiltoniano e utilizado na definicao formal do Problema do
Caixeiro Viajante (“Travelling Salesman Problem”, em ingles). Dado um grafo completo
e ponderado G, o problema do caixeiro viajante consiste em determinar um ciclo hamil-
toniano C em G tal que a soma dos pesos de todas as arestas em C seja mınima.
Varios problemas praticos podem ser modelados atraves do problema do ciclo hamil-
toniano. Imagine, por exemplo, a confeccao de uma placa de circuito impresso que possui
inumeros furos para o encaixe de seus componentes e um braco eletronico que deve perfurar
1
CAPITULO 1. INTRODUCAO 2
a placa. Precisamos agora de um algoritmo para determinar a ordem de perfuracao da
placa com o menor custo possıvel. Essa ordem pode ser modelada como um problema do
ciclo hamiltoniano, onde os furos e a posicao inicial do braco eletronico sao representados
por vertices.
Determinar se um grafoG tem um ciclo hamiltoniano e um problema NP-Completo [16].
O problema de decisao associado ao problema do caminho hamiltoniano tambem e NP-
Completo [12]. Observe que, se temos um ciclo hamiltoniano C em um grafo G, obtemos
um caminho hamiltoniano em G simplesmente removendo uma aresta de C. Por outro
lado, mesmo se um caminho hamiltoniano e fornecido, determinar se existe um ciclo
hamiltoniano continua sendo NP-Completo [21].
Devido a dificuldade inerente a um problema NP-Completo, uma abordagem possıvel
e restringir o problema a um conjunto de entradas. A ideia e tentar resolver o problema
utilizando, para isso, as propriedades relacionadas ao conjunto de entradas.
Neste trabalho, restringimos o estudo de ciclos e caminhos hamiltonianos as classes de
grafos conhecidas como grafos Kneser e Kneser bipartidos. Propomos um algoritmo para-
lelo utilizando MPI para a busca de caminhos hamiltonianos particulares em um tipo de
grafo reduzido dos grafos Kneser e Kneser bipartidos. Provamos que os emparelhamentos
modulares nesses grafos reduzidos determinam varias coberturas de vertices por ciclos
disjuntos. Assim, escolhemos aleatoriamente uma destas coberturas por ciclos disjuntos
para ser a entrada do algoritmo paralelo.
No Capıtulo 2, apresentamos as definicoes, os conceitos e as propriedades utilizadas
no decorrer do trabalho, assim como a revisao bibliografica. No Capıtulo 3 discutimos
brevemente os algoritmos existentes para o problema do caminho e ciclo hamiltonianos
em grafos Kneser e Kneser bipartidos. O Capıtulo 4 descreve o algoritmo proposto e
no Capıtulo 5 analisamos os resultados encontrados. Finalizamos no Capıtulo 6 com a
conclusao e trabalhos futuros.
Capıtulo 2
Fundamentacao Teorica
A seguir, apresentamos os conceitos de Teoria dos Grafos que serao utilizados no decorrer
do trabalho. O leitor habituado as definicoes basicas de grafos pode ir diretamente para
a Secao 2.2.
2.1 Definicoes em Grafos
Um grafo G e um par ordenado G = (V (G), E(G)), onde V (G) e um conjunto finito e
nao vazio de elementos denominados vertices e E(G) e um multiconjunto finito de arestas
que sao pares nao-ordenados de vertices de G. Dada uma aresta e = {u, v}, os vertices u
e v sao chamados de extremos de e. Neste caso, dizemos que a aresta e e incidente a u e
v e o par de vertices u e v sao adjacentes. Dizemos ainda que duas arestas incidentes a
um vertice em comum sao arestas adjacentes.
Um grafo G e dito nao-direcionado quando suas arestas sao pares nao-ordenados de
vertices de G.
Um grafo contem arestas paralelas ou multiplas se possui arestas diferentes comparti-
lhando os mesmos extremos. Uma aresta {u, v} com vertices u e v iguais (u = v) e um laco.
Um grafo e simples se nao contem lacos nem arestas paralelas. Veja na Figura 2.1 (a), um
grafo simples com V (G) = {v1, v2, v3, v4, v5, v6} e E(G) = {e1, e2, e3, e4, e5, e6, e7, e8, e9}.Veja na Figura 2.1 (b), um grafo com arestas paralelas e um laco.
v1 v2
v3 v4
v5 v6e1
e2e3
e4
e5
e6
e7e8
e9
(a)
v1 v2
v3 v4
v5e1
e2e3
e4
e5
e6e9 e8e7
(b)
Figura 2.1: Em (a) um grafo simples; Em (b) um grafo com laco e aresta paralela.
3
CAPITULO 2. FUNDAMENTACAO TEORICA 4
Um grafo e dito ponderado se suas arestas possuem peso (Figura 2.2).
v1
v2 v3
v4
v5
v6
7
5
2
81
3 6
4
5
7
Figura 2.2: Um grafo ponderado.
O grau dG(u) de um vertice u ∈ V (G) em um grafo G e o numero de arestas de G que
incidem em u. Um grafo e chamado de regular ou q-regular se todos os seus vertices tem
o mesmo grau q.
Um grafo com m vertices e dito completo, denotado por Km, se todos os seus pares
de vertices sao adjacentes. Todo Km e (m − 1)-regular e possui(m2
)arestas. Veja na
Figura 2.3 alguns grafos completos.
v1 v2
(a) K2
v1
v2 v3
(b) K3
v1
v2 v3
v4
(c) K4
v1
v2 v3
v4 v5
(d) K5
Figura 2.3: Grafos completos para m = 2, 3, 4, 5.
Um grafo G e dito bipartido se existe uma biparticao de V (G) em dois subconjuntos
V1 e V2 tal que toda aresta e ∈ E(G) tem um extremo em V1 e o outro extremo em V2
(Figura 2.4).
V2V1
Figura 2.4: Um grafo bipartido.
Dois grafos G e H sao chamados de isomorfos se existe uma bijecao ϕ: V (G)→ V (H)
tal que u e v sao adjacentes em G se e somente se os vertices ϕ(u) e ϕ(v) sao adjacentes
em H e, neste caso, dizemos que ϕ e um isomorfismo entre G e H. Na Figura 2.5, os
mapeamentos ϕ(v1) = b;ϕ(v2) = d;ϕ(v3) = f ;ϕ(v4) = c;ϕ(v5) = e, ϕ(v6) = a formam
um isomorfismo entre G e H.
CAPITULO 2. FUNDAMENTACAO TEORICA 5
v2 v3v1
v5 v6v4
(a) Grafo G
b = ϕ(v1)ϕ(v6) = a
d = ϕ(v2)
c = ϕ(v4)
ϕ(v5) = e
ϕ(v3) = f
(b) Grafo H
Figura 2.5: Dois grafos isomorfos.
Um grafo H e chamado de subgrafo de um grafo G se V (H) ⊆ V (G) e E(H) ⊆ E(G),
denotado por H ⊆ G (veja Figura 2.6). Dizemos que H e subgrafo proprio de G se
H ⊆ G, mas H 6= G, denotado por H ⊂ G. Dado um subconjunto S tal que S ⊆ V (G),
o subgrafo de G induzido por S e o grafo G[S] que possui V (G[S]) = S e E(G[S]) =
{e ∈ E(G) : e ⊆ S}. Um subgrafo H de G e chamado induzido se H = G[S] para
algum S ⊆ V (G)(Figura 2.6 (b)). Um subgrafo H de G e chamado subgrafo induzido
se E(H) = {e ∈ E(G) : e ⊆ V (H)}. Dado F ⊆ E(G), o subgrafo de G gerado por F
e o grafo G[F ] definido como V (G[F ]) = V (G) e E(G[F ]) = F . Dizemos que H e um
subgrafo gerador de G se V (G) = V (H) (Figura 2.6 (c)).
(a) Um grafo G (b) Subgrafo induzido de G (c) Subgrafo gerador de G
Figura 2.6: Subgrafos em um grafo.
Dado um grafo G, um emparelhamento M e um subconjunto de E(G) de arestas duas
a duas nao adjacentes, denotado por M ⊆ E(G). Se todo vertice de G tem uma aresta
de M incidente a ele, M e chamado um emparelhamento perfeito. Veja na Figura 2.7 um
exemplo de emparelhamento, e na Figura 2.8, tres emparelhamentos perfeitos.
Figura 2.7: Um emparelhamento em um grafo bipartido.
A uniao de dois grafos G1 e G2 e um terceiro grafo definido por G = G1 ∪ G2, onde
V (G) = V (G1) ∪ V (G2) e E(G) = E(G1) ∪ E(G2).
Um q-fator de um grafo G e um subgrafo gerador q-regular de G. Dizemos que G e
q-fatoravel se existem q-fatores disjuntos H1, H2, . . . , Hj tais que G = H1 ∪ H2 ∪ . . . ∪
CAPITULO 2. FUNDAMENTACAO TEORICA 6
Hj. Observe que um emparelhamento perfeito e um 1-fator. Assim, por exemplo, na
Figura 2.8, os emparelhamentos perfeitos M1, M2 e M3 sao 1-fatores e formam uma 1-
fatorizacao de um grafo G.
(a) M1 (b) M2 (c) M3
Figura 2.8: Uma 1-fatorizacao de um grafo G: tres emparelhamentos perfeitos.
Um automorfismo de um grafo G e um isomorfismo de G em G, o qual pode ser
considerado uma permutacao α de V (G) que preserva as adjacencias: assim {u, v} ∈ E(G)
se e somente se {α(u), α(v)} ∈ E(G). Veja um exemplo na Figura 2.9.
1
2 3
(a) Grafo K3
2
3 1
(b) Grafo K3
Figura 2.9: Um automorfismo no grafo K3: α(1) = 2, α(2) = 3 e α(3) = 1. As adjacenciassao preservadas.
Dizemos que um grafo G e vertice-transitivo se, para todo par de vertices u, v ∈V (G), existe um automorfismo α que mapeia u em v. Dizemos que um grafo G e aresta-
transitivo se para todo par de arestas {u, v}, {x, y} ∈ E(G) existe um automorfismo α
tal que {α(u),α(v)} = {x, y}. Qualquer grafo que e vertice e aresta-transitivo e chamado
simetrico. O grafo K3 (Figura 2.9) e um exemplo de grafo simetrico.
Um passeio entre u e v em um grafo G e uma sequencia de vertices P = (u1, u2, . . . , uk)
onde u = u1, uk = v e uj uj+1 sao adjacentes para j = 1, . . . , k−1. Se u = v, dizemos que
P e um passeio fechado. Um caminho e um passeio que nao repete vertices. Um ciclo e
um passeio fechado que nao repete vertices. O comprimento de um caminho ou ciclo e o
numero de suas arestas. Um caminho ou ciclo de comprimento l e chamado um l-caminho
ou l-ciclo, respectivamente. Veja alguns exemplos na Figura 2.10.
v1 v2
v3 v4
v6
v8
v5
v7
Figura 2.10: No grafo, (v1, v2, v6, v8, v4, v2, v1) e um passeio fechado; (v1, v2, v4) e(v1, v5, v7, v8, v4) sao dois caminhos entre v1 e v4, e; (v1, v2, v4, v3) e um ciclo.
CAPITULO 2. FUNDAMENTACAO TEORICA 7
Uma cobertura de vertices por ciclos em um grafo G e um conjunto de ciclos que sao
subgrafos de G e contem todos os vertices de G. Se os ciclos da cobertura nao tem vertices
em comum, a cobertura e chamada cobertura de vertices por ciclos disjuntos. Neste caso,
o conjunto de ciclos consiste em um subgrafo gerador de G (Figura 2.11).
(a) (b)
Figura 2.11: (a) Um grafo G (b) Cobertura de vertices por ciclos disjuntos em G.
Um grafo G e dito conexo se existe um caminho entre qualquer par de vertices de G.
Se nao existe um caminho entre algum par de vertices, entao G e desconexo (Figura 2.12).
v1 v2
v3 v4
v5
(a)
v1 v2
v3 v4
v5 v6
v7
(b)
Figura 2.12: (a) Um grafo conexo (b) Um grafo desconexo.
Um caminho ou um ciclo em G e dito hamiltoniano se contem todos os vertices de
G. Por exemplo, no grafo da Figura 2.10, P = (v1, v2, v4, v3, v7, v5, v6, v8) e um caminho
hamiltoniano e C = (v1, v2, v6, v5, v7, v8, v4, v3) e um ciclo hamiltoniano. Um grafo e
hamiltoniano se contem um ciclo hamiltoniano. Um grafo G e hipohamiltoniano se G nao
e hamiltoniano mas G− v e hamiltoniano, para todo v ∈ V (G).
Na proxima secao, apresentamos as classes de grafos Kneser e Kneser bipartidos, as
quais restringimos o estudo do problema do caminho e ciclo hamiltonianos.
2.2 Grafos Kneser
Seja X um conjunto; um k-subconjunto de X e um subconjunto Y ⊆ X tal que a car-
dinalidade de Y e k. Sejam n, k inteiros tais que 1 ≤ k ≤ n. O grafo Kneser, denotado
por K(n, k), tem como vertices os k-subconjuntos de {1, 2, . . . , n}. Dois vertices sao adja-
centes se os subconjuntos correspondentes sao disjuntos. Observe que o grafo completo
em m vertices Km e o grafo K(n = m, 1) (Figura 2.14 (a)).
CAPITULO 2. FUNDAMENTACAO TEORICA 8
O grafo K(n, k) tem(nk
)vertices,
(nk
)(n−kk
)/2 arestas, e
(n−kk
)-regular, e conexo para
n > 2k e forma uma famılia de grafos simetricos. Veja alguns exemplos na Figura 2.13.
{1}
{2}{3} {4}
(a) K(4, 1)
{1, 2}{1, 4}
{1, 3}
{3, 4}{2, 3}
{2, 4}(b) K(4, 2)
{3, 4}{1, 6}{2, 3}{4, 6}{2, 5}
{4, 5}{1, 3}{5, 6}
{1, 4}
{2, 6}
{1, 5}
{2, 4}
{3, 5}{1, 2}
{3, 6}
(c) K(6, 2)
Figura 2.13: Alguns grafos Kneser.
Para n = 2k+1, o grafo Kneser K(2k+1, k) e tambem chamado o grafo ımpar [1](“odd
graphs”, em ingles), denotado por Ok, para k ≥ 1. Observe que o grafo O1 e um triangulo
e O2 e o grafo de Petersen (Figura 2.14).
{3}
{1}
{2}
(a) O1 = K(3, 1)
{1, 2}
{4, 5}
{2, 3}{1, 5}
{3, 4}
{1, 3}
{3, 5}{2, 5}
{2, 4}
{1, 4}
(b) O2 = K(5, 2)
{3, 5, 7}{1, 2, 6}
{3, 4, 7}{1, 5, 6}
{2, 3, 4}
{5, 6, 7}
{1, 2, 4}
{3, 6, 7}
{2, 4, 5}
{1, 3, 6}
{2, 4, 7}
{3, 5, 6}{1, 4, 7}
{2, 3, 5}{1, 6, 7}
{3, 4, 5}{2, 6, 7}{1, 4, 5}{2, 3, 7}{1, 4, 6}
{2, 5, 7}{1, 3, 4}
{2, 5, 6}
{1, 3, 7}
{1, 2, 3}{4, 5, 7}{2, 3, 6}
{1, 5, 7}
{2, 4, 6}
{1, 3, 5}
{4, 6, 7}
{1, 2, 5}
{3, 4, 6}
{1, 2, 7}
{4, 5, 6}
(c) O3 = K(7, 3)
Figura 2.14: Grafos ımpares Ok para k = 1, 2, 3.
2.3 Grafos Kneser Bipartidos
O grafo Kneser bipartido, denotado por B(n, k), tem(nk
)∪(
nn−k
)como seu conjunto
de vertices, e dois vertices sao adjacentes se um e subconjunto do outro. Suas arestas
CAPITULO 2. FUNDAMENTACAO TEORICA 9
representam a inclusao entre dois subconjuntos, isto e, A ( B onde A e um k-subconjunto
e B e um (n− k)-subconjunto. Veja, por exemplo, os grafos B(4, 1), B(5, 1) e B(6, 2) na
Figura 2.15.
{1}{2}{3}
{1, 2, 3}{1, 2, 4}{1, 3, 4}
{4} {2, 3, 4}(a) B(4, 1)
{1}{2}{3}
{1, 2, 3, 4}{1, 2, 3, 5}{1, 2, 4, 5}
{4} {1, 3, 4, 5}{5} {2, 3, 4, 5}
(b) B(5, 1)
{2, 6} {1, 3, 5, 6}{3, 4} {1, 4, 5, 6}
{1, 2} {1, 2, 3, 4}{1, 3}{1, 4}
{1, 2, 3, 5}{1, 2, 3, 6}
{1, 5}{1, 6}{2, 3}
{1, 2, 4, 5}{1, 2, 4, 6}{1, 2, 5, 6}
{2, 4}{2, 5}
{1, 3, 4, 5}{1, 3, 4, 6}
{4, 6} {2, 4, 5, 6}{5, 6} {3, 4, 5, 6}
{3, 5} {2, 3, 4, 5}{3, 6}{4, 5}
{2, 3, 4, 6}{2, 3, 5, 6}
(c) B(6, 2)
Figura 2.15: Grafos Kneser bipartidos B(4, 1), B(5, 1) e B(6, 2).
O grafo Kneser bipartido B(n, k) tem 2(nk
)vertices,
(nk
)(n−kk
)arestas, e
(n−kk
)-regular
e forma uma famılia de grafos simetricos. Assim como o grafo Kneser, e conexo somente
para n > 2k.
Para n = 2k+1, o grafo Kneser bipartido e chamado o grafo dos nıveis intermediarios
(“middle-levels graph”, em ingles), denotado por Bk.
{1}{2}
{3}
{1, 2}{2, 3}
{1, 3}
(a) B1 = B(3, 1)
{3, 5} {2, 4, 5}{4, 5} {3, 4, 5}
{1, 2} {1, 2, 3}{1, 3}{1, 4}
{1, 2, 4}{1, 2, 5}
{1, 5}{2, 3}{2, 4}
{1, 3, 4}{1, 3, 5}{1, 4, 5}
{2, 5}{3, 4}
{2, 3, 4}{2, 3, 5}
(b) B2 = B(5, 2)
Figura 2.16: Grafos Bk para k = 1, 2.
A Tabela 2.1 mostra o numero de vertices de alguns grafos Ok e Bk, e o numero de
arestas do grafo Ok. O numero de arestas do grafo Bk e 2|E(Ok)|. Observe que para k = 7
o numero de vertices de Bk ja e 12.870. Apenas dobrando o valor de k, ou seja, k = 14,
o numero de vertices de Bk passa a ser de 155.117.520. Portanto, uma computacao exata
de caminhos ou ciclos hamiltonianos em Ok e Bk nao e viavel para grandes valores de k.
CAPITULO 2. FUNDAMENTACAO TEORICA 10
k n |V (Ok)| =(2k+1k
)|E(Ok)| = (k + 1)
(2k+1k
)/2 |V (Bk)| = 2
(2k+1k
)1 3 3 3 62 5 10 15 203 7 35 70 704 9 126 315 2525 11 462 1.386 9246 13 1.716 6.006 3.4327 15 6.435 25.740 12.8708 17 24.310 109.935 48.6209 19 92.378 461.890 184.75610 21 352.716 1.939.938 705.43211 23 1.352.078 8.112.468 2.704.15612 25 5.200.300 33.801.950 10.400.60013 27 20.058.300 140.408.100 40.116.60014 29 77.558.760 581.690.700 155.117.52015 31 300.540.195 2.404.321.560 601.080.39016 33 1.166.803.110 9.917.826.435 2.333.606.22017 35 4.537.567.650 40.838.108.850 9.075.135.30018 37 17.672.631.900 167.890.003.050 35.345.263.80019 39 68.923.264.410 689.232.644.100 137.846.528.82020 41 269.128.937.220 2.825.853.840.810 538.257.874.440
Tabela 2.1: Numero de vertices de alguns grafos Ok, Bk e numero de arestas de Ok.
A seguir, definimos uma operacao de reducao para os grafos Kneser e Kneser bipartidos
utilizada no algoritmo proposto.
2.4 Grafos Reduzidos
Utilizamos uma operacao de reducao para os grafos Bk proposta originalmente por Moews
e Reid [24], complementada por Dejter [8] e estendida a K(n, k) e B(n, k) por Bueno et
al. [4].
Seja Zn o conjunto {1, . . . , n} com aritmetica modulo n. Consideramos cada vertice de
K(n, k) e B(n, k) como subconjunto de Zn. Definimos dois k-subconjuntos particulares
de Zn para n = 2k + 1, que sao r1 = {1, . . . , k} e r2 = {2, 4, 6, . . . , n− 1}.
Dado um conjunto v = {v1, v2, . . . , vt} ⊆ Zn e δ ∈ Zn, denote v = Zn \ v o complemento
de v em relacao a Zn e denote v + δ = {v1 + δ, v2 + δ, . . . , vt + δ} . Dizemos que u, v ⊂Zn satisfazem u ∼ v se (i) u = v+ δ ou (ii) u = v+ δ para algum δ ∈ Zn. Observe que ∼e uma relacao de equivalencia. Nos referimos a classe de equivalencia de v definida por ∼como σ(v).
Exemplo 1. Para k = 2 e n = 5, {1,5} ∼ {1,2} pois satisfazem a condicao (i) desde
que {1,2} = {1,5} + δ onde δ = 1, ou seja, somamos 1 ao subconjunto {1,5} modulo n:
5 + 1 = 6 mod n = 1 e 1 + 1 = 2, portanto {1,2}. Da mesma forma, {1,5} ∼ {1,2,3} pois
satisfazem a condicao (ii) desde que {1, 5} = {2, 3, 4}, entao {1, 5} = {1, 2, 3} + δ onde
δ = 1.
CAPITULO 2. FUNDAMENTACAO TEORICA 11
Dado um grafo G, definimos o grafo quociente G como o grafo obtido de G por identi-
ficar os vertices que sao equivalentes de acordo com ∼. Mais precisamente, os vertices de
G sao as classes de equivalencia σ(v) para v ∈ V (G) e se {u, v} ∈ E(G), entao {σ(u), σ(v)}∈ E(G). Para um exemplo aplicado a classe de grafos Kneser bipartidos, veja os grafos
B2 e B2 na Figura 2.17. Observe que se {u, v} ∈ E(G) satisfaz u ∼ v, entao o vertice σ(u)
∈ V (G) tem um laco, pois σ(u) = σ(v). Assim, na Figura 2.17 o vertice σ(r1) em B2 tem
um laco porque, por exemplo, {1,2} e adjacente a {1,2,3} em B2 e σ({1, 2}) = σ({1, 2, 3})desde que {1, 2} = {3, 4, 5}, entao {1, 2} = {1, 2, 3}+δ onde δ = 2 satisfazendo a condicao
(ii). Veja um exemplo aplicado ao grafo ımpar O3 na Figura 2.18.
{2, 3, 4} {2, 5}{2, 3} {2, 4, 5}
{1, 2, 3} r2 = {2, 4}r1 = {1, 2}{1, 2, 5}
{1, 2, 4}{1, 4}
{1, 5}{1, 4, 5}{4, 5}
{1, 3, 4}{1, 3}{1, 3, 5}
{3, 4, 5}{3, 4}
{3, 5}{2, 3, 5}
(a) B2
σ(r2)σ(r1)
(b) B2
Figura 2.17: Grafo Kneser bipartido B2 e o grafo reduzido B2.
O grafo quociente G e chamado grafo reduzido. Foi provado em [2] que Bk = Ok.
Em [3], foi provado que K(n, k) = B(n, k) e que |V (K(n, k))| = |V (K(n,k))|n
. Shields e
Savage mostraram que:
Lema 1 (Shields e Savage, 1999 [26]). Se existe um caminho hamiltoniano em Bk que
inicia e termina em σ(r1) e σ(r2), respectivamente – o qual chamamos de caminho viavel
– entao existe um ciclo hamiltoniano em Bk.
Bueno et al. [2] mostraram que um caminho viavel em Bk leva tambem a um caminho
hamiltoniano em Ok. Observe na Figura 2.18 o grafo reduzido de O3 e um caminho viavel
em O3.
A Tabela 2.2 mostra o numero de vertices dos grafos Ok, Bk e Ok = Bk para alguns
valores de k.
Existe uma correspondencia biunıvoca entre os k-subconjuntos de Zn e o conjunto de
strings binarias de comprimento n com exatamente k 1’s e (n−k) 0’s. A correspondencia
bnbn−1...b1 ↔ {i|bi = 1} e uma bijecao das strings de n bits para os subconjuntos de Zn. A
string de n bits associada a um k-subconjunto de Zn e chamada de representacao binaria
desse subconjunto.
Considere os vertices em representacao binaria de uma classe de equivalencia ordenados
lexicograficamente. O menor vertice da classe em termos lexicograficos e chamado o re-
CAPITULO 2. FUNDAMENTACAO TEORICA 12
{1, 2, 3}
σ(r2)
σ(r1)
{2, 3, 4}{3, 4, 5}{4, 5, 6}{5, 6, 7}{1, 6, 7}{1, 2, 7}
{4, 5, 7}{1, 5, 6}{2, 6, 7}{1, 3, 7}{1, 2, 4}{2, 3, 5}{3, 4, 6}
{4, 6, 7}{1, 5, 7}{1, 2, 6}{2, 3, 7}{1, 3, 4}{2, 4, 5}{3, 5, 6}
{2, 3, 6}{3, 4, 7}{1, 4, 5}{2, 5, 6}{3, 6, 7}{1, 4, 7}{1, 2, 5}
{1, 3, 5}{2, 4, 6}{3, 5, 7}{1, 4, 6}{2, 5, 7}{1, 3, 6}{2, 4, 7}
σ({4, 6, 7})
σ({2, 3, 6})σ({4, 5, 7})
r1 = {1, 2, 3}
r2 = {2, 4, 6}
(a) O3
σ({4, 5, 7})
σ({4, 6, 7})
σ({2, 3, 6})
σ(r2)
σ(r1)σ({1, 2, 3})
σ({2, 4, 6})
(b) Caminho viavel em O3
Figura 2.18: Em (a) o grafo reduzido O3 de O3 (Figura 2.14(c)) e em (b) um caminho
viavel em O3.
k n |V (Ok)| =(2k+1k
)|V (Bk)| = 2
(2k+1k
)|V (Ok)| =
(2k+1k
)/n
1 3 3 6 12 5 10 20 23 7 35 70 54 9 126 252 145 11 462 924 426 13 1.716 3.432 1327 15 6.435 12.870 4398 17 24.310 48.620 1.4309 19 92.378 184.756 4.86210 21 352.716 705.432 16.79611 23 1.352.078 2.704.156 58.78612 25 5.200.300 10.400.600 208.01213 27 20.058.300 40.116.600 742.90014 29 77.558.760 155.117.520 2.674.44015 31 300.540.195 601.080.390 9.694.84516 33 1.166.803.110 2.333.606.220 35.357.67017 35 4.537.567.650 9.075.135.300 129.644.79018 37 17.672.631.900 35.345.263.800 477.638.70019 39 68.923.264.410 137.846.528.820 1.767.263.19020 41 269.128.937.220 538.257.874.440 6.564.120.42021 43 1.052.049.481.860 2.104.098.963.720 24.466.267.02022 45 4.116.715.363.800 8.233.430.727.600 91.482.563.64023 47 16.123.801.841.550 32.247.603.683.100 343.059.613.650
Tabela 2.2: Numero de vertices de alguns grafos Ok, Bk e Ok = Bk.
presentante da classe. A nao ser quando explicitado em contrario, usamos ao longo do
texto o representante da classe para nos referir a um vertice do grafo reduzido.
Exemplo 2 (Representantes de classe no grafo O3). Na Figura 2.18, a classe σ(r1) contem
os seguintes vertices: {1, 2, 3}, {2, 3, 4}, {3, 4, 5}, {4, 5, 6}, {5, 6, 7}, {1, 6, 7} e {1,
2, 7} que, em representacao binaria, equivale a: 0000111, 0001110, 0011100, 0111000,
CAPITULO 2. FUNDAMENTACAO TEORICA 13
1110000, 1100001 e 1000011. O representante da classe e o vertice 0000111.
Observe na Figura 2.19, o grafo O3 representado de duas formas: (a) notacao de
conjuntos; (b) representante da classe.
σ({1, 2, 4})
σ({1, 3, 4})
σ({1, 2, 5})
σ(r2)
σ(r1)σ({1, 2, 3})
σ({2, 4, 6})
(a)
σ(0001011)
σ(0001101)
σ(0010011)
σ(r2)
σ(r1)σ(0000111)
σ(0010101)
(b)
Figura 2.19: O grafo O3 com vertices identificados pelo representante da classe.
Definimos o complemento de um bit binario x por
x =
{1 se x = 0
0 se x = 1.
Dada uma string binaria de m bits X = x1 x2 . . . xm, o shift de X e definido por
shi(X) = x2 x3 . . . xm x1. Por exemplo, se X = 00011 entao sh1(X) = sh(X) = 00110,
sh2(X) = 01100, sh3(X) = 11000 e assim por diante; trivialmente shm(X) = X.
A seguir, definimos os emparelhamentos modulares que sao utilizados para determi-
nacao de uma cobertura de vertices por ciclos disjuntos no grafo Ok= Bk que sera utilizada
como entrada inicial para o algoritmo proposto.
2.5 Emparelhamentos Modulares
O conceito de emparelhamento modular foi introduzido em [11] para os Bk. Seja A um
k-subconjunto de Zn e n = 2k + 1. Entao A e adjacente no emparelhamento my para
y = 1, 2, . . . , k + 1, ao conjunto
my(A) = A ∪ {aj}, onde j ≡(y +
∑a ∈ A
a
)(mod k + 1)
e aj e o j-esimo maior elemento em A.
Exemplo 3 (Emparelhamento modular m1 no grafo B2). Determinamos as adjacencias
de um vertice A no emparelhamento m1 para o grafo B2 (Figura 2.20 (a)) como segue:
CAPITULO 2. FUNDAMENTACAO TEORICA 14
A A j ≡ 1 +∑
a ∈ A
a (mod k + 1) my(A) = A ∪ {aj}
{1,2} {3,4,5} j ≡ 4 (mod 3) =⇒ j ≡ 1 {1,2,5}{3,4} {1,2,5} j ≡ 8 (mod 3) =⇒ j ≡ 2 {2,3,4}{1,5} {2,3,4} j ≡ 7 (mod 3) =⇒ j ≡ 1 {1,4,5}{2,3} {1,4,5} j ≡ 6 (mod 3) =⇒ j ≡ 0 {1,2,3}{4,5} {1,2,3} j ≡ 10 (mod 3) =⇒ j ≡ 1 {3,4,5}{3,5} {1,2,4} j ≡ 9 (mod 3) =⇒ j ≡ 0 {1,3,5}{2,4} {1,3,5} j ≡ 7 (mod 3) =⇒ j ≡ 1 {2,4,5}{1,3} {2,4,5} j ≡ 5 (mod 3) =⇒ j ≡ 2 {1,3,4}{2,5} {1,3,4} j ≡ 8 (mod 3) =⇒ j ≡ 2 {2,3,5}{1,4} {2,3,5} j ≡ 6 (mod 3) =⇒ j ≡ 0 {1,2,4}
Duffus et al. [11] mostraram que os emparelhamentos modularesmy para y = 1, 2, . . . , k+
1 sao emparelhamentos perfeitos que formam uma 1-fatorizacao deBk. Veja na Figura 2.20
uma 1-fatorizacao de B2.
{3, 5} {2, 4, 5}{4, 5} {3, 4, 5}
{1, 2} {1, 2, 3}{1, 3}{1, 4}
{1, 2, 4}{1, 2, 5}
{1, 5}{2, 3}{2, 4}
{1, 3, 4}{1, 3, 5}{1, 4, 5}
{2, 5}{3, 4}
{2, 3, 4}{2, 3, 5}
(a) m1
{3, 5} {2, 4, 5}{4, 5} {3, 4, 5}
{1, 2} {1, 2, 3}{1, 3}{1, 4}
{1, 2, 4}{1, 2, 5}
{1, 5}{2, 3}{2, 4}
{1, 3, 4}{1, 3, 5}{1, 4, 5}
{2, 5}{3, 4}
{2, 3, 4}{2, 3, 5}
(b) m2
{3, 5} {2, 4, 5}{4, 5} {3, 4, 5}
{1, 2} {1, 2, 3}{1, 3}{1, 4}
{1, 2, 4}{1, 2, 5}
{1, 5}{2, 3}{2, 4}
{1, 3, 4}{1, 3, 5}{1, 4, 5}
{2, 5}{3, 4}
{2, 3, 4}{2, 3, 5}
(c) m3
Figura 2.20: Os emparelhamentos modulares em B2.
Mais tarde, Johnson e Kierstead [15] mostraram que os emparelhamentos modulares
my levam tambem a uma 2-fatorizacao de Ok com (k+1)2
2-fatores para k ımpar. Para
k par, os emparelhamentos modulares resultam em k2
2-fatores e um emparelhamento
perfeito.
Definimos, assim, os emparelhamentos modulares my, y = 1, . . . , k + 1 em Bk como
Π(my) em Ok, onde para todo vertice A em V (Bk), Π(A) = A se A e um k-subconjunto
e Π(A) = A se A e um (k + 1)-subconjunto (Figura 2.21).
Johnson e Kierstead [15] mostraram que, se k e ımpar, Π(mi) = Π(mk+2−i) para
i = 1, . . . , d(k + 1)/2e. Em outras palavras, isso significa que, para k = 5, por exem-
plo, Π(m1) = Π(m6); Π(m2) = Π(m5), e; Π(m3) = Π(m4). Assim, determinar uma
2-fatorizacao de Ok exige apenas a metade dos emparelhamentos modulares. No entanto,
se k e par, entao Π(mj) para j = (k + 2)/2 e um emparelhamento perfeito em Ok. Para
CAPITULO 2. FUNDAMENTACAO TEORICA 15
k = 4 isso significa que Π(m1) = Π(m5) e Π(m2) = Π(m4) sao 2-fatores e Π(m3) e um
emparelhamento perfeito em O4.
{1, 2}
{4, 5}
{2, 3}{1, 5}
{3, 4}
{1, 3}
{3, 5}{2, 5}
{2, 4}
{1, 4}
(a) Π(m1) = Π(m3)
{1, 2}
{4, 5}
{2, 3}{1, 5}
{3, 4}
{1, 3}
{3, 5}{2, 5}
{2, 4}
{1, 4}
(b) Π(m2)
Figura 2.21: Os (k2
= 1) 2-fatores e o emparelhamento perfeito em O2.
Observe que um 2-fator em um grafo G e uma cobertura de vertices por ciclos dis-
juntos e e, por consequencia, um subgrafo gerador de G. Queremos fornecer ao nosso
algoritmo uma cobertura de vertices por ciclos disjuntos que serao concatenados na ten-
tativa de obtermos um caminho viavel. Para isso, no entanto, precisamos mostrar que os
emparelhamentos modulares podem ser utilizados nos grafos reduzidos.
E suficiente mostrar que cada aresta de Ok representa arestas de Ok de um mesmo
Π(my), para 1 ≤ y ≤ bk2c+ 1.
Lema 2. Cada aresta de Ok representa n arestas de Ok do mesmo emparelhamento mo-
dular my, para 1 ≤ y ≤ bk2c+ 1.
Demonstracao. De [2] sabemos que uma aresta {σ(u), σ(v)} ∈ E(Ok) implica em um
emparelhamento perfeito entre os vertices de σ(u) e os vertices de σ(v) em Ok, formado
pelas arestas {shi(u), shi(v)}, para 1 ≤ i ≤ n.
Sem perda de generalidade, considere uma aresta {A,Π(my(A))} ∈ E(Ok). De [11]
temos que my(shi(A)) = shi(my(A)). Segue que as arestas do emparelhamento perfeito
{shi(A), shi(Π(my(A)))} fazem parte do mesmo Π(my).
O Lema 2 implica que as arestas de Ok podem ser determinadas pelos emparelhamen-
tos modulares. Consequentemente, os emparelhamentos modulares my, 1 ≤ y ≤ dk2e
determinam varias coberturas de vertices por ciclos disjuntos em Ok.
Na proxima secao, apresentamos alguns resultados sobre os problemas do ciclo e cami-
nho hamiltonianos em grafos K(n, k) e B(n, k), assim como as conjecturas que motivam
o estudo de caminhos e ciclos hamiltonianos nesses grafos.
CAPITULO 2. FUNDAMENTACAO TEORICA 16
2.6 Ciclos e Caminhos Hamiltonianos em K(n, k) e
B(n, k)
Dado um grafo G qualquer, decidir se G tem um ciclo hamiltoniano e um problema
NP-Completo [16]. De fato, o problema de decisao associado ao problema do ciclo hamil-
toniano e NP-Completo mesmo quando um caminho hamiltoniano e dado como parte da
instancia [21] ou quando G e bipartido [17].
Por outro lado, o problema do caminho hamiltoniano tambem e NP-Completo [12]
mesmo se o grafo for bipartido [12].
Determinar ciclos e caminhos hamiltonianos nos grafos Kneser e Kneser bipartidos e
um problema bem estudado e sua importancia esta relacionada a conjecturas abertas ha
decadas.
Conjectura 1 (Lovasz, 1970 [18]). Todo grafo nao-direcionado, conexo e vertice-transitivo
tem um caminho hamiltoniano.
Quase uma decada apos a Conjectura 1, foi conjecturado que:
Conjectura 2 (Biggs, 1979 [1]). O grafo ımpar Ok e hamiltoniano para k > 2.
Para os grafos Bk foi conjecturado que:
Conjectura 3 (Havel, 1983 [14]). O grafo Bk e hamiltoniano para k ≥ 1.
Ambas as conjecturas de Biggs e Havel focam na existencia de ciclos hamiltonianos,
enquanto a conjectura de Lovasz foca na existencia de caminhos hamiltonianos.
Devido a dificuldade de se provar a conjectura de Biggs, os pesquisadores tentam
provar a conjectura de Havel, que parece ser um problema mais facil pelo fato de Bk
ser bipartido. No entanto, ate agora, nenhuma das conjecturas foi resolvida. De fato,
ambas as Conjecturas 2 e 3 estao fortemente relacionadas a conjectura de Lovasz, pois os
grafos Kneser K(n, k) e Kneser bipartidos B(n, k) formam uma famılia de grafos conexos
e vertice-transitivos para n > 2k. Portanto, o estudo de ciclos e caminhos hamiltonianos
nestes grafos pode fornecer mais evidencias para apoiar a conjectura de Lovasz, ou oferecer
um contra-exemplo para a mesma.
A Conjectura 2 foi verificada para todo k ≤ 13 [19, 20, 27], enquanto a Conjectura 3
para k ≤ 17 [9, 10, 26, 28]. Chen mostrou que os grafos Kneser sao hamiltonianos para
n ≥ 3k [6] e, mais tarde, para n ≥ 2.62k + 1 [7]. Shields e Savage [27] mostraram que os
grafos Kneser sao hamiltonianos para n ≤ 27, com excecao do grafo O2 que e o grafo de
Petersen e que foi provado ser hipohamiltoniano. Usando heurısticas, Shields e Savage [26]
CAPITULO 2. FUNDAMENTACAO TEORICA 17
determinaram caminhos viaveis em Bk para 1 ≤ k ≤ 15. Shields et al. [28] estenderam
este resultado para k ≤ 17.
Posteriormente, Bueno et al. [2] mostraram que Bk = Ok e que um caminho viavel
em Bk leva nao somente a um ciclo hamiltoniano em Bk, mas tambem a um caminho
hamiltoniano em Ok, o que de fato significa que Ok tem um caminho hamiltoniano para
k ≤ 17.
A seguir, introduzimos o conceito de Computacao Paralela e a especificacao MPI
utilizada para o desenvolvimento do algoritmo paralelo proposto.
2.7 Computacao Paralela e MPI
Na computacao serial ou sequencial, um programa e decomposto em uma serie de instru-
coes e uma unica sequencia de instrucoes e executada, uma de cada vez, por uma CPU
em uma unica sequencia de dados [23].
Quando temos tarefas que exigem um maior poder computacional, que demandam mais
tempo para solucionar um dado problema, a computacao serial pode ser impraticavel e
uma forma de tentar resolve-lo e usando computacao paralela. A computacao paralela e
a utilizacao de varios recursos de computacao para resolver um problema computacional,
usando multiplas CPUs. O problema a ser resolvido e dividido em subproblemas que sao
resolvidos simultaneamente, cada um em um processador diferente. Durante esta fase, os
processadores podem comunicar-se uns com os outros para trocar resultados parciais. No
passo final, os resultados devem ser combinados para formar a solucao para o problema
original [23].
Exemplo 4 (Um problema dividido em quatro subproblemas). Cada subproblema e di-
vidido em instrucoes e essas instrucoes sao executadas por uma CPU. Cada subproblema
utiliza uma CPU e cada processo trabalha de forma independente (Figura 2.22).
instrucoes
CPU
Problema
t3 t2 t1
CPU
CPU
CPU
tn
Figura 2.22: Diagrama de funcionamento da computacao paralela para um problemadividido em quatro subproblemas2.
2Adaptada de https://computing.llnl.gov/tutorials/parallel_comp/, acesso em 10-jun-
2012.
CAPITULO 2. FUNDAMENTACAO TEORICA 18
De acordo com o compartilhamento de memoria, adotamos a seguinte classificacao [5]:
sistemas fortemente acoplados, onde um unico espaco de enderecamento e compartilhado
por todos os processadores, ou fracamente acoplados, onde cada processador tem o seu
proprio espaco de enderecamento. Em sistemas fortemente acoplados, a comunicacao
entre diferentes processadores ocorre atraves de instrucoes de escrita e leitura em posicoes
de memoria: um processador escreve em uma determinada posicao e outro processador
le essa mesma posicao. Ja em sistemas fracamente acoplados, a comunicacao entre os
processos e possıvel atraves de primitivas de troca de mensagens como send e receive.
O processamento se baseia no princıpio de que podemos dividir um problema em partes
menores para serem resolvidas em paralelo, com um processamento mais rapido, mesmo
para tarefas complexas. Em geral, um problema computacional utilizando computacao
paralela e resolvido mais rapidamente que em computacao serial. Existem casos, no
entanto, em que nao e possıvel utilizar uma estrategia paralela.
O Message Passing Interface (MPI) e uma especificacao para a troca de mensagens
em paralelo, de forma que um processo seja capaz de se comunicar com outro, mesmo em
maquinas diferentes. Nao e uma biblioteca, mas a especificacao do que uma biblioteca deve
possuir para fornecer um padrao de trocas de mensagens. Ate agora, esta especificacao
esta definida para as linguagens C/C++ e Fortran.
O MPI tem como objetivos: (a) aumentar a portabilidade dos programas, (b) prover
uma interface de comunicacao confiavel e (c) conseguir implementacoes eficientes em varias
arquiteturas. Um programa feito com o uso do MPI pode, em princıpio, ser compilado
em plataformas diferentes sem necessidade de alteracao do codigo, necessitando apenas
da dispobilidade de alguma biblioteca que implemente o MPI.
No MPI, uma aplicacao e constituıda por um ou mais processos, que se comunicam
entre si, atraves do envio e recebimento de mensagens. Sao possıveis, tambem, opera-
coes coletivas, por exemplo, onde todos os processos recebem e/ou enviam as mesmas
mensagens. Cabe ao programador descobrir a melhor forma de paralelizar o problema,
dividindo as tarefas entre os processos. Cada processo pode executar uma tarefa dife-
rente ou todos podem executar a mesma tarefa. Cada instrucao e executada de forma
independente em cada processo.
A estrutura basica de um programa que use MPI e mostrada na Figura 2.23.
Cada processo MPI e identificado por um numero unico, e esta atribuicao e feita
quando o processo e iniciado em tempo de execucao. O numero atribuıdo a cada pro-
cesso e conhecido como rank. Denotaremos por rankp o rank de um processo, onde
p = 0, . . . , np − 1 e np e o numero de processos sendo executados por um determinado
programa. Uma tag e um numero inteiro nao negativo escolhido pelo programador para
identificar uma mensagem. Um grupo de comunicacao e um conjunto de processos que
CAPITULO 2. FUNDAMENTACAO TEORICA 19
podem se comunicar diretamente.
Declaracoes, prototipos, etc.
Inıcio do ProgramaCodigo Serial
Inıcio de codigo Paralelo
Fim de codigo Paralelo
Codigo SerialFim do Programa.
...
...
...
...
Inclusao de arquivo MPI
Inicializa ambiente MPI
Fazer trabalho e troca de mensagens
Termina ambiente MPI
Figura 2.23: Estrutura basica de um programa que use MPI3.
Existem 6 rotinas basicas do MPI. Sao elas:
• MPI Init: Inicializa o ambiente MPI;
• MPI Finalize: Finaliza o ambiente MPI;
• MPI Comm rank: Identifica um processo MPI dentro de um determinado grupo.
Retorna um valor inteiro entre 0 e (np− 1);
• MPI Comm size: Retorna o numero de processos dentro do grupo;
• MPI Send: Rotina basica para envio de mensagens;
• MPI Recv: Rotina basica para recebimento de mensagens.
O Single Program Multiple Data (SPMD) e um modelo de programacao em que todos
os programas que constituem a aplicacao estao incorporados em um unico executavel
e cada processo executa uma copia desse executavel. Atraves de estruturas de selecao
e condicao, cada processo pode executar parte do codigo, de acordo com as condicoes
estabelecidas.
Utilizamos entao, o MPI com o modelo de programacao SPMD para o desenvolvimento
do algoritmo que propomos (Capıtulo 4) para a busca de caminhos viaveis em Ok = Bk.
Algoritmos sao implementados para tentar solucionar problemas cada vez mais difıceis ou
melhorar solucoes ja existentes. Alguns algoritmos demandam muito tempo de execucao e
uma ideia e usar os algoritmos paralelos. Dentre os algoritmos ja implementados utilizando
computacao paralela [25], citamos o algoritmo de Floyd para o problema do caminho
3Adaptada de https://computing.llnl.gov/tutorials/mpi/, acesso em 10-jun-2012.
CAPITULO 2. FUNDAMENTACAO TEORICA 20
mınimo, o algoritmo de Kruskal para determinar uma arvore geradora mınima e um
algoritmo para o Problema do Caixeiro Viajante.
Para o problema de ciclos e caminhos hamiltonianos nos K(n, k) e B(n, k), desconhe-
cemos ate o momento, um algoritmo paralelo.
Capıtulo 3
Algoritmos para Grafos Kneser e
Kneser Bipartidos
Os algoritmos conhecidos para determinar ciclos e caminhos hamiltonianos em grafos
Kneser e Kneser bipartidos utilizam uma abordagem heurıstica. Neste capıtulo, descreve-
mos brevemente estes algoritmos que denotamos por SS99 [26], SS04 [27] e SSS09 [28].
3.1 O Algoritmo SS99
Em 1990 David Moews e Reid Mike [24] mostraram que o grafo Bk e hamiltoniano para
1 ≤ k ≤ 11. Em 1999 Shields e Savage [26] estenderam o resultado de Moews e Reid para
mostrar que o grafo Bk e hamiltoniano para 1 ≤ k ≤ 15.
Para encontrar ciclos hamiltonianos nesses grafos com milhoes de vertices, Shields e
Savage [26] adotaram a seguinte estrategia:
Passo (1): transformar um grafo Bk em um grafo reduzido Bk;
Passo (2): identificar os vertices σ(r1) e σ(r2) em Bk com a propriedade de que qualquer
caminho hamiltoniano em Bk comecando em σ(r1) e terminando em σ(r2) leva a
um ciclo hamiltoniano em Bk;
Passo (3): aplicar uma heurıstica para encontrar um caminho hamiltoniano entre σ(r1)
e σ(r2) – o que nos chamamos de caminho viavel.
A reducao utilizada no passo (1) foi usada por Moews e Reid [24] e complementada
por Dejter [8]. Os passos (2) e (3) foram desenvolvidos por Shields e Savage [26].
Uma busca backtrack garantidamente encontra um caminho viavel de σ(r1) para σ(r2),
se tal caminho existe. No entanto, por ser uma busca exaustiva o tempo computacional
21
CAPITULO 3. ALGORITMOS PARA GRAFOS KNESER E KNESER BIPARTIDOS 22
e exponencial no pior caso e e demasiadamente lenta mesmo para grafos relativamente
pequenos.
Definimos como rotacao de um vertice vi, a troca de posicoes entre os vertices vi e vj de
um caminho P enquanto i < j, para j iniciando em |P |. A cada iteracao decrementamos
o valor de j e incrementamos o valor de i.
A heurıstica de Posa [22] e um algoritmo que procura por caminhos hamiltonianos em
grafos aleatorios. O algoritmo constroi um caminho iniciando em um vertice s e estende
enquanto for possıvel, de modo que um determinado vertice t seja o ultimo vertice do
caminho. Quando o caminho nao pode ser estendido a partir de um vertice u, o algoritmo
seleciona um vertice v adjacente a u e executa uma rotacao de v com o ultimo vertice do
caminho. O algoritmo de Posa nao faz backtrack, porem pode nao ser bem sucedido em
encontrar um caminho hamiltoniano, mesmo se existir.
A heurıstica SS99 e uma variacao da heurıstica de Posa [22] que, antes de realizar uma
rotacao, verifica o proximo vertice usando uma busca em largura (BFS). O algoritmo
SS99 considera s = σ(r1) e t = σ(r2), e estende o caminho como e feito no algoritmo
de Posa ate que todos os vertices adjacentes do ultimo vertice u ja estejam no caminho
(Algoritmo 1).
Algoritmo 1: Algoritmo SS99 para encontrar um caminho viavel em Bk
Entrada: O caminho P , um grafo Bk e os vertices σ(r1) e σ(r2)1 inıcio2 se |P | = 0 entao3 Adicionar o vertice σ(r1) na primeira posicao de P4 fim se
5 enquanto |P | < (|V (Bk)| − 1) faca6 Seja u o ultimo vertice de P
7 se ∃v ∈ V (Bk) tal que u e v sao adjacentes, v /∈ P e v 6= σ(r2) entao8 Adicionar o vertice v na ultima posicao em P9 senao
10 BFSExtend(P, σ(r2)) //*Algoritmo 2*//
11 fim se
12 fim enqto
13 se (|P | < |V (Bk)|) entao14 BFSExtend(P,NIL)15 se u e σ(r2) sao adjacentes entao16 Adicionar o vertice σ(r2) na ultima posicao de P17 fim se
18 fim se19 retorna |P |20 fim
CAPITULO 3. ALGORITMOS PARA GRAFOS KNESER E KNESER BIPARTIDOS 23
O algoritmo SS99 (Algoritmo 1) recebe um caminho como entrada que, na primeira
execucao, e vazio. Se o caminho nao for vazio, o algoritmo prossegue a execucao a partir
do ultimo vertice de P que chamamos de u. Isso nos possibilita fornecer um caminho
parcial a partir do qual o algoritmo trabalhara. Se |P | = 0, o vertice σ(r1) e adicionado
na primeira posicao de P (linha 2). Se nao for possıvel estender o caminho P (linha 7),
pois nao ha mais vertices adjacentes a u que nao sejam o proprio vertice σ(r2), o algoritmo
SS99 usa a BFS para procurar uma sequencia de uma ou mais rotacoes, a partir do vertice
u para que a busca pelo caminho viavel seja reiniciada. A escolha do vertice v adjacente
a um vertice z para verificar se z ∈ P e feita aleatoriamente (linha 13 do Algoritmo 2).
Algoritmo 2: Algoritmo BFSExtend para procurar uma ou mais sequencias derotacoes
Entrada: O caminho P e um valor t que pode ser σ(r2) ou NIL1 inıcio2 para cada vertice v ∈ P faca3 visited[v] ← false4 fim para5 u← ultimo vertice ∈ P6 Adicionar o vertice u na fila Q7 visited[u] ← true8 J [u]← 09 π[u]← NIL
10 enquanto a fila Q nao estiver vazia faca11 z ← primeiro vertice em Q12 remover z de Q13 para cada vertice v em Adj(z) faca14 se v 6= t entao15 se v ∈ P entao16 p← FindPosition(P, z, Pos[v]) //*Algoritmo 3*//
17 w ← FindV ertex(P, z, p+ 1) //*Algoritmo 4*//
18 se ¬visited[w] e w 6= t entao19 visited[w] ← true20 J [w]← p21 π[w]← z22 Adicionar o vertice w na fila Q
23 fim se
24 senao25 P ← DoReversals(P, z) //*Algoritmo 5*//
26 retorna true
27 fim se
28 fim se
29 fim para
30 fim enqto31 retorna false
32 fim
CAPITULO 3. ALGORITMOS PARA GRAFOS KNESER E KNESER BIPARTIDOS 24
Shields e Savage [26] nao assumem nenhuma representacao particular do grafo no
Algoritmo 2, somente que a funcao Adj(q) na linha 13 retorna uma lista de vertices
adjacentes a um vertice q e ha varias estruturas de dados para cada vertice na arvore.
Para cada vertice q uma variavel booleana visited[q] indica se q ja esta em P ou nao
e a posicao de q em P e acessada por Pos[q]. O vertice antecessor de q na arvore e
armazenado em π[q]. Lembrando que u e o ultimo vertice em P . A nova posicao de um
vertice v adjacente a q e que atualmente pode ser acessada por Pos[v] e armazenada em
J [q], assumindo que se uma serie de rotacoes for feita em P entao, q = u. O Algoritmo 3
encontra essa nova posicao de v recursivamente.
Algoritmo 3: Algoritmo FindPosition para encontrar a nova posicao de um verticev ∈ P e adjacente a q
Entrada: O caminho P , um vertice q e p = Pos[v]1 inıcio2 se J [q] ≥ 0 entao3 p← FindPosition(P, π[q], p)4 se J [q] < p entao5 p← |P | − p+ J [q] + 16 fim se
7 fim se8 retorna p
9 fim
O Algoritmo 4 encontra um vertice w que estara uma posicao apos o vertice v em P ,
e assim como no Algoritmo 3, assume que se uma serie de rotacoes for realizada em P
entao, q = u.
Algoritmo 4: Algoritmo FindVertex para encontrar um novo vertice w uma posicaoapos o vertice v
Entrada: O caminho P , um vertice q e a posicao r = Pos[v] + 11 inıcio2 enquanto J [q] ≥ 0 faca3 se J [q] ≤ r entao4 r ← (|P | − r) + J [q] + 15 fim se6 u← π[q]
7 fim enqto8 retorna P [r]
9 fim
Observe no Algoritmo 3 e no Algoritmo 4 que os calculos sao realizados sem executar
qualquer rotacao em P . As rotacoes sao executadas somente quando um vertice v e adja-
cente a q e v /∈ P , garantindo que q = u em P e com isso, ser possıvel estender P atraves
CAPITULO 3. ALGORITMOS PARA GRAFOS KNESER E KNESER BIPARTIDOS 25
desse novo vertice final (Algoritmo 5).
Algoritmo 5: Algoritmo DoReversals para fazer rotacoes em P e ao final das ro-tacoes q = u
Entrada: O caminho P e um vertice q1 inıcio2 se J [q] ≤ r entao3 DoReversals(P, π[q])4 l← J [q] + 15 h← |P |6 enquanto l < h faca7 t← P [h]8 Pos[P [h]]← l9 Pos[P [l]]← h
10 P [h]← P [l]11 P [l]← t12 h← h− 113 l← l + 1
14 fim enqto
15 fim se
16 fim
Veja um exemplo da execucao do Algoritmo 1 no Exemplo 5, para |P | = |V (B4)| − 1.
Exemplo 5 (Execucao do Algoritmo SS99). Temos |V (B4)| = 14, σ(r1) = 000001111,
σ(r2) = 001010101 e B4 = O4. Considere o caminho P como entrada do algoritmo SS99:
P = (σ(r1) =000001111, 000010111, 000110101, 001010011, 001001011, 001001101,
000101101, 000011101, 000101011, 000100111, 000011011, 000111001, 000110011).
Observe que |P | = 13 = (|V (B4)| − 1), assim a execucao comeca na linha 13 do
Algoritmo 1. O caminho P tem o vertice σ(r1)=000001111 na primeira posicao e falta
adicionar um unico vertice que e σ(r2)=001010101, porem σ(r2) nao e adjacente ao
ultimo vertice de P que e 000110011. Entao e necessario efetuar rotacoes em P para que
encontre um novo vertice u adjacente a σ(r2).
O Algoritmo 2 considera inicialmente que todos os vertices em P nao foram visitados
pela BFS (linha 2). Considere u = 000110011 e que u foi visitado. Em um determinado
momento, o vertice z na linha 11 e z = 000101101 e o vertice v adjacente a z (linha 13)
encontrado aleatoriamente e v = 001010101 e v /∈ P . Observe que v = 001010101 =
σ(r2), e e justamente o vertice que falta em P . Entao fazemos rotacoes em P para
que u = z = 000101101 e assim, ser possıvel adicionar σ(r2) na ultima posicao em P
(Algoritmo 5).
CAPITULO 3. ALGORITMOS PARA GRAFOS KNESER E KNESER BIPARTIDOS 26
Considere l = J [v1] a posicao de um vertice v1 a qual e feita a troca de posicoes
com um vertice v2 e h = Pos[v2]. Considere ainda que, P [i] e o vertice na posicao i do
caminho P , onde 1 ≤ i ≤ |P |. Por simplificacao, nao mostramos os calculos que ja foram
realizados pelo Algoritmo 3 e pelo Algoritmo 4 para encontrar o valor inicial de l em cada
rotacao, mas somente mostramos as duas rotacoes em P inicialmente para h = |P | = 13:
Rotacao 1: l = 11 e h = 13. Enquanto l < h :
• troca entre as posicoes l = 11 e h = 13 de P . Inicialmente, P [l = 11] =
000011011 e P [h = 13] = 000110011. Apos a troca: P [h = 13] =000011011 e
P [l = 11] = 000110011. Decrementamos h e incrementamos l. A rotacao se
encerra, pois l = h = 12 (Figura 3.1(a));
Rotacao 2: l = 7 e h = 13. Enquanto l < h :
• troca entre as posicoes l = 7 e h = 13 de P . Inicialmente, P [l = 7] =
000101101 e P [h = 13] = 000011011. Apos a troca: P [h = 13] =000101101
e P [l = 7] = 000011011. Decrementamos h e incrementamos l. A rotacao
continua, pois l = 8 < h = 12 (Figura 3.1(b));
• troca entre as posicoes l = 8 e h = 12 de P . Inicialmente, P [l = 8] =
000011101 e P [h = 12] = 000111001. Apos a troca: P [h = 12] =000011101
e P [l = 8] =000111001. Decrementamos h e incrementamos l. A rotacao
continua, pois l = 9 < h = 11 (Figura 3.1(c));
• troca entre as posicoes l = 9 e h = 11 de P . Inicialmente, P [l = 9] =
0001010111 e P [h = 11] = 000110011. Apos a troca: P [h = 11] =000101011
e P [l = 9] =000110011. Decrementamos h e incrementamos l. A rotacao se
encerra, pois l = h = 10 (Figura 3.1(d)).
O caminho P tem agora um novo vertice na ultima posicao em P , que e o vertice
u = 000101101 (Figura 3.1(d)). Como so falta um vertice para que P seja um caminho
viavel, verificamos que u e adjacente a σ(r2) e adicionamos σ(r2) na ultima posicao em
P , obtendo um caminho viavel de B4 = O4 (Figura 3.2).
Observe no Exemplo 5 que, mesmo que |P | = (|V (B4)|−1), nao e tao simples adicionar
o vertice σ(r2) na posicao correta em P , mesmo nesse caso em que o grafo tem apenas
14 vertices. A dificuldade de encontrar tal caminho aumenta de acordo com o valor de
k, pois mesmo para k relativamento pequeno, o numero de vertices cresce rapidamente
(Tabela 2.2).
Para k = 15 que tem 9.694.845 vertices no grafo Bk, os autores [26] precisaram de tres
semanas de processamento em um computador Intel Pentium-II de 400 MHz e 192 MB de
CAPITULO 3. ALGORITMOS PARA GRAFOS KNESER E KNESER BIPARTIDOS 27
000110101
001010011
001001011
001001101
P
000101101
000011101
000010111
000001111
000101011
000100111
000110011
000111001
000011011
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
(12)
(13)
σ(r1)
(a)
000110101
001010011
001001011
001001101
P
000011011
000011101
000010111
000001111
000101011
000100111
000110011
000111001
000101101(13)
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
(12)
σ(r1)
(b)
000110101
001010011
001001011
001001101
P
000011011
000111001
000010111
000001111
000101011
000100111
000110011
000011101
000101101(13)
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
(12)
σ(r1)
(c)
000110101
001010011
001001011
001001101
P
000011011
000111001
000010111
000001111
000110011
000100111
000101011
000011101
000101101(13)
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
(12)
σ(r1)
(d)
Figura 3.1: Rotacoes em P para que o vertice 000101101 seja o ultimo vertice em P .
000110101
001010011
001001011
001001101
P
000011011
000111001
000010111
000001111 = σ(r1)
000110011
000100111
000101011
000011101
000101101
001010101 = σ(r2)
Figura 3.2: Um caminho viavel do grafo B4 = O4.
memoria RAM, para encontrar um caminho viavel em B15. Os autores relatam, porem,
que algoritmo encontrou um caminho viavel na primeira execucao para k ≤ 15.
A seguir, descrevemos brevemente um algoritmo heurıstico de Shields e Savage [27]
feito para encontrar ciclos hamiltonianos diretamente em B(n, k) e K(n, k), sem o uso
dos grafos reduzidos.
3.2 O Algoritmo SS04
Em 2004 Shields e Savage [27] usaram um algoritmo heurıstico para mostrar que todos
os grafos K(n, k) conexos (exceto o grafo de Petersen K(5, 2) = O2) tem um ciclo hamil-
toniano para n ≤ 27. O algoritmo tambem determinou ciclos hamiltonianos em B(n, k)
CAPITULO 3. ALGORITMOS PARA GRAFOS KNESER E KNESER BIPARTIDOS 28
para n ≤ 27. O algoritmo SS04 [27] e uma modificacao do algoritmo SS99 [26], no entanto
a heurıstica e aplicada diretamente nos grafos K(n, k) e B(n, k), sem utilizar os grafos
reduzidos.
Manipulacoes de grafos tao grandes quanto, por exemplo, o grafo K(27, 13) = O13 com
20.058.300 vertices e 140.408.100 arestas, exigiram melhorias tanto no tempo de execucao,
quanto no espaco requerido para a heurıstica. Em um sistema em que o programa requer
mais memoria do que o sistema tem disponıvel, os dados sao alternados entre memoria
e disco pelo sistema operacional. Quando isso ocorre, os tempos de execucao tendem
aumentar de forma significativa.
Algumas otimizacoes no algoritmo SS04 utilizadas para reduzir os requisitos de ar-
mazenamento foram:
1. reduzir tempo de execucao na construcao da arvore BFS;
2. as listas de adjacencias sao geradas quando necessarias.
Estas melhorias permitiram o algoritmo SS04 obter resultados para n ≤ 27 em um
computador desktop com 1.6GHz e 640MB de memoria RAM. A cada meia hora, o cami-
nho parcial obtido era salvo em um arquivo, para permitir reiniciar o problema atraves
de uma parte do caminho, caso necessario.
A seguir, discutimos o algoritmo de Shields et al. [28], que consiste no algoritmo
SS99 [26] com algumas modificacoes. Esse algoritmo foi tambem aplicado aos grafos
reduzidos Bk.
3.3 O Algoritmo SSS09
Em 2009, Shields et al. [28] estenderam o resultado do algoritmo SS99 [26] mostrando que
Bk e hamiltoniano para 1 ≤ k ≤ 17. Os novos resultados foram obtidos apos modificacoes
no algoritmo, o que tornou possıvel encontrar um caminho viavel no grafo reduzido B17
com 129.644.790 vertices, usando um computador AMD Athlon 3500+ com 2 GB de
memoria RAM de 64 bits.
O algoritmo SSS09 e o algoritmo SS99 [26] modificado para usar valores de 64 bits.
Adicionalmente, Shields et al. [28] descobriram que grande parte do tempo foi gasto na
realizacao de operacoes de rotacao mais do que na BFS para determinar as sequencias de
rotacoes. Assim, os autores fizeram alteracoes na heurıstica que resultaram em melhor
desempenho:
1. quando a BFS encontra uma sequencia de rotacoes que permitam uma extensao do
caminho, ao inves de realmente executar cada rotacao do caminho, a sequencia de
CAPITULO 3. ALGORITMOS PARA GRAFOS KNESER E KNESER BIPARTIDOS 29
rotacoes e codificada como uma lista de pares ordenados, cada um representando o
numero de vertices no caminho e o ponto de rotacao;
2. periodicamente sao implementadas todas as rotacoes codificadas na lista de pares
ordenados.
Os autores mostraram que essas modificacoes reduzem significativamente o trabalho
medio por rotacao.
No proximo capıtulo, apresentamos um algoritmo paralelo para determinar caminhos
viaveis em Ok. Utilizamos o algoritmo SS99 [26] para finalizar nosso algoritmo.
Capıtulo 4
Algoritmo Proposto
Dentre os algoritmos implementados para o problema SS99 [26], SS04 [27] e SSS09 [28],
nenhum deles utilizou uma abordagem paralela ou mesmo uma maquina de maior poder
computacional que um AMD Athlon 3500+ com 2Gb de memoria RAM.
Considerando que, para n = 2k+ 1, com excecao de apenas alguns valores conhecidos,
o problema permanece em aberto para ambos os grafos Ok e Bk, propomos um algoritmo
para a busca de caminhos viaveis em Ok=Bk.
Comecamos descrevendo a representacao computacional utilizada para o grafo Ok e
para a solucao na Secao 4.1. Na Secao 4.2, descrevemos a entrada fornecida ao algoritmo.
Com o objetivo de melhorar o desempenho do programa, ao inves de fornecer apenas
os vertices do grafo, utilizamos os emparelhamentos modulares de [11] para obter uma
cobertura de vertices de Ok por ciclos disjuntos. Entao buscamos um caminho viavel
no grafo atraves da concatenacao de caminhos obtidos a partir destes ciclos. Nesta fase,
utilizamos um algoritmo paralelo que descrevemos em detalhes na Secao 4.3.
Pode ser, entretanto, que nem todos os vertices do grafo possam ser colocados no
caminho obtido no algoritmo paralelo. Entao, na sequencia, em uma fase sequencial,
utilizamos o algoritmo SS99 [26] para adicionar adequadamente estes vertices ao caminho.
Esta fase e descrita na Secao 4.4. Portanto, o algoritmo proposto consiste em um algoritmo
paralelo seguido de um algoritmo sequencial, desenvolvidos em C/C++ e utilizamos o MPI
como abordagem paralela.
Finalmente, na Secao 4.5, apresentamos um exemplo da execucao do algoritmo sobre
o grafo O4.
30
CAPITULO 4. ALGORITMO PROPOSTO 31
4.1 Representacao Computacional da Solucao e do
Grafo Ok
A solucao do caminho viavel e representada atraves de um caminho de vertices em um
vetor, onde cada posicao do vetor equivale a posicao do vertice no caminho obtido.
Para a representacao do grafo Ok, utilizamos um vetor contendo os vertices do grafo.
Utilizar uma lista de adjacencias ou matriz de adjacencias para representar o grafo Ok
implica um alto custo em memoria e em manipulacao de dados, ja que o numero de
vertices e arestas do grafo Ok cresce rapidamente para valores de n e k relativamente
pequenos (Tabela 2.2).
Como o algoritmo para encontrar caminhos viaveis tem como entrada um grafo re-
duzido, e suficiente armazenar apenas um representante de cada classe, atraves do qual
determinamos as adjacencias entre os vertices em tempo quadratico em n, conforme
mostramos no Algoritmo 6 e Exemplo 6. Assim, podemos dispensar a representacao
explıcita das arestas na memoria. Por ultimo, ainda com o objetivo de otimizar o uso da
memoria, utilizamos a representacao binaria dos vertices e adotamos uma representacao
compacta de cada vertice em um array de bits.
Observe o Algoritmo 6. Para n = 2k + 1, cada vertice tem n bits dos quais k bits
sao 1 e os demais (k + 1) bits sao 0. Para encontrar as adjacencias de um vertice u em
Bk, a cada iteracao do algoritmo, fixamos 1 no lugar de um 0 em u. Entao geramos o
complemento desse novo vertice de Bk, obtendo uma adjacencia de u em Ok. Finalmente,
determinamos o representante de classe correspondente que resulta em uma adjacencia
em Ok.
Algoritmo 6: Algoritmo para determinar se dois vertices sao adjacentes
Entrada: Vertices u e v1 inıcio2 para i de 0 ate (n-1) faca3 aux← u4 se aux[i] = 0 entao5 aux[i]← 16 aux ← complemento(aux)7 aux ← representante classe(aux)8 se aux = v entao9 retorna true
10 fim se
11 fim se
12 fim para13 retorna false
14 fim
CAPITULO 4. ALGORITMO PROPOSTO 32
Quanto a complexidade do Algoritmo 6, as operacoes dentro do laco (linha 2) sao
todas de tempo constante, com excecao das operacoes nas linhas 6 e 7 que tem tempo
linear em n, cada uma delas. Isso porque gerar o complemento de uma string binaria
de comprimento n (linha 6) requer percorrer toda a string trocando 0 por 1 e vice-versa.
Por outro lado, determinar o representante de classe de um vertice (linha 7) consiste em
encontrar a maior sequencia de zeros consecutivos e move-los para o inıcio da string, o que
leva tempo O(n). Portanto, o Algoritmo 6 executa em tempo O(n2), o que ainda e mais
vantajoso para o desempenho do algoritmo que armazenar as adjacencias dos vertices na
memoria, ja que |V (Ok)| =(2k+1k
)/n e |E(Ok)| > k |V (Ok)|.
Exemplo 6 (Determina se dois vertices sao adjacentes). Considere os vertices u = 00011
e v = 00101. Desejamos saber se u e v sao adjacentes em O2. Como u tem k 1’s, segue
que u ∈ B2 e u ∈ O2 (Figura 4.1). Entao, a aplicacao do Algoritmo 6 sobre u resulta em:
Adjacencia em B2Adjacencia em O2 Representante de classe
obtida de ui de ui em O2
Fixa 1 no 1o zero u1 = 00111 u1 = 11000 σ(u1) = 00011Fixa 1 no 2o zero u2 = 01011 u2 = 10100 σ(u2) = 00101Fixa 1 no 3o zero u3 = 10011 u3 = 01100 σ(u3) = 00011
O Algoritmo 6 compara entao se v e igual a algum dos vertices obtidos na ultima
coluna. Observe que, neste caso, v = σ(u2) = 00101, assim o algoritmo termina na
segunda iteracao.
Lembramos que, nos grafos Bk dois vertices sao adjacentes se um subconjunto esta
contido no outro e, nos grafos Ok, dois vertices sao adjacentes se os subconjuntos sao
disjuntos. Na Figura 4.1 temos em destaque os vertices u = 00011 e seus adjacentes em
B2 (Figura 4.1(a)), em O2 Figura 4.1(b) e em O2 Figura 4.1(c).
10100 11010
11000 11100
00011 00111
00101
01001
01011
10011
10001
00110
01010
01101
10101
11001
10010
01100
01110
10110
(a) B2
10001
10100
01010
00101
10010
01001
01100
1100001100
00011
(b) O2
σ(r2)
σ(00011 ) σ(00101 )
σ(r1)
(c) O2
Figura 4.1: Os grafos B2, O2 e O2 em representacao binaria.
A seguir, descrevemos a entrada do algoritmo paralelo.
CAPITULO 4. ALGORITMO PROPOSTO 33
4.2 Entrada do Algoritmo
Atraves dos emparelhamentos modulares [11], podemos determinar dk2e coberturas de ver-
tices por ciclos disjuntos em Ok. Assim, escolhemos aleatoriamente uma destas coberturas
por ciclos disjuntos para ser a entrada do algoritmo. A quantidade de ciclos gerados varia
de acordo com o emparelhamento modular my. O numero de vertices em cada ciclo nao
e fixo, existindo ciclos relativamente longos ou ciclos tao pequenos que consistem apenas
em um vertice com um laco.
A partir de um emparelhamento modular my pre-determinado, geramos a cobertura
de vertices por ciclos disjuntos comecando por σ(r1). Quando o ciclo contendo σ(r1) esta
completo e se σ(r2) ainda nao esta em um ciclo, geramos o segundo ciclo a partir de σ(r2).
A partir desse ponto, toda vez que um ciclo e completado, buscamos o proximo vertice
que ainda nao esta em um ciclo e geramos o ciclo a partir dele.
Desde que σ(r1) deve ser o primeiro vertice do caminho viavel e σ(r2) deve ser o ultimo
vertice, se ambos estiverem no mesmo ciclo na cobertura de vertices por ciclos disjuntos
obtida, o ciclo e dividido em dois caminhos: um iniciando em σ(r1) e o outro iniciando
em σ(r2). De fato, para todos os ciclos obtidos, desconsideramos a aresta entre o primeiro
e o ultimo vertice, desde que o algoritmo paralelo trabalha com caminhos.
A seguir, descrevemos o algoritmo paralelo utilizado para concatenar os caminhos
obtidos a partir dos ciclos em Ok.
4.3 Fase paralela
A ideia geral do algoritmo paralelo e fornecer caminhos de Ok para cada processo, que
procura retornar um unico caminho da concatenacao dos caminhos recebidos. Quando
um processo j termina a concatenacao resultando em um unico caminho, um processo i
recebe o caminho de j e tenta concatenar com outro caminho. Isso e repetido ate que so
exista um unico processo e um unico caminho. Ao final da execucao, esperamos obter um
caminho viavel.
4.3.1 Inıcio do algoritmo
O inıcio do algoritmo paralelo consiste na distribuicao dos caminhos de Ok obtidos da
cobertura de vertices por ciclos disjuntos (linhas 3 a 6 do Algoritmo 7 na pagina 40).
Seja np o total de processos para a execucao do algoritmo paralelo e p o numero
do processo, onde p = 0, . . . , (np − 1). Denominamos de nCaminhos a quantidade de
caminhos obtidos de Ok.
CAPITULO 4. ALGORITMO PROPOSTO 34
O processo 0 e o processo responsavel por distribuir de forma aleatoria os caminhos
entre os np processos. Cada processo p recebe bnCaminhosnp
c caminhos de Ok. Se houver
caminhos que nao foram enviados a nenhum processo p, esses caminhos sao distribuıdos
um para cada um dos primeiros p processos (Exemplo 7).
Antes dessa distribuicao, porem, o vertice σ(r2) e removido do inıcio de seu caminho.
Isso porque σ(r2) deve ser o ultimo vertice do caminho viavel. Assim, esse vertice e
armazenado em uma lista a qual serao adicionados tambem os vertices que nao puderem
ser adicionados a um caminho. A fase sequencial do algoritmo trabalhara para adicionar
os vertices dessa lista ao caminho final retornado pelo algoritmo paralelo. Chamamos os
vertices dessa lista de prejuızos
Exemplo 7 (Distribuicao dos caminhos de Ok entre np processos). Considere o grafo
O6 com 23 ciclos obtidos do emparelhamento modular Π(m1) e assuma np = 4. Cada
processo p = 0, 1, 2, 3 recebe 5 caminhos. Os 3 caminhos restantes sao dados a p = 0, 1, 2
que recebem um caminho a mais que os outros.
Na proxima secao mostramos como o algoritmo paralelo executa a partir de agora ate
atingir o criterio de parada.
4.3.2 Comportamento dos processos
Os processos tentam concatenar caminhos de Ok para, ao final do algoritmo paralelo,
obtermos um unico caminho. Existem duas fases de concatenacao de caminhos:
Fase 1: cada processo tenta concatenar os caminhos recebidos na fase inicial do algoritmo;
Fase 2: um processo envia seu caminho final a outro processo que, por sua vez, tenta
concatenar ambos os caminhos.
As duas fases sao sempre executadas, exceto quando so existe um ciclo na cobertura de
vertices por ciclos disjuntos. Neste caso, o algoritmo paralelo nao executa as linhas 8 a 34
do Algoritmo 7, mas executa somente a partir da linha 35. Nesta situacao, consideramos
duas situacoes:
(1): um unico caminho P e |P | = |V (Ok)|. Esse caso so ocorreu ate agora para O1;
(2): um unico caminho P e |P | < |V (Ok)|. Ocorre quando obtemos dois ciclos na cober-
tura de vertices por ciclos disjuntos, porem, o segundo caminho contem somente o
vertice σ(r2). Para k ≤ 18, esse caso ocorre somente em O2 e O3, ambos para o
2-fator Π(m1).
CAPITULO 4. ALGORITMO PROPOSTO 35
A seguir, descrevemos as duas fases de concatenacao de caminhos no algoritmo para-
lelo.
Primeira fase de concatenacao de caminhos
Dentre os caminhos recebidos no inıcio do algoritmo, cada processo p escolhe dois caminhos
P1 e P2 para tentar concatena-los, retornando um unico caminho P . Os dois caminhos
P1 e P2 sao excluıdos do processo p e P e adicionado. Essa operacao e feita ate que cada
processo tenha somente um caminho (linhas 8 a 15 do Algoritmo 7).
O algoritmo procura minimizar o numero de prejuızos, que denotamos por ρ, durante
a concatenacao dos caminhos. Discutimos agora os criterios utilizados pelo algoritmo para
concatenar P1 e P2.
Denotamos por W ′ ◦W ′′ o caminho obtido por percorrer os vertices de um caminho
W ′ seguidos pelos vertices de um caminho W ′′. Dado um caminho W ′, denotamos por←−W ′ o caminho atravessado do ultimo para o primeiro vertice.
Assuma que |P1| ≤ |P2|. O maior numero de prejuızos possıvel na concatenacao de
P1 e P2 e ρ = (|P1| − 1) e o menor numero de prejuızos e ρ = 0. O algoritmo inicia com
α = 0 e α e incrementado a cada iteracao, ate que seja possıvel concatenar P1 e P2 ou
α = |P1|.
Considere P1 = (v1, v2, . . . , vq) e P2 = (w1, w2, . . . , wm). Na primeira iteracao, veri-
ficamos se P1 e P2 podem ser concatenados verificando as adjacencias dos vertices nas
extremidades dos caminhos. Ou seja:
• se {v1, w1}, entao P =←−P1 ◦ P2 (Figura 4.2(a));
• se {v1, wm}, entao P = P2 ◦ P1 (Figura 4.2(b));
• se {w1, vq}, entao P = P1 ◦ P2 (Figura 4.2(c));
• se {wm, vq}, entao P = P1 ◦←−P2 (Figura 4.2(d)).
Em qualquer destes casos, ρ = α = 0. Porem, se nao e possıvel concatenar P1 e P2, o
algoritmo prossegue verificando se P1 pode ser colocado entre dois vertices wi e wj de P2,
para 1 ≤ i ≤ j ≤ m, tal que {wi, wj} ∈ P2, {v1, w1} ∈ E(Ok) e {vq, wj} ∈ E(Ok). Neste
caso, obtemos P = (w1, . . . , wi) ◦ P1 ◦ (wj, . . . , wm).
Analogamente, verificamos se P2 pode ser colocado entre dois vertices de P1.
Porem, se finalmente P1 e P2 nao podem ser concatenados com ρ = 0, entao o algoritmo
prossegue incrementando α e, enquanto α < |P1|, verifica:
CAPITULO 4. ALGORITMO PROPOSTO 36
v1P1 P2
v2
v3
vq
w1
w2
w3
w4
wm
(a) {v1, w1}
v1P1 P2
v2
v3
vq
w1
w2
w3
w4
wm
(b) {v1, wm}
v1P1 P2
v2
v3
vq
w1
w2
w3
w4
wm
(c) {w1, vq}
v1P1 P2
v2
v3
vq
w1
w2
w3
w4
wm
(d) {wm, vq}
Figura 4.2: Possıveis concatenacoes de P1 e P2 para α = 0.
• se {v1, w1+α}, entao P =←−P1 ◦ (w1+α, . . . , wm) (Veja Figura 4.3(a) com α = 1);
• se {v1, wm−α}, entao P =←−P1 ◦←−−−−−−−−−−(w1, . . . , wm−α) (Veja Figura 4.3(b) com α = 1);
• se {w1, vq−α}, entao P =←−−−−−−−−−(v1, . . . , vq−α) ◦ P2 (Veja Figura 4.3(c) com α = 1);
• se {w1, v1+α}, entao P =←−−−−−−−−−(v1+α, . . . , vq) ◦ P2 (Veja Figura 4.3(d) com α = 1).
v1P1 P2
v2
v3
vq
w1
w2
w3
w4
wm
(a) {v1, w1+α}
v1P1 P2
v2
v3
vq
w1
w2
w3
w4
wm
(b) {v1, wm−α}
v1P1 P2
v2
v3
vq
w1
w2
w3
w4
wm
(c) {w1, vq−α}
v1P1 P2
v2
v3
vq
w1
w2
w3
w4
wm
(d) {w1, v1+α}
Figura 4.3: Possıveis concatenacoes de P1 e P2 para α = 1.
Novamente, em qualquer destes casos, ρ = α. Em todas as possıveis concatenacoes de
P1 e P2, se ocorrem prejuızos, os vertices sao todos do mesmo caminho. Assim, a lista de
prejuızos pode conter caminhos. Quando um processo termina de concatenar os caminhos
recebidos no inıcio do algoritmo, ele procura concatenar os caminhos existentes na lista
de prejuızos ao caminho P .
Discutimos agora algumas precaucoes observadas pelo algoritmo em relacao ao vertice
σ(r1), considerando que este deve ser o primeiro vertice do caminho viavel:
Caso 1: σ(r1) nao esta em P1 ou P2. E o caso mais simples, pois nao e necessario nenhum
cuidado quanto a perda do vertice inicial do caminho viavel e as concatenacoes
seguem a forma geral ja discutida. A Figura 4.4 ilustra esse caso com dois caminhos
do grafo O4. Como pode ser visto na Figura 4.4(a), o vertice σ(r1) = 000001111
nao esta em P1 e nem P2. Na Figura 4.4(b), concatenamos P1 e P2 com ρ = 0, pois
o primeiro vertice de P1 e 000011101 que e adjacente ao primeiro vertice de P2 que
e 000100111. Na Figura 4.4(c), temos o P =←−P1 ◦ P2.
CAPITULO 4. ALGORITMO PROPOSTO 37
000011101 000100111
000110011
000111001
P1 P2
000110101
001010011
000010111
000101101
000101011
(a) P1 e P2
000011101 000100111
000110011
000111001
P1 P2
000110101
001010011
000010111
000101101
000101011
(b) Concatenacao de P1 e P2
000011101
000100111
000110011
000111001
P
000110101
001010011
000010111
000101101
000101011
(c) P
Figura 4.4: Um exemplo de concatenacao de P1 e P2 em O4 no caso (1) com ρ = 0.
Caso 2: σ(r1) esta em P1 ou P2. E necessario que o vertice σ(r1) nao se torne prejuızo,
ou seja, P1 e P2 devem ser concatenados de modo que σ(r1) seja o primeiro vertice
em P . Suponha, sem perda de generalidade, que σ(r1) = v1 ∈ P1. Na primeira
iteracao, verificamos se P1 e P2 podem ser concatenados com ρ = α = 0:
• se {vq, w1}, entao P = P1 ◦ P2 (Figura 4.5(a));
• se {vq, wm}, entao P = P1 ◦←−P2 (Figura 4.5(b)).
v1P1 P2
v2
v3
vq
w1
w2
w3
w4
wm
(a) {vq, w1}
v1P1 P2
v2
v3
vq
w1
w2
w3
w4
wm
(b) {vq, wm}
Figura 4.5: Possıveis concatenacoes de P1 e P2 no caso (2), σ(r1) ∈ P1 e α = 0.
Porem, se nao e possıvel concatenar P1 e P2, o algoritmo prossegue verificando
se P2 pode ser colocado entre dois vertices vi e vj de P1, para 1 ≤ i ≤ j ≤ q,
tal que {vi, vj} ∈ P1, {w1, vi} ∈ E(Ok) e {wm, vj} ∈ E(Ok). Neste caso, P =
(v1, . . . , vi) ◦ P2 ◦ (vj, . . . , vq).
Porem, se finalmente P1 e P2 nao podem ser concatenados com ρ = 0, entao o
algoritmo prossegue incrementando α e, enquanto α < |P1|, verifica:
• se {vq, w1+α}, entao P = P1 ◦ (w1+α, . . . , wm) (Figura 4.6(a));
CAPITULO 4. ALGORITMO PROPOSTO 38
• se {vq, wm−α}, entao P = P1 ◦ (w1, . . . , wm−α) (Figura 4.6(b));
• se {vq−α, w1}, entao P = (v1, . . . , vq−α) ◦ P2 (Figura 4.6(c));
• se {vq−α, wm}, entao P = (v1, . . . , vq−α) ◦←−P2(Figura 4.6(d)).
v1P1 P2
v2
v3
vq
w1
w2
w3
w4
wm
(a) {vq, w1+α}
v1P1 P2
v2
v3
vq
w1
w2
w3
w4
wm
(b) {vq, wm−α}
v1P1 P2
v2
v3
vq
w1
w2
w3
w4
wm
(c) {vq−α, w1}
v1P1 P2
v2
v3
vq
w1
w2
w3
w4
wm
(d) {vq−α, wm}
Figura 4.6: Possıveis concatenacoes de P1 e P2 no caso (2), σ(r1) = v1 ∈ P1 e α = 1.
O melhor resultado na concatenacao de P1 e P2 e quando P1 e P2 sao concatenados
com ρ = 0. O pior resultado, e quando P1 e P2 sao concatenados com ρ = (|P1| − 1).
Obtemos ρ = |P1| se nao foi possıvel concatenar P1 e P2 quando entao o processo retorna
P2 = P . Neste caso, se, σ(r1) ∈ P1, o algoritmo retorna P1 = P , pois o vertice σ(r1) nao
pode se tornar prejuızo.
A seguir, mostramos como os np processos concatenam P1 e P2, a partir do P de cada
processo, obtido da concatenacao dos caminhos iniciais.
Segunda fase de concatenacao de caminhos
A segunda fase de concatenacao de caminhos ocorre quando cada processo tem um unico
caminho P ao final da primeira fase de concatenacao. Adicionamos uma barreira nesse
ponto do algoritmo para sincronizar os np processos (linhas 17 a 29 do Algoritmo 7).
Neste trabalho, utilizamos np par. Enquanto np ≥ 1, os primeiros np2
processos re-
cebem um caminho dos ultimos np2
processos, que chamaremos de W , para concatenar
com seu caminho P correspondente. A concatenacao segue as mesmas regras discuti-
das na primeira fase. O numero de processos e reduzido pela metade a cada iteracao
(Exemplo 8).
Exemplo 8 (Concatenacao de caminhos de processos diferentes). Assuma np = 4:
processo 3 envia P = W para o processo 0
processo 2 envia P = W para o processo 1
Os processos p = 0 e p = 1 tentam concatenar o caminho W recebido com o caminho
P obtido na fase anterior. O numero de processos diminui pela metade.
CAPITULO 4. ALGORITMO PROPOSTO 39
processo 1 envia P = W para o processo 0
O processo 0 tenta concatenar o caminho W recebido com o seu caminho P .
Na proxima secao, descrevemos o algoritmo sequencial que busca adicionar adequada-
mente em P os ρ prejuızos ocorridos no algoritmo paralelo, a fim de obter um caminho
viavel.
4.4 Fase sequencial para concatenacao dos prejuızos
A fase sequencial do algoritmo inicia quando np = 1 e consiste em adicionar adequada-
mente em P , os ρ prejuızos ocorridos no algoritmo paralelo (Algoritmo 8).
Lembramos, pela construcao do Algoritmo 7, que o primeiro vertice de P e o vertice
σ(r1) e que σ(r2) foi o primeiro vertice que se tornou prejuızo. Se |P | = |V (Ok)| e o
ultimo vertice de P e adjacente a σ(r2), adicionamos o vertice σ(r2) na ultima posicao
de P e encontramos um caminho viavel de Ok. Caso contrario, utilizamos o algoritmo
SS99 [26], descrito na Secao 3.1 - Algoritmo 1, para tentar adicionar os ρ prejuızos em P
(linha 8 do Algoritmo 8).
O algoritmo SS99 [26] trabalha adicionando vertices sempre na ultima posicao em P
(Secao 3.1).
Apos a execucao do algoritmo SS99 [26], se |P | = |V (Ok)|, P e um caminho viavel
(linha 10 do Algoritmo 8). Observe que, se P nao e um caminho viavel, nao significa que
nao exista um caminho viavel para Ok.
Para fins de backup, a cada 23 horas, e gravado em arquivo o caminho atual P . O
algoritmo esta preparado para restaurar esse arquivo de backup e continuar a busca pelo
caminho viavel de Ok, pois o algoritmo SS99 [26] recebe um caminho P como entrada e
continua a concatenacao a partir do ultimo vertice em P .
Mostramos, a seguir, um exemplo do funcionamento geral do algoritmo paralelo sobre
o grafo O4. O exemplo do algoritmo sequencial a partir do caminho obtido desse exemplo
do algoritmo paralelo pode ser visto no Exemplo 5 (Secao 3.1).
4.5 Exemplo de execucao
Considere o grafo O4 com 14 vertices (Figura 4.7(a)) e o 2-fator Π(m2) = Π(m4) com 4
ciclos (Figura 4.7(b)). Nesse exemplo, destacamos os vertices σ(r1) e σ(r2) em negrito.
Observe, na Figura 4.7(b), que os vertices σ(r1) e σ(r2) fazem parte do mesmo ciclo:
σ(r1)=000001111, 000010111, 000110101, σ(r2)=001010101, 000101011, 000011101.
CAPITULO 4. ALGORITMO PROPOSTO 40
Algoritmo 7: Algoritmo paralelo para encontrar um caminho viavel em Ok
Entrada: Numero de processos np e arquivo contendo cobertura de vertices porciclos disjuntos de Ok
1 inıcio2 Inicializa o MPI3 se processo = 0 entao
4 totalCaminhos ← caminhos obtidos a partir dos ciclos de Ok
5 distribuir totalCaminhos entre os np processos
6 fim se7 se totalCaminhos > 1 entao8 se processo 6= 0 entao9 receber todos os caminhos enviados pelo processo 0
10 fim se11 enquanto existir mais de 1 caminho faca12 P ← resultado concatenacao(P1, P2)13 excluir P1 e P2 do processo14 inserir P no final de todos os caminhos do processo
15 fim enqto16 //*Nesse ponto, cada processo tem um unico caminho P*//
17 Barreira para sincronizar os np processos18 enquanto (processo < np) e (np > 1) faca19 rank ← (np− 1)− processo20 se processo ≥ np
2entao
21 concatenar prejuizos(P )22 enviar P para o processo rank
23 senao24 W ← receber P do processo rank25 P ← resultado concatenacao(P,W )26 concatenar prejuizos(P )
27 fim se28 np← np/2
29 fim enqto30 //*se so existe um processo, P e o caminho final da fase paralela*//
31 se np = 1 e processo = 0 entao
32 atualizar a posicao de todos os vertices de Ok que estao em P33 fim se
34 fim se35 salvar arquivo com o resultado final da fase paralela36 inıcio do algoritmo sequencial para adicionar prejuızos em P //*Algoritmo 8*//
37 Finaliza MPI
38 fim
CAPITULO 4. ALGORITMO PROPOSTO 41
Algoritmo 8: Algoritmo sequencial para encontrar um caminho viavel em Ok
Entrada: O caminho atual P , um grafo Ok, σ(r1) e σ(r2)1 inıcio2 se vertice na posicao 0 de P = σ(r1) entao
3 se (|P | = |V (Ok)| − 1 e (ultimo vertice ∈ P e adjacente a σ(r2)) entao4 adicionar o vertice σ(r2) ao final de P5 salvar arquivo com o caminho viavel P6 retorna true
7 fim se
8 SS99(P, Ok, σ(r1), σ(r2)) //*Algoritmo 1*//
9 salvar arquivo com o caminho P final
10 se |P | = |V (Ok)| entao11 retorna true12 fim se
13 fim se14 retorna false
15 fim
Entao, esse ciclo e dividido em dois caminhos: W1 iniciando pelo σ(r1) e W2 iniciando
pelo σ(r2):
W1 : (000001111, 000010111, 000110101)
W2 : (001010101, 000101011, 000011101)
O processo 0 remove o vertice σ(r2) ∈ W2 adicionando-o a lista de prejuızos. Obtemos,
entao, 5 caminhos para distribuir aos processos:
W1 : (000001111, 000010111, 000110101)
W2 : (000101011, 000011101)
W3 : (000111001, 000011011, 000100111)
W4 : (001001011, 000101101, 001001101, 001010011)
W5 : (000110011)
Assuma np = 2. O processo 0 distribui os cinco caminhos aleatoriamente entre os np
processos. Suponha que o processo 0 atribui os caminhos W1 e W4 para o processo 1 e os
caminhos W2, W3 e W5 para si mesmo.
Cada processo entao procura concatenar seus caminhos em um unico caminho P
(Secao 4.3.2). O processo 0 tenta concatenar P1 e P2:
W2 = P1 : (000101011, 000011101)
W3 = P2 : (000111001, 000011011, 000100111)
E possıvel concatenar P1 e P2 com ρ = 0, pois o primeiro vertice de P1 e 000101011 que
e adjacente ao ultimo vertice de P2 que e 000100111. Os caminhos P1 e P2 sao excluıdos
do processo 0 e o novo caminho P e adicionado. O processo 0 tem agora dois caminhos:
CAPITULO 4. ALGORITMO PROPOSTO 42
σ(000010111)
σ(000111001)
σ(000100111)
σ(000101011)
σ(001010101 )
σ(000110101)
σ(001010011)σ(000101101)
σ(000001111 )
σ(000011011)
σ(000011101)
σ(001001101)
σ(000110011)
σ(001001011)
(a) O grafo O4
σ(000010111)
σ(000111001)
σ(000100111)
σ(000101011)
σ(001010101 )
σ(000110101)
σ(001010011)σ(000101101)
σ(00001111 )
σ(000011011)
σ(000011101)
σ(001001101)
σ(000110011)
σ(001001011)
(b) O grafo O4 dividido em 4 ciclos
Figura 4.7: O grafo O4 e o 2-fator Π(m2) = Π(m4).
W5 = P1 : (000110011)
P2 : (000111001, 000011011, 000100111, 000101011, 000011101).
Novamente e possıvel concatenar os dois caminhos com ρ = 0, pois o primeiro vertice
de P1 e 000110011 que e adjacente ao primeiro vertice de P2 que e 000111001. O processo
0 agora so tem um unico caminho P :
P : (000110011, 000111001, 000011011, 000100111, 000101011, 000011101).
O processo 1 tenta concatenar os caminhos iniciais P1 e P2:
W1 = P1 : (000001111, 000010111, 000110101)
W4 = P2 : (001001011, 000101101, 001001101, 001010011)
O processo 1 deve concatenar P1 e P2 de modo que o vertice σ(r1)=000001111 seja
CAPITULO 4. ALGORITMO PROPOSTO 43
o primeiro vertice em P . O ultimo vertice de P1 e 000110101 que e adjacente ao ultimo
vertice de P2 que e 001010011 e assim o processo 1 concatena P1 e P2 com ρ = 0. O
caminho final e:
P : (000001111, 000010111, 000110101, 001010011, 001001101, 000101101, 001001011).
Agora se inicia a segunda fase de concatenacao de caminhos (Secao 4.3.2). O processo
1 envia seu caminho para o processo 0. O processo 0 tem entao os caminhos:
P = P1 : (000110011, 000111001, 000011011, 000100111, 000101011, 000011101)
W = P2 : (000001111, 000010111, 000110101, 001010011, 001001101, 000101101, 001001011)
O processo 0 deve tentar concatenar P1 = P e P2 = W de maneira que o vertice
000001111=σ(r1) ∈ P2 continue sendo o primeiro vertice ao final da concatenacao e com
o menor ρ possıvel. No entanto, nao e possıvel concatenar P1 e P2 com ρ = 0. O proximo
passo e tentar concatenar P1 e P2 com ρ = 1. Verificamos que o penultimo vertice de P2
e 000101101 que e adjacente ao ultimo vertice de P1 que e 000011101. O caminho P final
da concatenacao de P1 e P2 e entao:
P : (000001111, 000010111, 000110101, 001010011, 001001101, 000101101, 000011101,
000101011, 000100111, 000011011, 000111001, 000110011).
Apos a concatenacao dos dois caminhos, o processo 0 verifica se e possıvel concatenar
seus prejuızos em P . So existe um prejuızo no processo 0 que e o vertice 001001011. Entao
o processo 0 verifica a cada duas posicoes de P se e possıvel adicionar 001001011 entre
essas posicoes. E possıvel concatenar o prejuızo na posicao 5, pois o vertice 001001011 e
adjacente ao vertice 001010011 da posicao 4 e ao vertice que estava na posicao 5 que e
001001101. O caminho P final da fase paralela e mostrado na Figura 4.8.
000110101
001010011
001001011
001001101
P
000101101
000011101
000010111
000001111 = σ(r1)
000101011
000100111
000011011
000111001
000110011
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
(12)
(13)
Figura 4.8: Caminho final P da fase paralela com 92% dos vertices de O4.
Com isso, o algoritmo paralelo termina com |P | = 13 e 92% dos vertices de Ok,
CAPITULO 4. ALGORITMO PROPOSTO 44
restando adicionar em P o vertice σ(r2).
O diagrama da Figura 4.9 ilustra o funcionamento do Algoritmo 7 que acabamos de
descrever. As fases (2.1) e (2.2) se referem a primeira e segunda fase de concatenacao de
caminhos, respectivamente.
W1
W2
W3
W4
W5
W2
W3
W5
W1
W4
Processo 0 Processo 1
W2 = P1 W3 = P2 PW5 = P1 P2 W1 = P1 W4 = P2 P
P = P1 W = P2
σ(r1)σ(r1)
σ(r1)
σ(r1)
σ(r1)
Processo 0
Processo 0
P
P final
Fase inicial − distribuir caminhos aos processos
(2.1)
(2.2)
Envia P
v
v
Figura 4.9: Diagrama do algoritmo paralelo para O4 e o 2-fator Π(m2) = Π(m4).
Apos a execucao do algoritmo paralelo, temos ρ = 1 prejuızo. O algoritmo sequencial
tenta agora adicionar esse prejuızo em P , o que e feito com sucesso conforme Exemplo 5
da Secao 3.1.
Capıtulo 5
Analise dos Resultados
Utilizamos para os testes os seguintes computadores: (i) o supercomputador Altix 4700
Bachianas com 272 Gb de memoria RAM, 68 processadores Dual-Core Intel Itanium (136
nucleos de processamento no total) e sistema operacional Linux – o qual chamamos de
supercomputador; (ii) um computador desktop com 4 processadores Intel(R) Core(TM)
i5 de 3.20 GHz, 4 Gb de memoria RAM e sistema operacional GNU/Linux de 32 bits – o
qual chamamos de desktop.
O supercomputador possui varias filas. A Tabela 5.1 mostra as filas utilizadas para os
testes. Em todos os testes utilizamos o maximo de recursos disponıveis para cada fila.
Filas Bachianas
FilaCPU’s Memoria Jobs por usuario Walltime
(min/max) (max) (max) (max)Serial 1/1 20 Gb 4 720 horasP1-2 1/2 20 Gb - 24 horasP4 4/4 12 Gb - 24 horasP8 8/8 24 Gb 8 24 horasP16 16/16 48 Gb 2 24 horasP32 32/32 96 Gb 1 (2 pela fila) 24 horas
Tabela 5.1: Configuracoes das Filas Bachianas utilizadas nos testes1.
Realizamos testes em Ok, para k ≤ 18. Para k ≤ 14, encontramos um caminho viavel
para todos os grafos e os resultados podem ser vistos na Tabela 5.2. Para 15 ≤ k ≤ 18,
temos resultados parciais (Tabela 5.4).
Conforme Tabela 5.2, para 1 ≤ k ≤ 12, o algoritmo foi testado para todas as dk2e
coberturas de vertices por ciclos disjuntos em Ok. Para k = 13 foi testado para os 2-
fatores Π(m2) e Π(m4) e para k = 14 o teste foi feito somente para o 2-fator Π(m4).
A Tabela 5.2 mostra o valor do k testado, a cobertura de vertices por ciclos disjuntos
1http://compcient.ufabc.edu.br/?p=Filas_Bachianas, acesso em 12-fev-2013
45
CAPITULO 5. ANALISE DOS RESULTADOS 46
escolhida, o numero de ciclos na cobertura e o numero de vertices do Ok. Mostra ainda,
o numero de CPU’s utilizadas, a porcentagem do caminho do algoritmo paralelo e o
tempo de execucao do algoritmo paralelo e o tempo de execucao do algoritmo sequencial
separados e por fim, na ultima coluna, o tempo total de execucao.
Instancias Testadas Resultados
kCobertura Numero |V (Ok)| Num. de % de P do Tempo Tempo Total depor Ciclos Ciclos CPU’s alg. paralelo paralelo seq. execucao
1 Π(m1) 1 1 1 100% 0s - 0s2 Π(m1) 2 2 1 100% 0s 0s 0s
3Π(m1) 2
51 100% 0s 0s 0s
Π(m2) 3 2 100% 0s 0s 0s
4Π(m1) 5
14 292% 0s 0s 0s
Π(m2) 4 92% 0s 0s 0s
5Π(m1) 8
42 297% 0s 0s 0s
Π(m2) 7 97% 0s 0s 0sΠ(m3) 10 97% 0s 0s 0s
6Π(m1) 23
132 273% 0s 0s 0s
Π(m2) 14 82% 0s 0s 0sΠ(m3) 15 86% 0s 0s 0s
7
Π(m1) 52
429 4
37% 0s 0s 0sΠ(m2) 27 70% 0s 0s 0sΠ(m3) 28 82% 0s 0s 0sΠ(m4) 31 52% 0s 0s 0s
8
Π(m1) 166
1.430 4
34% 0s 0s 0sΠ(m2) 52 88% 0s 0s 0sΠ(m3) 54 50% 0s 0s 0sΠ(m4) 59 74% 0s 0s 0s
9
Π(m1) 465
4.862 8
10% 1s 1s 2sΠ(m2) 102 82% 1s 1s 2sΠ(m3) 99 65% 0.5s 0.5s 1sΠ(m4) 104 85% 0.5s 0.5s 1sΠ(m5) 489 83% 1s 1s 2s
10
Π(m1) 1.505
16.796 16
59% 4s 5s 9sΠ(m2) 194 50% 4s 6s 10sΠ(m3) 191 86% 3s 4s 7sΠ(m4) 416 40% 5s 5s 10sΠ(m5) 267 23% 7s 5s 12s
11
Π(m1) 4.702
58.786 16
45% 25s 155s 180sΠ(m2) 384 94% 70s 13s 83sΠ(m3) 413 81% 100s 31s 131sΠ(m4) 399 43% 50s 131s 181sΠ(m5) 408 66% 100s 66s 166sΠ(m6) 4.709 68% 75s 80s 155s
12
Π(m1) 15.554
208.012 32
57% 10m 21m 31mΠ(m2) 983 38% 20m 13m 33mΠ(m3) 714 63% 12m 18m 30mΠ(m4) 885 50% 18m 15m 33mΠ(m5) 824 40% 20m 12m 32mΠ(m6) 1.329 60% 10m 21m 31m
13Π(m2) 1.618
742.900 3271% 4h 4,2h 8,2h
Π(m4) 1.496 81% 5h 3h 8h14 Π(m4) 2.818 2.674.440 32 80% 1d 2,69d 3,69d
Tabela 5.2: Resultados do algoritmo proposto para Ok e k ≤ 14.
CAPITULO 5. ANALISE DOS RESULTADOS 47
O tempo total de execucao do algoritmo proposto e a soma dos dois tempos de exe-
cucao, ou seja, do tempo de execucao do algoritmo paralelo seguido do algoritmo SS99.
O numero de CPU’s se refere a qual fila do supercomputador (Tabela 5.1) o algoritmo
paralelo foi executado.
Implementamos o algoritmo paralelo em C/C++ e OpenMPI 1.4 e utilizamos para os
testes no supercomputador o compilador g++ com as seguintes opcoes:
-pthread -lmpi_cxx -lmpi -lopen-rte -lopen-pal -ldl -Wl,-export-dynamic
-lnsl -lutil -lm -ldl.
Para k ≤ 13, foi possıvel executar todo o algoritmo no supercomputador, isto e, a parte
paralela e a concatenacao dos prejuızos da parte sequencial, pois o tempo de execucao
foi menor que as 24 horas disponıveis nas filas do supercomputador (Tabela 5.1). Para
k ≥ 14 nao foi possıvel executar o algoritmo em menos de 24 horas. Portanto, a parte
paralela foi executada em uma fila paralela e a parte de concatenacao de prejuızos foi
testada tanto na fila serial do supercomputador quanto no desktop.
O k = 1 e o unico caso onde nao existe prejuızo, pois so existe um ciclo e um unico
vertice com laco. Portanto, esse vertice ja e o caminho viavel. Nos outros casos, sempre
vai existir prejuızo de no mınimo um, pois o vertice σ(r2) nunca e enviado a nenhum
processo. Para 2 ≤ k ≤ 5 a execucao paralela terminou faltando somente o vertice σ(r2)
em P para todas as coberturas, e foi possıvel concatena-lo ao ultimo vertice de P sem
executar o algoritmo SS99 [26]. O mesmo nao ocorreu para k ≥ 6, onde todas as instancias
testadas executaram o algoritmo SS99 para concatenar seus prejuızos.
Em geral o 2-fator Π(my), 1 ≤ y ≤ dk2e, com menor numero de ciclos apresenta o
melhor tempo de execucao (Tabela 5.3). Assim, para k = 13, 14, 15, nao executamos
o algoritmo proposto para todas as coberturas Π(my). Observamos que, em geral, a
cobertura com menor numero de ciclos ocorre na cobertura Π(mi), para i ≈ dk4e. Veja,
por exemplo, a cobertura Π(m3) para k = 9 e a cobertura Π(m3) para k = 12 (Tabela 5.2).
Por outro lado, as coberturas Π(m1) e Π(md k2e) geralmente contem os maiores numeros
de ciclos.
A Tabela 5.4 mostra os resultados parciais do algoritmo proposto para Ok e 15 ≤k ≤ 18. Para k = 16, 17, o algoritmo proposto executou tendo como entrada os ciclos
parciais da cobertura e o restante dos vertices que nao estavam em nenhum ciclo, foram
colocados como prejuızos. Para k = 16, utilizamos os 135 primeiros ciclos gerados com
um total de 847.173 vertices e, para k = 17, utilizamos os 18 primeiros ciclos gerados
com um total de 155.312 vertices. Para k = 15 o teste foi feito com a cobertura Π(m4).
Para k = 18, testamos somente com o algoritmo sequencial SS99 que implementamos, pois
ainda nao geramos as coberturas de vertices por ciclos disjuntos para esse valor de k. Para
k = 15, 16, 17 executamos o algoritmo paralelo com 32 CPUS’s no supercomputador e o
CAPITULO 5. ANALISE DOS RESULTADOS 48
Melhor Resultado de execucaok Maior no de ciclos Menor no de ciclos 2o menor no de ciclos3 Π(m2) = 3 – –4 Π(m1) = 5 – –5 – – Π(m1) = 86 – – Π(m3) = 157 – Π(m2) = 27 –8 – – Π(m3) = 549 – Π(m3) = 99 –10 – Π(m3) = 191 –11 – Π(m2) = 384 –12 – Π(m3) = 714 –13 – Π(m4) = 1.496 –14 – Π(m4) = 2.818 –
Tabela 5.3: O 2-fator com melhor tempo de execucao em Ok, para 3 ≤ k ≤ 14.
algoritmo sequencial na fila serial do supercomputador e no desktop, exceto para k = 17
que foi executado somente no supercomputador. Para k = 18, executamos na fila serial
do supercomputador.
Instancias Testadas Resultados
kCobertura |V (Ok)|
Num. Vertices do % vertices de Tempo de
por Ciclos maior caminho P Ok em P Execucao15 Π(m4) 9.694.845 9.532.032 98 31d16 Π(m4) 35.357.670 29.126.302 82 31d17 Π(m5) 129.644.790 92.048.438 71 32d18 – 477.638.700 267.750.220 56 3d
Tabela 5.4: Resultados parciais do algoritmo proposto em Ok, para 15 ≤ k ≤ 18.
A Tabela 5.5 e a Tabela 5.6 mostram o tempo gasto para gerar a cobertura de ver-
tices por ciclos disjuntos para k ≤ 17, que foram utilizados como entrada inicial para os
processos no algoritmo paralelo.
A Tabela 5.7 mostra um comparativo de tempo de execucao entre os algoritmos: SS99,
SS04, SSS09 e o algoritmo proposto, denominado de GBH. Observe que os algoritmos
SS99, SSS09 e GBH procuram caminhos viaveis em Ok = Bk, enquanto o algoritmo
SS04 procura ciclos hamiltonianos diretamente em Ok. Os tempos de execucao para
os algoritmos SS99, SS04 e SSS09 foram obtidos nos artigos [26, 27, 28]. O algoritmo
SS99 [26] foi testado em um computador Intel Pentium-II de 400 MHz e 192 MB de
memoria RAM; o algoritmo SS04 [27] em um computador desktop com 1.6GHz e 640MB
de memoria RAM; e, o algoritmo SSS09 [28] em um computador AMD Athlon 3500+ com
2 GB de memoria RAM de 64 bits. O algoritmo GBH foi testado no supercomputador,
conforme numero de CPU’s descrito na Tabela 5.2 para cada valor de k.
A Tabela 5.8 mostra um comparativo de tempo de execucao entre os algoritmos GBH
e o SS99 que implementamos. Consideramos o menor tempo de execucao do GBH para as
CAPITULO 5. ANALISE DOS RESULTADOS 49
Instancias Testadas Resultados
kCobertura Numero de |V (Ok)| Tempo depor Ciclos Ciclos Execucao
1 Π(m1) 1 1 0s2 Π(m1) 2 2 0s
3Π(m1) 2
5 0sΠ(m2) 3
4Π(m1) 5
14 0sΠ(m2) 4
5Π(m1) 8
42 0sΠ(m2) 7Π(m3) 10
6Π(m1) 23
132 0sΠ(m2) 14Π(m3) 15
7
Π(m1) 52
429 0sΠ(m2) 27Π(m3) 28Π(m4) 31
8
Π(m1) 166
1.430 0sΠ(m2) 52Π(m3) 54Π(m4) 59
9
Π(m1) 465
4.862 0sΠ(m2) 102Π(m3) 99Π(m4) 104Π(m5) 489
10
Π(m1) 1.505
16.796 0sΠ(m2) 194Π(m3) 191Π(m4) 416Π(m5) 267
11
Π(m1) 4.702
58.786 1s
Π(m2) 384Π(m3) 413Π(m4) 399Π(m5) 408Π(m6) 4.709
12
Π(m1) 15.554
208.012 5s
Π(m2) 983Π(m3) 714Π(m4) 885Π(m5) 824Π(m6) 1.329
13
Π(m1) 51.179
742.900
22sΠ(m2) 1.618 21sΠ(m3) 8.493 22sΠ(m4) 1.496 21sΠ(m5) 8.621 22sΠ(m6) 1.676 21sΠ(m7) 51.467 22s
Tabela 5.5: Tempo de execucao do algoritmo para gerar as coberturas de vertices porciclos disjuntos para Ok e k ≤ 17. Continuacao na Tabela 5.6.
CAPITULO 5. ANALISE DOS RESULTADOS 50
Instancias Testadas Resultados
kCobertura Numero de |V (Ok)| Tempo depor Ciclos Ciclos Execucao
14
Π(m1) 172.904
2.674.440
1m 33sΠ(m2) 3.249
1m 30s
Π(m3) 2.936Π(m4) 2.818Π(m5) 3.191Π(m6) 2.913Π(m7) 8.255
15
Π(m1) 587.032
9.694.845
6m 18sΠ(m2) 7.089 6m 7sΠ(m3) 6.196 6m 8sΠ(m4) 5.635 6m 9sΠ(m5) 5.026 6m 9sΠ(m6) 5.847 6m 8sΠ(m7) 6.944 6m 9sΠ(m8) 588.065 6m 19s
16
Π(m1) 2.020.619
35.357.670
28m 3sΠ(m2) 15.374 27m 27sΠ(m3) 10.803 27m 49sΠ(m4) 11.062 27m 26sΠ(m5) 10.091 27m 46sΠ(m6) 276.230 27m 44sΠ(m7) 10.925 27m 33sΠ(m8) 57.738 27m 22s
17
Π(m1) 7.002.478
129.644.790
4h 6mΠ(m2) 36.660 4h 3mΠ(m3) 22.316 4h 3mΠ(m4) 26.034 4h 7mΠ(m5) 23.877 4h 30mΠ(m6) 21.899 4h 4mΠ(m7) 24.624 4h 3mΠ(m8) 35.136 4h 2mΠ(m9) 7.006.106 4h 8m
Tabela 5.6: Tempo de execucao do algoritmo para gerar as coberturas de vertices porciclos disjuntos para Ok e k ≤ 17. Continuacao da Tabela 5.5.
CAPITULO 5. ANALISE DOS RESULTADOS 51
Tempo de Execucaok SS99 SS04 SSS09 GBH1 NC NC NC 0s2 NC NC NC 0s3 NC NC NC 0s4 NC NC NC 0s5 NC 0s NC 0s6 NC 0s NC 0s7 NC 0s NC 0s8 0s 1s 0s 0s9 1s 31s 0s 1s10 2s 711s 0s 7s11 18s 2,9h 2s 83s12 235s 1,8d 10s 30m13 49m 28,6d 99s 8h14 10h NC 799s 3,69d15 21d NC 2,6h NC16 NC NC 1,2d NC17 NC NC 20,4d NC
Tabela 5.7: Comparativo de tempo de execucao entre os algoritmos para Ok ou Ok. NC:nao consta.
coberturas de vertices por ciclos disjuntos testadas e o algoritmo sequencial SS99 foi exe-
cutado uma unica vez no desktop, tendo como entrada somente σ(r1) que pela construcao
do algoritmo tem que ser o primeiro vertice do caminho viavel.
Tempo de Execucaok GBH SS991 0s 0s2 0s 0s3 0s 0s4 0s 0s5 0s 0s6 0s 0s7 0s 0s8 0s 0s9 1s 1s10 7s 10s11 83s 75s12 30m 28m13 8h 6,30h14 3,69d 3,68d
Tabela 5.8: Comparativo do tempo de execucao entre o algoritmo GBH e nossa imple-mentacao do algoritmo SS99 para Ok.
Observem na Tabela 5.8 que para k ≤ 9 o tempo de execucao e o mesmo entre os
algoritmos GBH e a nossa implementacao do SS99. Para k = 10, 11, 12, 14 nao ha muita
diferenca no tempo de execucao entre os algoritmos. A maior diferenca e para k = 13, para
o qual SS99 executou mais rapido que GBH. O algoritmo GBH apresentou um caminho
viavel na primeira execucao para k ≤ 14.
Capıtulo 6
Conclusao
Resultados no problema de ciclos e caminhos hamiltonianos em grafos Kneser e Kneser
bipartidos podem contribuir para problemas reconhecidamente difıceis, expressados em
conjecturas que permanecem abertas ha decadas.
Ate agora, caminhos viaveis foram encontrados apenas para Ok = Bk e k ≤ 17 [26, 28].
Neste trabalho, propomos um algoritmo para procurar caminhos viaveis no grafo reduzido
Ok = Bk e provamos que os emparelhamentos modulares determinam dk2e coberturas de
vertices por ciclos disjuntos nesse grafo reduzido. Utilizando uma cobertura de vertices
por ciclos disjuntos e uma abordagem paralela, ate agora determinamos caminhos viaveis
para k ≤ 14.
Como trabalhos futuros, pretendemos melhorar o desempenho do algoritmo, buscando
alcancar caminhos viaveis para mais valores de k. Para isso, pretendemos modificar
o algoritmo para arquitetura de 64-bits. Alem disso, pretendemos tambem otimizar o
tempo de execucao do algoritmo, modificando algumas estruturas de dados e operacoes
relacionadas. Por exemplo, a princıpio, para verificar se um vertice ja estava em um
ciclo ou caminho, precisavamos utilizar uma busca sequencial na representacao do grafo.
Porem, gerar o 2-fator do O15, por exemplo, levou mais de 30 dias. Assim, modificamos o
algoritmo tal que, os vertices, fossem colocados em uma ordem tal que converter as strings
binarias para numeros decimais fornecesse uma ordenacao crescente. Consequentemente,
utilizamos agora uma busca binaria para encontrar um vertice na estrutura de dados, o que
reduziu o tempo para determinar o 2-fator do O15 em cerca de 6 minutos. Essa modificacao
ainda teve impacto no desempenho geral do algoritmo proposto que, a princıpio, necessitou
de 18 dias para encontrar um caminho viavel no grafo O14. Esse tempo foi reduzido para
menos de 4 dias, apos a modificacao.
Bueno et al. [3] provaram que um caminho viavel em ˜K(2k + 2, k) leva a um ciclo
hamiltoniano em K(2k + 2, k) e B(2k + 2, k), para k ımpar e que K(n, k) = B(n, k).
Recentemente [4], eles mostraram tambem que a existencia de um caminho viavel em
52
CAPITULO 6. CONCLUSAO 53
K(n, k) e uma condicao suficiente para a existencia de: (i) um caminho hamiltoniano em
K(2k + 3, k), para k ≡ 1 ou 2 (mod 3), e; (ii) um ciclo hamiltoniano em K(2k + 4, k),
para k ≡ 1 ou 3 (mod 4). No momento, trabalhamos na formalizacao de um resultado
que mostra como determinar uma cobertura de vertices por ciclos disjuntos nos grafos
reduzidos de K(2k + 2, k), K(2k + 3, k) e K(2k + 4, k) e, assim, podermos executar o
algoritmo proposto tambem nestes grafos. Ate o momento, e conhecido que existem ciclos
hamiltonianos para esses grafos somente ate k ≤ 12, k ≤ 12 e k ≤ 11, respectivamente.
Referencias Bibliograficas
[1] N. Biggs. Some odd graph theory. Second International Conference on Combina-
torics, 319:71–81, 1979.
[2] L. R. Bueno, L. Faria, C. M. H. Figueiredo, and G. D. Fonseca. Hamiltonian paths
in odd graphs. Applicable Analysis and Discrete Mathematics, 3(2):386–394, 2009.
[3] L. R. Bueno, C. M. H. Figueiredo, L. Faria, C. F. X. Mendonca, and R. A. Hausen.
Hamiltonian cycles in Kneser graphs for n = 2k + 2. Electronic Notes in Dis-
crete Mathematics, 37:291 – 296, 2011. LAGOS’11 - VI Latin-American Algorithms,
Graphs and Optimization Symposium.
[4] L.R. Bueno, C.M.H. Figueiredo, L. Faria, and R.A. Hausen. Hamiltonian cycles in
sparse Kneser graphs. 2011. A ser submetido.
[5] Alexandre Carissimi, Fabrice Dupros, Jean-Francois Mehaut, and Rafael Vanoni
Polanczyk. Aspectos de programacao paralela em arquiteturas numa. In Minicur-
sos do VIII Workshop em Sistemas Computacionais de Alto Desempenho, WSCAD
2007, October 2007.
[6] Y. Chen. Kneser graphs are hamiltonian for n ≥ 3k. Journal of Combinatorial
Theory Series B, 80:69–79, 2000.
[7] Y. Chen. Triangle-free hamiltonian Kneser graphs. Journal of Combinatorial Theory
Series B, 89(1):1–16, 2003.
[8] I. J. Dejter. Hamilton cycles and quotients of bipartite graphs. In Graph theory with
applications to algorithms and computer science (Kalamazoo, Mich., 1984), pages
189–199, Wiley, New York, 1985.
[9] I. J. Dejter, W. Cedeno, and V. Jauregui. A note on frucht diagrams, boolean graphs
and hamilton cycles. Discrete Mathematics, 5:131–135, 1992/93.
[10] I. J. Dejter, J. Cordova, and J. A. Quintana. Two hamilton cycles in bipartite
reflective Kneser graphs. Discrete Mathematics, 72(1):63–70, 1988.
54
REFERENCIAS BIBLIOGRAFICAS 55
[11] D. A. Duffus, H. A. Kierstead, and H. S. Snevily. An explicit 1-factorization in the
middle of the boolean lattice. Journal of Combinatorial Theory, Series A, 65:334–342,
1994.
[12] M. R. Garey and D. S. Johnson. Computers and Intractability, A Guide to the Theory
of NP-Completeness. W.H. Freeman and Company, New York, 1979.
[13] W. R. Hamilton. Letter to John T. Graves on the icosian, 17 oct., 1856. In H. Hal-
berstam and R. E. Ingram, editors, The Mathematical Papers of Sir William Rowan
Hamilton, volume 3 (Algebra), pages 612–625, New York, 1931. Cambridge Univer-
sity Press.
[14] I. Havel. Semipaths in directed cubes. In M. Fiedler (Ed.), editor, Graphs and other
Combinatorial Topics, pages 101–108, Teubner, Leipzig, 1983. Teubner-Texte Math.
[15] J. R. Johnson and H. A. Kierstead. Explicit 2-factorisations of the odd graph. Order,
21:19–27, 2004.
[16] R. M. Karp. Reducibility among combinatorial problems. In R.E. Miller and J.W.
Thatcher, editors, Complexity of Computer Computations, pages 85–103, New York,
1972. Plenum Press.
[17] M. S. Krishnamoorthy. An NP-hard problem in bipartite graphs. SIGACT News,
7(1):26, 1975.
[18] L. Lovasz. Problem 11. In Combinatorial Structures and their Applications. Gordon
and Breach, 1970.
[19] M. Mather. The Rugby footballers of Croam. Journal of Combinatorial Theory
Series B, 20(1):62–63, 1976.
[20] G. H. J. Meredith and E. K. Lloyd. The hamiltonian graphs O4 to O7. In Combina-
torics (Proc. Conf. Combinatorial Math., Math. Inst., Oxford, 1972), pages 229–236.
Institute of Mathematics and Its Applications, Southend, 1972.
[21] C. H. Papadimitriou and K. Steiglitz. Some complexity results for the traveling
salesman problem. In Proceedings of the eighth annual ACM symposium on Theory
of computing, pages 1–9, New York, 1976. Association for Computing Machinery.
[22] L. Posa. Hamiltonian circuits in random graphs. Discrete Mathematics, 14(4):359–
364, 1976.
[23] M. Vajtersic R. Trobec and P. Zinterhof. Parallel Computing: Numerics, Applica-
tions, and Trends. Springer Publishing Company, Incorporated, 1st edition, 2009.
REFERENCIAS BIBLIOGRAFICAS 56
[24] Mike Reid. E-mail to J Gallian. Correspondence describing work performed by David
Moews and Mike Reid on middle levels problem. 1990.
[25] S. H. Roosta. Parallel Processing and Parallel Algorithms: Theory and Computation.
Springer-Verlag, New York, 1999.
[26] I. Shields and C. D. Savage. A Hamilton path heuristic with applications to the
middle two levels problem. In Proceedings of the Thirtieth Southeastern Interna-
tional Conference on Combinatorics, Graph Theory, and Computing (Boca Raton,
FL, 1999), volume 140, pages 161–178, 1999.
[27] I. Shields and C. D. Savage. A note on Hamilton cycles in Kneser graphs. Bulletin
of the Institute for Combinatorics and Its Applications, 40:13–22, 2004.
[28] I. Shields, B. J. Shields, and C. D. Savage. An update on the middle levels problem.
Discrete Mathematics., 309(17):5271–5277, 2009.
Indice Remissivo
Adjacente, 3
Algoritmo
GBH, 48
SS04, 28
SS99, 22
SSS09, 28
Aresta, 3
adjacente, 3
paralela ou multipla, 3
Aresta-transitivo, 6
Automorfismo, 6
Caminho, 6
comprimento, 6
hamiltoniano, 7
viavel, 11
Ciclo, 6
comprimento, 6
hamiltoniano, 7
Classe de equivalencia, 10
Cobertura de vertices por ciclos, 7
disjuntos, 7
Complemento, 10
Computacao
paralela, 17
serial ou sequencial, 17
Emparelhamento, 5
modular, 13
perfeito, 5
Extremo, 3
Grafo, 3
ımpar, 8
quociente, 11
bipartido, 4
completo, 4
conexo, 7
desconexo, 7
dos nıveis intermediarios, 9
hamiltoniano, 7
hipohamiltoniano, 7
isomorfo, 4
Kneser, 7
Kneser bipartido, 8
nao-direcionado, 3
ponderado, 4
reduzido, 11
regular ou q-regular, 4
simetrico, 6
simples, 3
uniao, 5
Grau de um vertice, 4
Grupo de comunicacao, 18
Incidente, 3
Isomorfismo, 4
l-caminho, 6
l-ciclo, 6
Laco, 3
Message Passing Interface - MPI, 18
Passeio, 6
fechado, 6
Prejuızo, 34
q-fator, 5
57
INDICE REMISSIVO 58
q-fatoravel, 5
Rank, 18
Representacao binaria, 11
complemento, 13
Representante da classe, 11
Rotacao, 22
Shift, 13
Single Program Multiple Data - SPMD, 19
Sistemas
fortemente acoplados, 18
fracamente acoplados, 18
Subgrafo, 5
gerador, 5
induzido, 5
proprio, 5
tag, 18
Vertice, 3
Vertice-transitivo, 6