2016-06-02 7 views
1

Traveling Salesman Problemのシミュレーションを作成しようとしています。このために私はGraphStreamライブラリを使用しています。グラフの作成と保守を担当するクラスCreateGraphがあります。シミュレーションの一環として、私は(グラフ期間内のノード)は、2つの都市を交換する必要があり、これのために私がやっていることはノードを入れ替え、GraphStreamの奇妙な動作を示す新しいエッジを追加

  • がnode1に関連したエッジを取得し、エッジが関連付けられますedge_1
  • という名前の配列に格納しています今ノード(これはまた、それらに関連したエッジを除去する)
  • 両方は、2つの無を作成し削除アレイの両方から重複エッジを削除し、common
  • という配列に格納edge_2
  • という配列でそれらをNODE2および保管デ再び
  • 以前のものとしてのidの同じで、今edge_1を反復およびnode2でそれを追加し、ほとんどすべてが正常に動作しますが、時々れ

それらの間で今、共通のエッジを追加しnode1およびedge_2
  • のために同じことをします私は、ノードに関連するすべてのエッジを取得していません。下の画像(青ノード上の注意を払う) enter image description here enter image description here

    はIDEで左下側にそれらに関連付けられているノードとエッジを見ることができます参照してください。ここ

    は、2つのノードのスワップが発生する場所CreateGraphクラス

    package graph; 
    
    /** 
    * Created by deepanshu on 6/1/16. 
    */ 
    
    import org.graphstream.ui.view.Viewer; 
    import sa.City; 
    import sa.Tour; 
    import sa.TourManager; 
    import org.graphstream.graph.*; 
    import org.graphstream.graph.implementations.SingleGraph; 
    import java.util.ArrayList; 
    import java.util.Iterator; 
    import java.util.Scanner; 
    import java.util.stream.Collectors; 
    
    public class CreateGraph { 
    
        protected String stylesheet = 
          "node { " + 
           "fill-color: green; text-color: blue; text-alignment: under;" + 
          "}" + 
          "edge { " + 
           "fill-color: red;" + 
          "}" + 
          "graph { "+ 
           "fill-color: black;" + 
          " }"; 
    
        private Graph graph; 
    
        public CreateGraph() { 
         graph = new SingleGraph("Simulated Annealing"); 
         Viewer viewer = graph.display(); 
         viewer.disableAutoLayout(); 
         graph.addAttribute("ui.stylesheet", stylesheet); 
         graph.addAttribute("ui.quality"); 
         graph.addAttribute("ui.antialias"); 
        } 
    
        public void init() { 
         int totalNumberOfCities = TourManager.numberOfCities(); 
         for (int i = 0; i < totalNumberOfCities; ++i) { 
          City city = TourManager.getCity(i); 
          int x = city.getX(), y = city.getY(); 
          graph.addNode("" + x + ", " + y); 
          Node node = graph.getNode("" + x + ", " + y); 
          node.addAttribute("ui.label", node.getId()); 
          node.setAttribute("x", x); 
          node.setAttribute("y", y); 
    //   sleep(); 
         } 
        } 
    
        public void set(Tour tour) { 
         ArrayList tour_real = tour.getTour(); 
         int length = tour_real.size(); 
         for (int i = 0; i < length - 1; ++i) { 
          City city_1 = (City)tour_real.get(i); 
          City city_2 = (City)tour_real.get(i + 1); 
          Node node_1 = graph.getNode("" + city_1.getX() + ", " + city_1.getY()); 
          Node node_2 = graph.getNode("" + city_2.getX() + ", " + city_2.getY()); 
          node_1.setAttribute("x", city_1.getX()); 
          node_2.setAttribute("x", city_2.getX()); 
          node_1.setAttribute("y", city_1.getY()); 
          node_2.setAttribute("y", city_2.getY()); 
          graph.addEdge(i + "", node_1, node_2, false); 
    //   sleep(); 
         } 
        } 
    
        private void addEdge(Iterator iterator, ArrayList<Edge> edges) { 
         while (iterator.hasNext()) { 
          edges.add((Edge)iterator.next()); 
         } 
        } 
    
        private void addEdge(ArrayList<Edge> edges, Node node_1, Node node_2, ArrayList<Edge> changeEdge) { 
         for (Edge edge : edges) { 
          Node node0 = edge.getNode0(); 
          Node node1 = edge.getNode1(); 
          if (node_2.getId().equals(node1.getId())) { 
           graph.addEdge(edge.getId(), node_1, node0, false); 
           changeEdge.add(graph.getEdge(edge.getId())); 
          } else { 
           graph.addEdge(edge.getId(), node_1, node1, false); 
           changeEdge.add(graph.getEdge(edge.getId())); 
          } 
         } 
        } 
    
        private Node addNode(int x, int y) { 
         graph.addNode("" + x + ", " + y); 
         Node node_1 = graph.getNode("" + x + ", " + y); 
         node_1.setAttribute("x", x); 
         node_1.setAttribute("y", y); 
         node_1.addAttribute("ui.label", node_1.getId()); 
         node_1.addAttribute("ui.style", "fill-color: blue; text-color: blue; text-alignment: under;"); 
         return node_1; 
        } 
    
        private void removeCommon(ArrayList<Edge> edges_1, ArrayList<Edge> edges_2, ArrayList<Edge> common) { 
         for (Edge edge_1 : edges_1) { 
          common.addAll(edges_2.stream().filter(edge_2 -> edge_1.getId().equals(edge_2.getId())).map(edge_2 -> edge_1).collect(Collectors.toList())); 
         } 
         edges_1.removeAll(common); 
         edges_2.removeAll(common); 
    
         for (Edge edge : edges_1) 
          edge.addAttribute("ui.style", "fill-color: Green;"); 
         for (Edge edge : edges_2) 
          edge.addAttribute("ui.style", "fill-color: Green;"); 
         for (Edge edge : common) 
          edge.addAttribute("ui.style", "fill-color: Green;"); 
        } 
    
        public void updateColor(ArrayList<Edge> changeEdge, Node node_1, Node node_2) { 
         for (Edge edge : changeEdge) 
          edge.addAttribute("ui.style", "fill-color: Red;"); 
    
         node_1.addAttribute("ui.style", "fill-color: green; text-color: blue; text-alignment: under;"); 
         node_2.addAttribute("ui.style", "fill-color: green; text-color: blue; text-alignment: under;"); 
        } 
    
        public void update(City city_1, City city_2) { 
         ArrayList<Edge> changeEdge = new ArrayList<>(); 
         int x_1 = city_1.getX(), y_1 = city_1.getY(); 
         int x_2 = city_2.getX(), y_2 = city_2.getY(); 
         Node node_1 = graph.getNode("" + x_1 + ", " + y_1); 
         Node node_2 = graph.getNode("" + x_2 + ", " + y_2); 
         ArrayList<Edge> edge_1 = new ArrayList<>(); 
         ArrayList<Edge> edge_2 = new ArrayList<>(); 
         ArrayList<Edge> common = new ArrayList<>(); 
         addEdge(node_1.getEdgeIterator(), edge_1); 
         addEdge(node_2.getEdgeIterator(), edge_2); 
         removeCommon(edge_1, edge_2, common); 
    
         graph.removeNode(node_1); 
         graph.removeNode(node_2); 
         node_1 = addNode(x_2, y_2); 
         node_2 = addNode(x_1, y_1); 
    
         System.out.println("Node_1: " + node_1.toString()); 
         System.out.println("Node_2: " + node_2.toString()); 
         System.out.println("edge_1: " + edge_1.toString()); 
         System.out.println("edge_2: " + edge_2.toString()); 
         System.out.println("common: " + common.toString()); 
    
         addEdge(edge_1, node_1, node_2, changeEdge); 
         addEdge(edge_2, node_2, node_1, changeEdge); 
    
         for (Edge edge : common) { 
          Node node1 = edge.getNode0(); 
          Node node2 = edge.getNode1(); 
          graph.addEdge(edge.getId(), node1, node2, false); 
          changeEdge.add(graph.getEdge(edge.getId())); 
         } 
    
         sleep(); 
         updateColor(changeEdge, node_1, node_2); 
         sleep(); 
        } 
    
        protected void sleep() { 
         try { 
          Thread.sleep(500); 
          Scanner scanner = new Scanner(System.in); 
    //   scanner.nextLine(); 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
        } 
    } 
    

    update方法があります。

  • 答えて

    0

    私はバグを見つけました。バグはここにありました

    for (Edge edge : common) { 
         Node node1 = edge.getNode0(); 
         Node node2 = edge.getNode1(); 
         graph.addEdge(edge.getId(), node1, node2, false); <--- Replace it with 
         graph.addEdge(edge.getId(), node_1, node_2, false); 
         changeEdge.add(graph.getEdge(edge.getId())); 
    } 
    

    実際には、ノードの実際のインスタンスの代わりにローカル変数を割り当てていました。

    今後、GraphStreamライブラリで2つのノードを交換したいと思っている人に、この質問を残しておきます。

    ありがとうございます。

    関連する問題