Creation d'un graphe en java a partir d'une matrice d'adjacence
Résolu
Amira
-
Amira -
Amira -
Bonjour;
Je cherche a réer un graphe par utilisation de la librairie graphstream en java.
je dispose d'unje matrice d'adjacence que j'ai deja créé moi meme et je voudrais passer cette matrice en paramètre à une fonction pour créer et remplir le graphe mais j'y arrive pas.
J'ai deja essayé ça mais ça marche pas :
est ce que qlq peut m'aider svp c tres urgent.
Je cherche a réer un graphe par utilisation de la librairie graphstream en java.
je dispose d'unje matrice d'adjacence que j'ai deja créé moi meme et je voudrais passer cette matrice en paramètre à une fonction pour créer et remplir le graphe mais j'y arrive pas.
J'ai deja essayé ça mais ça marche pas :
public static SingleGraph CreateGraph(double mat[][],int nbSommets,String MyGraph){
SingleGraph g= new SingleGraph(MyGraph);
for(int i=0;i<nbSommets;i++)
for(int j=0;i<nbSommets;i++)
{
String id = ID(i,j);
g.addNode(id);
}
for(int i=0;i<nbSommets;i++)
{
for(int j=0;j<nbSommets;j++)
{
if(mat[i][j]==1) // il y a un arc
{
g.addEdge(ID(i,j),ID(i,j),ID(i,j));
}
}
}
return(g);
}
est ce que qlq peut m'aider svp c tres urgent.
1 réponse
-
Bonjour,
Pourquoi tu fais une matrice d'adjacence de typedouble[][]
?
Ce devrait plutôt être unboolean[][]
...
De plus tu as "nbSommets" sommets, par exemple 5, mais avec ta double boucleg.addNode(id)
tu en créés 25...
Et attention à la manière dont tu créées tes arc, si tu faisaddEdge(ID(i,j),ID(i,j),ID(i,j))
, cela signifie que le nœud de départ est identique à celui d'arrivé puisque tout les deux valent ID(i,j)...
import org.graphstream.graph.Edge; import org.graphstream.graph.Graph; import org.graphstream.graph.Node; import org.graphstream.graph.implementations.SingleGraph; public class Graph { private static String getId(int nodeId) { return "Node " + nodeId; } private static String getId(int nodeId, int neighborId) { return "Edge " + nodeId + " -> " + neighborId; } public static SingleGraph createGraph(String graphId, boolean[][] adjacencyMatrix) { SingleGraph graph = new SingleGraph(graphId); for (int nodeId = 0; nodeId < adjacencyMatrix.length; nodeId++) graph.addNode(getId(nodeId)); for (int nodeId = 0; nodeId < adjacencyMatrix.length; nodeId++) for (int neighborId = 0; neighborId < adjacencyMatrix[nodeId].length; neighborId++) if (adjacencyMatrix[nodeId][neighborId]) graph.addEdge(getId(nodeId, neighborId), getId(nodeId), getId(neighborId), true); return graph; } public static void main(String[] args) { boolean[][] adjacencyMatrix = new boolean[5][5]; adjacencyMatrix[0][1] = true; // 0 -> 1 adjacencyMatrix[1][2] = true; // 1 -> 2 adjacencyMatrix[2][0] = true; // 2 -> 0 adjacencyMatrix[3][4] = true; // 3 -> 4 Graph graph = createGraph("Graph", adjacencyMatrix); for (Node node : graph.getNodeSet()) node.addAttribute("ui.label", node.getId()); for (Edge edge : graph.getEdgeSet()) edge.addAttribute("ui.label", edge.getId()); graph.display(); } }
La confiance n'exclut pas le contrôle-
Merci pour ta réponse KX.
Je suis débutante en java et j'ai créé ma matrice d'adjacence en double pour témoigner de la présence de phrases dans d'autre phrases
c'est a dire que si j'ai la matrice suivante:
S1 S2 S3 S4
S1 0 1 1 0
S2 0 0 0 0
S3 0 0 0 0
S4 0 0 0 0
c'est a dire S1 existe dans S2 est ainsi de suite....
est ce que je peux transformer cette matrice en booléen? -
-
Je pense qu'il faut réfléchir dans l'autre sens.
Ce n'est pas la méthode de création de graphe que tu dois modifier pour t'adapter à ton contexte d'utilisation ("témoigner de la présence de phrases dans d'autre phrases") mais la matrice d'adjacence, quitte à avoir deux matrices : la première qui vient de ta recherche de phrase et que tu modifies pour avoir la deuxième en booléen qui génère le graphe.
Exemple :
double[][] result = searchInText(); boolean[][] adjacencyMatrix = transfomation(result); Graph graph = createGraph("Graph", adjacencyMatrix); public static boolean[][] transformation(double[][] mat) { boolean[][] result = new boolean[mat.length][]; for (int i = 0; i < mat.length; i++) { result[i] = new boolean[mat[i].length]; for (int j = 0; j < mat[i].length; j++) { result[i][j] = (mat[i][j] == 1); } } return result; }
Cette manière de concevoir les choses permet de généraliser le code, chaque méthode fait une chose de précis mais de manière la plus simple possible.
Comme ça si demain tu as un autre graphe à construire tu pourras réutiliser la même méthode telle quelle, sans avoir à la réadapter à un nouveau contexte d'utilisation. -
-
-