Добавление анимации в мою глубину первого поиска. (JAVA FX) - PullRequest
0 голосов
/ 22 января 2019

У меня работает алгоритм поиска в глубину:

public ArrayList<T> performDepthFirstSearchUndirectedNonWeighted(UndirectedNonWeightedGraph<T> graph, T startingVertex){

    if (!graph.containsVertex(startingVertex)) {
        throw new IllegalArgumentException("Vertex doesn't exist.");
    }

    T currentVertex = startingVertex;

    ArrayList<T> traversalOrder = new ArrayList<T>();
    ArrayList<T> visitedVertices = new ArrayList<T>();
    Stack<T> stack = new Stack<T>(); 

    visitedVertices.add(startingVertex);
    stack.push(startingVertex);

    while (stack.empty() == false) {

        currentVertex = stack.peek();   
        stack.pop();
        traversalOrder.add(currentVertex);

        Iterable<Vertex<T>> neighboursIterable = graph.getNeighbours(currentVertex);
        ArrayList<Vertex<T>> listOfNeighbours = new ArrayList<Vertex<T>>();
        neighboursIterable.forEach(listOfNeighbours::add);
        ArrayList<Vertex<T>> sortedListOfNeighbours = sortList(listOfNeighbours);
        Collections.reverse(sortedListOfNeighbours);

        for(Vertex<T> v :sortedListOfNeighbours) {

            if (!visitedVertices.contains(graph.returnVertex(v.getElement()).getElement())) {

                visitedVertices.add(v.getElement());
                stack.push(v.getElement()); 

            } 

        }

    }

    return traversalOrder;
}

У меня есть 2 типа переходов, которые я добавляю в последовательный переход.Первый переход - это переход заливки для изменения цвета вершин (круги в моем графическом интерфейсе), а второй переход - переход штриховки для изменения цвета ребер (линий в моем графическом интерфейсе).Последовательный переход будет содержать все переходы, и при воспроизведении будет показан первый обход графика поиска по глубине.

В моей программе последовательный переход называется «mainTransition». Я добавляю переход заполнения к последовательному переходу с помощью:

mainAnimation.getChildren().add(animations.fillVertexTransition(vertex.getElement().toString(),"Undirected Non Weighted"));

Я добавляю штриховой переход к последовательному переходу следующим образом:

mainAnimation.getChildren().add(animations.highlightEdgeTransition(vertexFrom.getElement().toString(),vertexTo.getElement().toString(), "Undirected Non Weighted"));

Моя проблема в том, что я не знаю, где в моем алгоритме поиска в глубину добавить переходы кмой последовательный переход.

Я успешно сделал это в алгоритме поиска в ширину, который можно увидеть ниже:

public ArrayList<T> performBreadthFirstSearchUndirectedNonWeighted(UndirectedNonWeightedGraph<T> graph, T startingVertex){

    if (!graph.containsVertex(startingVertex)) {
        throw new IllegalArgumentException("Vertex doesn't exist.");
    }

    T currentVertex;
    ArrayList<T> traversalOrder = new ArrayList<T>();
    ArrayList<T> visitedVertices = new ArrayList<T>();
    LinkedList<T> queue = new LinkedList<T>(); 

    visitedVertices.add(startingVertex);
    queue.add(startingVertex);

    mainAnimation.getChildren().add(animations.fillVertexTransition(
            startingVertex.toString(),"Undirected Non Weighted"));

    while (queue.size() != 0) {
        currentVertex = queue.poll();
        traversalOrder.add(currentVertex);

        Iterable<Vertex<T>> neighboursIterable = graph.getNeighbours(currentVertex);
        ArrayList<Vertex<T>> listOfNeighbours = new ArrayList<Vertex<T>>();
        neighboursIterable.forEach(listOfNeighbours::add);
        ArrayList<Vertex<T>> sortedListOfNeighbours = sortList(listOfNeighbours);

        for(Vertex<T> v :sortedListOfNeighbours) {

            if (!visitedVertices.contains(graph.returnVertex(v.getElement()).getElement())) {

                visitedVertices.add(v.getElement());
                queue.add(v.getElement()); 

                mainAnimation.getChildren().add(animations.highlightEdgeTransition(currentVertex.toString(),
                        v.getElement().toString(), "Undirected Non Weighted"));

                mainAnimation.getChildren().add(animations.fillVertexTransition(
                        v.getElement().toString(),"Undirected Non Weighted"));

            } 

        }

    }

    return traversalOrder;
}

Я хочу что-то подобное для моего алгоритма поиска в глубину.

Любая помощь приветствуется!

Спасибо.

РЕДАКТИРОВАТЬ:

Мне удалось завершить это с помощью рекурсивной реализации поиска в глубину, который можно увидеть ниже:

public void performDepthFirstSearchUndirectedNonWeighted(UndirectedNonWeightedGraph<T> graph, T startingVertex,ArrayList<T> visitedVertices){

    if (!graph.containsVertex(startingVertex)) {
        throw new IllegalArgumentException("Vertex doesn't exist.");
    }

    visitedVertices.add(startingVertex);

    Iterable<Vertex<T>> neighboursIterable = graph.getNeighbours(startingVertex);
    ArrayList<Vertex<T>> listOfNeighbours = new ArrayList<Vertex<T>>();
    neighboursIterable.forEach(listOfNeighbours::add);
    ArrayList<Vertex<T>> sortedListOfNeighbours = sortList(listOfNeighbours);

    mainAnimation.getChildren().add(animations.fillVertexTransition(
            startingVertex.toString(),"Undirected Non Weighted"));

    for(Vertex<T> v :sortedListOfNeighbours) {

        if(!visitedVertices.contains(graph.returnVertex(v.getElement()).getElement())) {

            mainAnimation.getChildren().add(animations.highlightEdgeTransition(startingVertex.toString(),
                    v.getElement().toString(), "Undirected Non Weighted"));

            performDepthFirstSearchUndirectedNonWeighted(graph,v.getElement(),visitedVertices);

        }

    }


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...