Java中BFS演练的解决方案路径
我正在解决人工智能农民问题;我已经完成了广度优先搜索,但我不知道如何打印解决方案路径 这是我的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
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略知一二