有趣的system.exit()行为和中断行为 - 发生了什么?

时间:2014-11-18 19:25:03

标签: java break

我正在尝试按如下方式实施BFS:

package search;

   import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;

import common.MyNode;
import common.Parser;

public class BFS extends Search {

    Queue<MyNode> frontier;
    Queue<MyNode> visited;
    ArrayList<MyNode> route;
    Parser p;
    boolean found = false;
    private int toWriteInt = 0;
    private double distance;

public BFS(MyNode startNode, MyNode goalNode, Parser p) {
    super(startNode, goalNode, p);
    frontier = new LinkedList<MyNode>();
    visited = new LinkedList<MyNode>();
    this.p = p;
    route = new ArrayList<MyNode>();

}

public void Search() {

    visited.add(this.getStartNode());

    if (isGoal(this.getStartNode())) {
        System.out.println("goal found at start");
        goalFound();
    }
    ArrayList<MyNode> successors = this.getStartNode().getSuccessors();

    for (int i = 0; i < successors.size(); i++) {
        successors.get(i).setParent(this.getStartNode());
        if (!(visited.contains(successors.get(i)))
                && !(frontier.contains(successors.get(i)))) {
            if (isGoal(successors.get(i))) {
                visited.add(successors.get(i));
                System.out.println("goal found at start successor");

                goalFound();
                break;
            } else {
                frontier.add(successors.get(i));

            }

        }

    }
    while (!frontier.isEmpty()) {
        MyNode current = frontier.poll();

        ArrayList<MyNode> currentSuccessors = current.getSuccessors();

        visited.add(current);

        for (int i = 0; i < currentSuccessors.size(); i++) {

            if (!(visited.contains(currentSuccessors.get(i)))
                    && !(frontier.contains(currentSuccessors.get(i)))) {
                currentSuccessors.get(i).setParent(current);

                if (isGoal(currentSuccessors.get(i))) {
                    visited.add(currentSuccessors.get(i));
                    System.out.println("goal found in loop");
                    goalFound();
                    break;
                } else {
                    frontier.add(currentSuccessors.get(i));
                }

            }

        }
    }
}

private boolean isGoal(MyNode toCheck) {
    boolean goal = false;
    if (toCheck.equals(this.getGoalNode())) {
        goal = true;
    }
    return goal;

}

private void goalFound() {
    System.out.println("goal found with " + visited.size());
    printRoute();
    System.exit(0);

}

这一切都找到了。打印路线方法如下:

public void printRoute() {
        MyNode i = this.getGoalNode();
        while (i.getParent() != null) {

            System.out.println(i.getId());
            distance = distance
                    + Search.distFrom(i.getLat(), i.getLon(), i.getParent()
                            .getLat(), i.getParent().getLon());

            i = i.getParent();

        }
        System.out.println(this.startNode.getId());


        System.out.println("completed routing");
        System.out.println("path length of " + distance + "km");
    }

}

再次,这可以正常工作并打印正确的路线。但是,如果我删除system.exit(0)代码不起作用,printRoute()的while循环将永远打印,两次打印相同的两个节点(i和i.getParent())。我觉得这很奇怪,因为该方法必须完成才能打到我的system.exit。

谁能告诉我为什么会这样?要调用system.exit是非常有问题的,因为我想在我的代码中嵌入BFS,这意味着我不能。

感谢, MJB

编辑:以下建议返回可以解决我的问题。下面是A *搜索,它表现出相同的行为,只有在System.Exit中才有效,即使我返回:

    package search;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Stack;

import common.MyNode;
import common.Parser;

public class AStar extends Search {

    private ArrayList<MyNode> openList; // This is basically our frontier
    private ArrayList<MyNode> closedList;// This is the visited set.

    public AStar(MyNode startNode, MyNode goalNode, Parser p) {
        super(startNode, goalNode, p);
        openList = new ArrayList<MyNode>();
        closedList = new ArrayList<MyNode>();

    }

    public Stack<MyNode> Search() {
        Stack<MyNode> toReturn = new Stack<MyNode>();
        openList.add(this.getStartNode());
        while (!openList.isEmpty()) {

            Collections.sort(openList);
            MyNode q = openList.remove(0);
            openList.remove(q);

            // generate q's 8 successors and set their parents to q
            // if successor is the goal, stop the search
            if (isGoal(q)) {
                System.out.println("search completed- goal found");
                MyNode i = this.getGoalNode();
                while (i.getParent() != null) {
                    toReturn.add(i);
                    i = q.getParent();
                }
                return toReturn;
            }

            closedList.add(q);
            ArrayList<MyNode> successors = q.getSuccessors();

            for (MyNode node : successors) {
                if (closedList.contains(node)) {
                    continue;
                }

                node.setParent(q);

                /*
                 * successor.g = q.g + distance between successor and q
                 * successor.h = distance from goal to successor
                 * successor.f=successor.g + successor.h
                 */

                double g = q.getG()
                        + Search.distFrom(q.getLat(), q.getLon(),
                                node.getLat(), node.getLon());

                double h = Search.distFrom(this.getGoalNode().getLat(), this
                        .getGoalNode().getLon(), q.getLat(), q.getLon());

                node.setG(g);
                node.setH(h);

                node.setF(g + h);

                // if a node with the same position as successor is in the OPEN
                // list
                // has a lower f than successor, skip this successor

                int openIndex = openList.indexOf(node);
                int closedIndex = closedList.indexOf(node);

                if (openIndex > -1) {

                    if (openList.get(openIndex).compareTo(node) == -1)
                        continue;

                }

                // if a node with the same position as successor is in the
                // CLOSED list
                // which has a lower f than successor, skip this successor
                if (closedIndex > -1) {
                    if (closedList.get(closedIndex).compareTo(node) == -1)
                        continue;

                }

                if (openIndex > -1)
                    openList.remove(openIndex);
                Collections.sort(openList);

                if (closedIndex > -1)
                    closedList.remove(closedIndex);

                openList.add(node);
                Collections.sort(openList);

            }
            closedList.add(0, q);

        }
        return toReturn;
    }

编辑:根据要求,主要方法:

public static void main(String[] args) {

        AStar search = new AStar(parse.getAllNodes().get(new Long("21295291")),
                parse.getAllNodes().get(new Long("319561075")), parse);

         search.Search();

    }

这些节点具有以下属性:

    node [id=21295291, lat=52.4737031, lon=-1.8747258]
node [id=119126329, lat=52.4701337, lon=-1.8716235]

1 个答案:

答案 0 :(得分:0)

代码

  goalFound();
  break;

打破内循环(for)但你也有外循环。您可以使用&#39; return;&#39;在这里而不是“打破”#39; (或标记为休息)。