Comparacion de elementos de set
Publicado por hesterions (1 intervención) el 03/05/2019 22:15:02
Buenas,
Estoy terminando un proyecto que ya estaba empezado y hay una parte del codigo que no entiendo. Se trata de un agente que crea un camino hacia un objetivo en un mundo con obstáculos.
La parte que no entiendo esta en un metodo de busqueda en profundidad.
Lo que yo entiendo, y no se que consecuencias tiene esto, es que en cada condicion para generar el nodo hijo, busca si dentro de 'generados' hay un estado igual q el estado del nodo hijo que a su vez es igual que el del ultimo estado del set 'generados'
El código es el siguiente:
No se cuando añade a 'pila' un nodohijo u otro.
Muchas gracias de antemano!
PD:adjunto todo el codigo fuente el .cpp y .h, por si acaso
Estoy terminando un proyecto que ya estaba empezado y hay una parte del codigo que no entiendo. Se trata de un agente que crea un camino hacia un objetivo en un mundo con obstáculos.
La parte que no entiendo esta en un metodo de busqueda en profundidad.
Lo que yo entiendo, y no se que consecuencias tiene esto, es que en cada condicion para generar el nodo hijo, busca si dentro de 'generados' hay un estado igual q el estado del nodo hijo que a su vez es igual que el del ultimo estado del set 'generados'
El código es el siguiente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
struct nodo{
estado st;
list<Action> secuencia;
};
struct ComparaEstados{
bool operator()(const estado &a, const estado &n) const{
if ((a.fila > n.fila) or (a.fila == n.fila and a.columna > n.columna) or
(a.fila == n.fila and a.columna == n.columna and a.orientacion > n.orientacion))
return true;
else
return false;
}
};
// Implementación de la búsqueda en profundidad.
// Entran los puntos origen y destino y devuelve la
// secuencia de acciones en plan, una lista de acciones.
bool ComportamientoJugador::pathFinding_Profundidad(const estado &origen, const estado &destino, list<Action> &plan) {
//Borro la lista
cout << "Calculando plan\n";
plan.clear();
set<estado,ComparaEstados> generados; // Lista de Cerrados
stack<nodo> pila; // Lista de Abiertos
nodo current;
current.st = origen;
current.secuencia.empty();
pila.push(current);
while (!pila.empty() and (current.st.fila!=destino.fila or current.st.columna != destino.columna)){
pila.pop();
generados.insert(current.st);
// Generar descendiente de girar a la derecha
nodo hijoTurnR = current;
hijoTurnR.st.orientacion = (hijoTurnR.st.orientacion+1)%4;
if (generados.find(hijoTurnR.st) == generados.end()){
hijoTurnR.secuencia.push_back(actTURN_R);
pila.push(hijoTurnR);
}
// Generar descendiente de girar a la izquierda
nodo hijoTurnL = current;
hijoTurnL.st.orientacion = (hijoTurnL.st.orientacion+3)%4;
if (generados.find(hijoTurnL.st) == generados.end()){
hijoTurnL.secuencia.push_back(actTURN_L);
pila.push(hijoTurnL);
}
// Generar descendiente de avanzar
nodo hijoForward = current;
if (!HayObstaculoDelante(hijoForward.st)){
if (generados.find(hijoForward.st) == generados.end()){
hijoForward.secuencia.push_back(actFORWARD);
pila.push(hijoForward);
}
}
// Tomo el siguiente valor de la pila
if (!pila.empty()){
current = pila.top();
}
}
No se cuando añade a 'pila' un nodohijo u otro.
Muchas gracias de antemano!
PD:adjunto todo el codigo fuente el .cpp y .h, por si acaso
- Comportamientos_Jugador.zip(3,0 KB)
Valora esta pregunta


0