¿Cuál es el código C ++ más simple para el algoritmo A *?

// resolver rompecabezas utiliza el algoritmo A *

std :: string Sliding_Solver :: Solve_Puzzle ()

{

// inicia una cola prioritaria para que sea lista abierta, que es la lista que contiene

// los nodos a los que queremos atravesar, estos se ordenan por prioridad mínima, que

// mens el que tenga el menor valor será el padre

std :: priority_queue <Table_Tile, std :: vector , comparador> _open_list;

// inicializa un vector para ser tableros cerrados que contiene todos los nodos que

// visitado

std :: vector _closed_boards;

// comienza colocando nuestro primer tablero dentro de la lista abierta

_open_list.push (_board);

hacer

{

// inicia el primer tablero para mantener un tablero_tile con la menor distancia

Board_Tile _first_board = _open_list.top ();

// emerge de la lista abierta el objeto que tiene la menor distancia

_open_list.pop ();

// empujarlo en los tableros cerrados ya que ahora lo visitamos

_closed_boards.push_back (_first_board.configuration ());

// inicia cuadrados adyacentes para mantener todos los movimientos posibles que podemos hacer

// del primer tablero

std :: vector _adarest_squares = _first_board.move_away (_goal);

// si la distancia de Manhattan es 0, entonces tenemos la solución

if (_first_board.manhattan_distance (Board_Tile (_goal)) == 0)

{

// devuelve los movimientos que tomó para lograr la respuesta

return _first_board.movement_trace ();

}

// mientras todavía tengamos movimientos posibles en casillas adyacentes sigan adelante

while (! _adarest_squares.empty ())

{

// inicie temp para mantener el elemento posterior de los posibles movimientos

Board_Tile _temp = _adarest_squares.back ();

// aparece el último elemento en sqaurse adyacente

_adarest_squares.pop_back ();

// si la temperatura (que es un posible movimiento) existe en un tablero cerrado, entonces

// simplemente continúa, ponlo en una lista abierta para que podamos visitarlo más tarde

if (_find (_closed_boards, _temp.configuration ()))

continuar;

más

_open_list.push (_temp);

}

} while (! _open_list.empty ());

// si llegamos aquí, entonces no hay solución

devolver “SIN SOLUCIÓN”;

}

¡Sencillo!

Estado * búsqueda (const Estado * objetivo, Estado * estado actual) {
std :: priority_queue , std :: mayor > q;
Dirección d [] = {IZQUIERDA, DERECHA, ARRIBA, ABAJO};
q.push (* currentState);
std :: vector <* State> expandido;
while (! q.empty ()) {
* currentState = q.top ();
if (* currentState == * objetivo)
return currentState;
más {
q.pop ();
if (! contiene (expandido, currentState)) {
expandido.push_back (nuevo estado (* currentState));
para (int i = 0; i <4; ++ i) {
Estado * sucesor = currentState-> getSuccessor (d [i]);
if (sucesor) {
if (! contiene (expandido, sucesor)) {
sucesor-> calcularHeurístico (meta);
q.push (* sucesor);
}
}
}
}
}
}
devuelve NULL;
}

A * es idéntico al algoritmo de dijkstra con una función heurística adicional. De hecho, dijkstra puede verse como un caso simple de A *. Seguramente puede encontrar muchos ejemplos de c ++ en Dijkstra. Lea sobre A * y modifique el código que encuentre en Dijkstra para que se ajuste al algoritmo A *. Esto te ayudará a aprender mejor los conceptos.

El ejemplo del algoritmo de ruta más corta con C ++ está disponible en el enlace dado