Zaktualizuj 'route-planning.md'

This commit is contained in:
Tomasz Kuczyński 2020-04-28 22:35:24 +00:00
parent d7a13e144d
commit c029bcc577
1 changed files with 43 additions and 10 deletions

View File

@ -13,9 +13,21 @@ Naszą główną funkcją jest funkcja `aStar(startField, goalField)`, przyjmuje
<br> <br>
- 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)` - 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. - Jeśli pole `current` okaże się naszym celem tworzymy ścieszkę z punktu startowego do naszego celu.
```javascript ```javascript
@ -32,15 +44,16 @@ if(current === goalField){
```javascript ```javascript
for(var i = 0; i < path.length; i++){ 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 ```javascript
removeFromSet(openSet, current); removeFromSet(openSet, current);
addToClosedSet(closedSet, current); closedSet.push(current);
animationFrame = colorRed(current, animationFrame);
``` ```
- Pobieramy sąsiadów pola `current`: `var neighbors = current.neighbors;` - 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ą. - 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; neighbor.gScore = tempG;
} }
} else { } else {
neighbor.gScore = tempG; neighbor.g = tempG;
addToOpenSet(openSet, neighbor); openSet.push(neighbor);
animationFrame = colorGreen(neighbor,animationFrame);
} }
``` ```
- Po przypisaniu kosztu do sąsiada dodajemy jego odległość do celu:<br>`neighbor.heuristic = getDistance(neighbor, goalField);`, - Po przypisaniu kosztu do sąsiada przypisujemy jego odległość do celu:<br>`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;` - oraz jego poprzednika: `neighbor.previous = current;`
### Definicja funkcji następnika ### 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 ### 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