Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中BFS演练的解决方案路径_Java_Graph_Path_Breadth First Search - Fatal编程技术网

Java中BFS演练的解决方案路径

Java中BFS演练的解决方案路径,java,graph,path,breadth-first-search,Java,Graph,Path,Breadth First Search,我正在解决人工智能农民问题;我已经完成了广度优先搜索,但我不知道如何打印解决方案路径 这是我的BFS方法: private ArrayList<Nodo> solutions; private Nodo root; public void BFS(Estado estadoInicial, Estado estadoFinal) { Queue<Nodo> abiertos = new LinkedList<>(); soluti

我正在解决人工智能农民问题;我已经完成了广度优先搜索,但我不知道如何打印解决方案路径

这是我的BFS方法:

private ArrayList<Nodo> solutions;
private Nodo root;

public void BFS(Estado estadoInicial, Estado estadoFinal) {
    
    Queue<Nodo> abiertos = new LinkedList<>();

    solutions = new ArrayList<>();
    root = new Nodo(estadoInicial);
    root.nivelProfundidad = 0;
    abiertos.add(root);

    while (!abiertos.isEmpty()) {
        Nodo n = abiertos.poll();
        //System.out.println("Nivel en proceso: " + n.nivelProfundidad + " " + n.datosEstado);

        List<Estado> sucesores = n.datosEstado.getEstadosSucesores();

        for (Estado estado : sucesores) {
            Nodo hijo = new Nodo(estado);
            hijo.nodoPadre = n;
            hijo.nivelProfundidad = n.nivelProfundidad + 1;
            if (!hijo.esRepetido()) {
                n.nodosHijos.add(hijo);

                if (hijo.datosEstado.esEstadoSolucion(estadoFinal) == false) {
                    abiertos.add(hijo);
                   // System.out.println("Añadiendo nodo recorrido: " + hijo.datosEstado);
                } else {
                    solutions.add(hijo);
                  //  System.out.println("Encontre la solución num: " + solutions.size());
                   // System.out.println("Solución encontrada " + hijo.datosEstado);

                }
            }

        }

    }
}
私有ArrayList解决方案;
野藤根;
公共无效BFS(Estado estadoInicial、Estado estadoFinal){
Queue abiertos=new LinkedList();
解决方案=新的ArrayList();
根=新节点(EstaDoinical);
root.niveldefoundidad=0;
添加(根);
而(!abiertos.isEmpty()){
Nodo n=abiertos.poll();
//System.out.println(“Nivel en proceso:+n.NIVELLOUNDIDAD+”+n.datosEstado);
List sucesores=n.datosestato.getEstadosSucesores();
for(Estado Estado:sucesores){
Nodo hijo=新的Nodo(estado);
hijo.nodoPadre=n;
hijo.niveldefoundidad=n.niveldefoundidad+1;
如果(!hijo.esRepetido()){
n、 添加(hijo);
if(hijo.datosEstado.esestadosolion(estadoFinal)==false){
添加(hijo);
//System.out.println(“Añadiendo nodo recorrido:”+hijo.datosEstado);
}否则{
添加(hijo);
//System.out.println(“Encontre la solución num:+solutions.size());
//System.out.println(“Solución encontrada”+hijo.datosEstado);
}
}
}
}
}
我的想法是,它通过父节点遍历解决方案的节点;我附加我的节点类:

public class Nodo {

public Nodo nodoPadre; 
public Estado datosEstado; 
public ArrayList<Nodo> nodosHijos;  // Lista de adyacencia
public int nivelProfundidad;        //Profundidad del nodo


public Nodo(Estado datosNodo) {
    this.nodoPadre = null;
    this.datosEstado = datosNodo;
    this.nodosHijos = new ArrayList<>();
    this.nivelProfundidad = 0;
}

//Buscar estados repetidos
public boolean esRepetido() {
    Nodo n = nodoPadre;
    boolean flag = false;
    
    while (n != null) {
        if (datosEstado.comparar(n.datosEstado)) {
            flag = true;
            break;
        }
        n = n.nodoPadre;
    }
    return flag;
}
}
公共类Nodo{
公开的Nodo nodoPadre;
达托塞斯塔多公共屋;
公共ArrayList nodosHijos;//Lista de Adyacentcia
public int niveldefoundidad;//defoundidad del nodo
公共野藤(Estado datosNodo){
this.nodoPadre=null;
this.datostato=datosNodo;
this.nodosHijos=新的ArrayList();
这个.niveldefoundidad=0;
}
//雷帕蒂多斯公共汽车站
公共布尔值esRepetido(){
Nodo n=nodoPadre;
布尔标志=假;
while(n!=null){
if(datosEstado.比较器(n.datosEstado)){
flag=true;
打破
}
n=n.nodoPadre;
}
返回标志;
}
}
如何打印解决方案路径而不是宽度优先搜索路径?谢谢,我对Java略知一二