Creation d'un graphe en java a partir d'une matrice d'adjacence

Résolu/Fermé
Amira - Modifié par KX le 23/01/2016 à 17:06
 Amira - 25 janv. 2016 à 14:09
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 :

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

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 23/01/2016 à 18:01
Bonjour,

Pourquoi tu fais une matrice d'adjacence de type
double[][]
?
Ce devrait plutôt être un
boolean[][]
...

De plus tu as "nbSommets" sommets, par exemple 5, mais avec ta double boucle
g.addNode(id)
tu en créés 25...

Et attention à la manière dont tu créées tes arc, si tu fais
addEdge(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
1
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?
0
Je pense que c'est tout a fait faisable avec le code que vous avez posté mais au lieu du true ça sera plutot un 1 c'est a dire je vais mettre
if (adjacencyMatrix[nodeId][neighborId])==1
graph.addEdge(getId(nodeId, neighborId), getId(nodeId), getId(neighborId), true);
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
23 janv. 2016 à 19:49
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.
0
Bonsoir KX;
Je vous remercie enormément pour la solution que vous avez proposé. Je vais avec ce code la et je vous communiquerais le résultat.
Encore merci.
0
Merciiiiiii KX ça marche à la perfection. C'est exactement ce que je voulais avoir.
0