Академический Документы
Профессиональный Документы
Культура Документы
Uma tarefa frequente na análise de redes sociais é a busca por comunidades. Uma
comunidade pode ser vista como um subconjunto de vértices da rede que, quando
comparado com vértices não pertencentes ao subconjunto, apresentam ligações mais
densas. Uma representação de comunidades é mostrada na Figura abaixo. Na Figura as
comunidades são demonstradas por vértices de cores e formato diferentes. Note como
existe uma maior quantidade de arestas entre vértices de uma mesma comunidade.
1
http://en.wikipedia.org/wiki/Girvan%E2%80%93Newman_algorithm
2
É comum computar o betweenness do vértice. Neste caso, estamos falando de betweeness da aresta!
Na Figura abaixo mostramos um grafo e a centralidade de cada aresta. Observe que, nas
arestas onde c = 2, existem caminhos dos vértices origem, A ou B, até C e um outro até
D. Note que, contabilizamos os caminhos da forma A->B e B->A como sendo apenas 1,
dado que o grafo não é direcionado. Em grafos direcionados, os valores de centralidades
se alteram. Se o objetivo fosse encontrar duas comunidades, iríamos simplesmente
remover a aresta vermelha, pois ela possui maior centralidade.
Pontos extras
Será dado 1 ponto extra para os trabalhos que apresentarem a comparação dos
algoritmos acima com implementações mais eficientes do Betweenness, como por
exemplo, a descrita a seguir. Implementações que consideram paralelismo também
podem ser consideradas, se devidamente testadas.
http://www.inf.uni-konstanz.de/algo/publications/b-fabc-01.pdf
Entrada
O arquivo de entrada é composto de n linhas, onde cada linha representa uma aresta. O
mesmo tem o seguinte formato:
node_id_1 node_id_2
...
O programa deve também receber como entrada o número de comunidades k que serão
gerados. Siga o formato abaixo:
comando <arquivo_arestas> <k>
Você deve testar o TP em pelo menos três grafos disponíveis em no link abaixo:
http://www-personal.umich.edu/~mejn/netdata/
Você pode gerar grafos aleatórios densos e esparsos para complementar seus testes,
porém sua estratégia de geração de grafos deve ser devidamente descrita. Apesar dos
grafos de teste não possuírem arestas negativas, você deve apresentar exemplos
simplificados (toy examples) que consideram arestas negativas e até mesmo ciclos
negativos, para o teste do algoritmo de Johnson.
Saída
Para cada n_o imprima qual comunidade o mesmo faz parte. Apenas isso. Exemplo:
node_id_1 1
node_id_2 1
node_id_3 1
node_id_3 2
...
Siga o formato do exemplo acima, ordenando os vértices pelo identificador
Entrega
O aluno deve entregar um README.pdf e o código. Entregue também um Makefile
que compila o código. O README deve conter as seguintes informações:
- Como você implementou os algoritmos apresentados? Quais as estruturas de dados
utilizadas.
- Qual o custo assimptótico (em Big-O) do tempo de execução e espaço
em memória utilizado de cada algoritmo e implementação?
- Em quais casos é esperado que o algoritmo de Johnson seja mais adequado
do que o Floyd-Warshall e vice-versa?
_ Em qual máquina o tp foi testado?
_ Como sua implementação se comporta em termos de tempo de execução e
memória alocada? Apresente uma variação experimental da solução, com
entradas de tamanho diferente tentando discutir também o melhor e o pior caso.
Apenas Java, C e C++ serão aceitos (arquivos .java, .c, .cpp e .h).
Neste TP não existe restrição de nomes e quantidade de arquivos.