Graphe

Fermé
noussa90 - 13 juin 2013 à 21:45
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 14 juin 2013 à 05:56
Bonjour,


Quelqu'un pourra m'aider à compiler ce programme.

package gr.forth.ics.graph.algo;

import gr.forth.ics.graph.Edge;
import gr.forth.ics.graph.Graph;
import gr.forth.ics.graph.Node;
import java.util.List;
import java.util.Random;
import gr.forth.ics.util.Args;

/**
* WattsStrogatzGenerator is a graph generator that produces a small
* world network using the beta-model as proposed by Duncan Watts. The basic ideas is
* to start with a one-dimensional ring lattice in which each Node has k-neighbors and then randomly
* rewire the edges, with probability beta, in such a way that a small world networks can be created for
* certain values of beta and k that exhibit low charachteristic path lengths and high clustering coefficient.
* @see "Small Worlds:The Dynamics of Networks between Order and Randomness by D.J. Watts"

class WattsStrogatzGenerator {
private int numNodes = 0;
private double rewiringProbability = 0;
private int neighbors = 0;
private final Random random;

/**
* Creates a new instance of WattsStrogatzGenerator
*/
WattsStrogatzGenerator(Random random, int numNodes, double probability, int neighbors) {
Args.notNull(random);
Args.gte(numNodes, 2.0);
Args.inRangeII(probability, 0.0, 1.0);
Args.inRangeII(neighbors, 2, numNodes / 2);
this.random = random;
this.numNodes = numNodes;
this.rewiringProbability = probability;
this.neighbors = neighbors;
}

void generate(Graph graph) {
Generators.createRingLattice(graph, numNodes, neighbors);
List<Node> nodes = graph.nodes().drainToList();
//rewire edges
for (int i = 0; i < numNodes; i++) {
for (int s = 1; s <= neighbors; s++) {

while (true) {
// randomly rewire a proportion, beta, of the edges in the graph.
double r = random.nextDouble();
if (r < rewiringProbability) {
int v = random.nextInt(numNodes);

Node vthNode = nodes.get(v);
Node ithNode = nodes.get(i);
Node kthNode = nodes.get((i + s) % numNodes);//upIndex(i, s));
Edge e = graph.anEdge(ithNode, kthNode);

if (!graph.areAdjacent(kthNode, vthNode) && kthNode != vthNode) {
graph.removeEdge(e);
graph.newEdge(kthNode, vthNode);
break;
}
} else {
break;
}
}
}
}
}

/**
* Determines the index of the neighbor ksteps above
* @param numSteps is the number of steps away from the current index that is being considered.
* @param currentIndex the index of the selected vertex.
*/
private int upIndex(int currentIndex, int numSteps) {
if (currentIndex + numSteps > numNodes - 1) {
return numSteps - (numNodes - currentIndex);
}
return currentIndex + numSteps;
}

}

Merci
A voir également:

3 réponses

KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
13 juin 2013 à 21:52
Il faut déjà que tu télécharges les bibliothèques non standards que tu utilises, en l'occurrence FlexiGraph que tu trouveras au même endroit que le code source que tu nous as copié-collé.

Ensuite il suffit d'inclure cette bibliothèque à ton classpath à la compilation et à l'exécution, ce qui dépendra de ta configuration (OS et/ou IDE)
0
Bonsoir ,

Oui, oui je n'ai pas dis non plus que c'est mon propre code. En fait, je voulais quelque chose de tout prêt juste pour tester la méthode de Duncan Watts et voir ce que ça donne.

Cordialement ;
0
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
14 juin 2013 à 05:56
FlexiGraph n'a pas l'aire très riche en documentation, tu pourrais te tourner vers une autre bibliothèque comme GraphStream qui une documentation bien plus fournie, en particulier tu as cette page d'explication : Small-world graph model generator.

Mais pour compiler et utiliser le code c'est le même principe, il faut télécharger la bibliothèque et l'ajouter à ton classpath (c'est toujours comme ça en Java)

https://www.commentcamarche.net/telecharger/developpement/11415-graphstream/
0