From c029bcc577e641c31f1ad720fb9b574fa555a530 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Kuczy=C5=84ski?= Date: Tue, 28 Apr 2020 22:35:24 +0000 Subject: [PATCH] Zaktualizuj 'route-planning.md' --- route-planning.md | 53 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 10 deletions(-) diff --git a/route-planning.md b/route-planning.md index 4d5ffe9..4c16098 100644 --- a/route-planning.md +++ b/route-planning.md @@ -13,9 +13,21 @@ Naszą główną funkcją jest funkcja `aStar(startField, goalField)`, przyjmuje
-- Dodajemy pierwszy element który będziemy sprawdzać do listy openSet: `addToOpenSet(openSet, startField)` +- Dodajemy pierwszy element który będziemy sprawdzać do listy openSet: `openSet.push(startField);` +- Kolorujemy punkt startowy na zielono: `colorGreen(startField, animationFrame);` - 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)` +- Wybieramy najbardziej obiecujący element z zbioru `openSet`: + +```javascript +let winner = 0; +for(let i = 0; i < openSet.length; i++){ + if (openSet[i].f < openSet[winner].f){ + winner = i + } +} + +let current = openSet[winner]; +``` - Jeśli pole `current` okaże się naszym celem tworzymy ścieszkę z punktu startowego do naszego celu. ```javascript @@ -32,15 +44,16 @@ if(current === goalField){ ```javascript for(var i = 0; i < path.length; i++){ - colorYellow(path[i]); + animationFrame = colorYellow(path[i], animationFrame); } -return path +return path; ``` -- Jeśli pole `current` nie jest naszym celem, to usuwamy je z listy `openSet` i dodajemy do listy `closedSet` +- Jeśli pole `current` nie jest naszym celem, to usuwamy je z listy `openSet`, dodajemy do listy `closedSet` oraz kolorujemy je na czerwono. ```javascript removeFromSet(openSet, current); -addToClosedSet(closedSet, current); +closedSet.push(current); +animationFrame = colorRed(current, animationFrame); ``` - 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ą. @@ -55,15 +68,35 @@ for(var i = 0; i < neighbors.length; i++){ neighbor.gScore = tempG; } } else { - neighbor.gScore = tempG; - addToOpenSet(openSet, neighbor); + neighbor.g = tempG; + openSet.push(neighbor); + animationFrame = colorGreen(neighbor,animationFrame); } ``` -- Po przypisaniu kosztu do sąsiada dodajemy jego odległość do celu:
`neighbor.heuristic = getDistance(neighbor, goalField);`, +- Po przypisaniu kosztu do sąsiada przypisujemy jego odległość do celu:
`neighbor.h = getDistance(neighbor, goalField); -- ??????????: `neighbor.f = neighbor.gScore + neighbor.heuristic;` +- sume jego kosztu oraz heurystki: `neighbor.f = neighbor.g + neighbor.h;` - oraz jego poprzednika: `neighbor.previous = current;` ### Definicja funkcji następnika +Następnik wybierany jest z listy sąsiadów poprzednio wybranych pól. Jest to najbardziej obiecujące pole `current`, +tzn. pole o najmniejszej sumie kosztu przejścia do niego z punktu startowego oraz heurystki. + +```javascript +let winner = 0; + for(let i = 0; i < openSet.length; i++){ + if (openSet[i].f < openSet[winner].f){ + winner = i + } + } +let current = openSet[winner]; +``` + ### Definicja przyjętej heurystyki +Jest to szacowana odległość od sprawdzanego pola do celu. Obliczana jest za pomocą wzoru na odległość Manhattana. + +`|x1 - x2| + |y1 - y2|` + +### Testowanie projektu +