2016-06-02 1 views
1

Я пытаюсь создать симуляцию Traveling Salesman Problem, и для этого я использую библиотеку GraphStream. У меня есть класс CreateGraph, который отвечает за создание и поддержание графика. В рамках моделирования я должен поменять два города (узлы в перспективе графа) и это то, что я делаюОбмен узлами и добавление новых ребер, показывающих странное поведение в GraphStream

  • Получить края, связанные с node1 и хранить их в массив с именем edge_1
  • Получить края, связанные с node2 и хранить их в массив с именем edge_2
  • Удалить дубликаты кромками из обоих массивов и хранить их в массив с именем common
  • Теперь удалите и узлы (это также будет удалять ребра, связанные с ними)
  • Создание двух запретных дез снова с теми же идентификаторами, как и предыдущие
  • Теперь итерацию через edge_1 и добавить его с node2 и сделать то же самое для node1 и edge_2
  • Теперь добавить общие ребра между ними

В основном все работает нормально, но иногда Я не получаю все ребра, связанные с узлом. См изображения ниже (обратить внимание на синие узлы) enter image description here enter image description here

вы можете увидеть узлы и края, связанные с ними на нижней левой стороне в IDE.

Вот класс 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.

Спасибо за ваше время.

Смежные вопросы