2.4 KiB
Raport 2
Definicja pętli głownej strategi przeszukiwania
Naszą główną funkcją jest funkcja aStar(startField, goalField)
, przyjmuje ona dwa argumenty: startField
- pole z którego wyrusza agent goalField
- cel drogi agenta. Zwraca ona ścieszkę z startField
do goalField
.
Opis
closedSet
- lista zawierająca sprawdzane i sprawdzone pola z listy openSet
openSet
- lista zawierająca pola do sprawdzenia
path
- lista zawierająca pola tworzące ścieszkę do wybranego celu
Dodajemy pierwszy element który będziemy sprawdzać do listy openSet: addToOpenSet(openSet, startField)
Dopuki lista openSet
nie bedzie pusta sprawdzamy jej elementy: while(openSet.length > 0)
Wybieramy najbardziej obiecujący element z zbioru openSet
: let current = findLowestFScore(openSet, goalField)
Jeśli pole current
okaże się naszym celem tworzymy ścieszkę z punktu startowego do naszego celu.
if(current === goalField){
path = []
var temp = current;
path.push(temp);
while(temp.previous){
path.push(temp.previous);
temp = temp.previous
}
Następnie kolorujemy tą ścieszkę i kończymy funkcję zwracając ścieszkę path
for(var i = 0; i < path.length; i++){
colorYellow(path[i]);
}
return path
Jeśli pole current
nie jest naszym celem, to usuwamy je z listy openSet
i dodajemy do listy closedSet
removeFromSet(openSet, current);
addToClosedSet(closedSet, current);
Pobieramy sąsiadów pola current
: var neighbors = current.neighbors;
Dla każdego sąsiada obliczamy koszt dotarcia do niego z punktu początkowego najlepszą ścieszką.
for(var i = 0; i < neighbors.length; i++){
var neighbor = neighbors[i];
if(!closedSet.includes(neighbor)){
var tempG = current.gScore + neighbor.costOfTravel;
if(openSet.includes(neighbor)){
if(tempG < neighbor.gScore){
neighbor.gScore = tempG;
}
} else {
neighbor.gScore = tempG;
addToOpenSet(openSet, neighbor);
}
Po przypisaniu kosztu do sąsiada dodajemy jego odległość do celu: neighbor.heuristic = getDistance(neighbor, goalField);
,
??????????: neighbor.f = neighbor.gScore + neighbor.heuristic;
oraz jego poprzednika: neighbor.previous = current;