Dev - C++ - Comparacion de elementos de set

 
Vista:
sin imagen de perfil
Val: 1
Ha aumentado su posición en 3 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

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:

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
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder