/// <summary> /// Ajoute le noeud passé en paramètre dans le graphe courrant /// Est utilisé par le constructeur du graph de fusion /// </summary> /// <param name="node">Node à ajouter au gaphe courrant</param> /// <param name="second_graph">Boolean qui indique si c'est un noeuds du second graphe</param> private void addMergedNode(CustomNode node, bool second_graph) { if (!nodes.ContainsKey(node.id)) { nodes.Add(node.id, new CustomNodeMerged(node.id)); } CustomNodeMerged insertedNode = nodes[node.id]; insertedNode.initFromNode(node, second_graph); // Si c'est le premier noeud qu'on ajoute, c'est la racine if (nodes.Values.Count == 1) { root = insertedNode; } }
/// <summary> /// Initialize un noeuds de fusion par rapport à un neuds du premier au second graphe /// </summary> /// <param name="node">Noeuds du graphe</param> /// <param name="second_graph">Booleen qui indique si c'est un noeuds du second graphe</param> public void initFromNode(CustomNode node, bool second_graph) { real_final_value = node.real_final_value; if (!second_graph) { in_first_graph = true; visited = node.visited; in_selected_path = node.in_selected_path; heuristic_value = node.heuristic_value; order_visited = node.order_visited; order_discovered = node.order_discovered; } else { in_second_graph = true; visited_second = node.visited; in_selected_path_second = node.in_selected_path; heuristic_value_second = node.heuristic_value; order_discovered_second = node.order_discovered; order_visited_second = node.order_visited; } }
/// <summary> /// Retourne un Graph MSAGL avec les noeuds qui ne sont pas dans selected_path groupés /// </summary> /// <param name="only_visited">Inclure seulement les noeuds visité dans le visuel</param> /// <param name="edge_name">Booléen qui indique si on doit afficher le nom de l'arc</param> /// <param name="group_level">A partir de quel niveau de profondeur du selected path on doit grouper les noeuds</param> /// <returns>Graph MSAGL pouvant être afficher dans la vue</returns> private Graph getVisualGraphGrouped(bool only_visited, bool edge_name, int group_level) { Graph graph = new Graph(); ColorMap cmap = new ColorMap(Color.Yellow, Color.Red, heuristicMax(), heuristicMin()); HashSet <string> visited = new HashSet <string>(); // Parcours en largeur du graph pour afficher seulement les noeuds à un certains niveau de distance du selected path // Les autres noeuds sont groupés en un seul noeuds // L'entier dans le tuple correspond au niveau de distance du selected path Queue <Tuple <CustomNode, int> > queue = new Queue <Tuple <CustomNode, int> >(); queue.Enqueue(new Tuple <CustomNode, int>(root, 0)); while (queue.Any()) { Tuple <CustomNode, int> tuple = queue.Dequeue(); CustomNode actu = tuple.Item1; int profondeur = tuple.Item2; if (visited.Contains(actu.id)) { continue; } visited.Add(actu.id); Node msagl_source_node = graph.AddNode(actu.id); actu.styleNode(msagl_source_node, cmap, profondeur == group_level); foreach (CustomEdge edge in actu.successors.Values) { CustomNode dest = edge.dest; if (only_visited && !dest.isVisited()) { continue; } // On ajoute que les noeuds du selected path ou avec un profondeur inférieur à la profondeur max if (dest.in_selected_path || profondeur < group_level) { Edge msagl_edge = graph.AddEdge(actu.id, dest.id); edge.styleEdge(msagl_edge, edge_name); int next_profondeur = profondeur + 1; if (dest.in_selected_path) { next_profondeur = 0; } queue.Enqueue(new Tuple <CustomNode, int>(dest, next_profondeur)); } } } return(graph); }