2016-06-02 18 views
1

Traveling Salesman Problem의 시뮬레이션을 만들고 있는데이 경우 라이브러리에 GraphStream을 사용하고 있습니다. 그래프를 만들고 유지 관리하는 CreateGraph 클래스가 있습니다. 시뮬레이션의 일환으로 나는 (그래프 용어의 노드) 두 도시를 교체해야하고이를 위해 내가 무엇을하고 있는가하는 것은노드를 교체하고 GraphStream의 이상한 동작을 보여주는 새 가장자리 추가

  • 는 노드 1과 관련된 가장자리를 얻고 가장자리와 관련된하기 edge_1
  • 라는 이름의 배열에 저장입니다 노드 2와
  • 이 개 없음을 만듭니다 (이 또한 그와 관련된 가장자리를 제거합니다) 노드를 모두 제거 두 배열에서 중복 가장자리를 제거하고라는 이름의 배열 지금 common
  • 을 저장할
  • edge_2라는 이름의 배열에 저장 데 다시
  • 지금 edge_1을 반복하고 노드 2로 추가하고 노드 1에 대해 동일한 작업을 수행하고 edge_2
  • 지금 그들 사이에

을 공통의 가장자리를 추가 이전 것과 동일한 ID 년대에 대부분 모든 것이 작동 잘하지만 때로는 노드와 관련된 모든 가장자리가 표시되지 않습니다. enter image description here enter image description here

을 사용하면 노드를 볼 수 있으며 IDE에서 하단 왼쪽에 그와 관련된 에지 (파란색 노드에주의를 기울) 아래 이미지를 참조하십시오. 여기

두 노드의 스왑이 발생할 경우

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 방법 인 CreateGraph 클래스입니다.

답변

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 라이브러리에서 두 노드를 교환하려는 모든 사람에게 나중에이 질문을 남깁니다.

감사합니다.