2020-04-28 23:27:45 +02:00
# Raport 2
### Definicja pętli głownej strategi przeszukiwania
2020-04-28 23:36:46 +02:00
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` .
2020-04-28 23:27:45 +02:00
2020-04-28 23:37:35 +02:00
#### Opis
2020-04-28 23:27:45 +02:00
`closedSet` - lista zawierająca sprawdzane i sprawdzone pola z listy `openSet`
2020-04-28 23:37:48 +02:00
2020-04-28 23:27:45 +02:00
`openSet` - lista zawierająca pola do sprawdzenia
2020-04-28 23:37:48 +02:00
2020-04-29 00:49:59 +02:00
`path` - lista zawierająca pola tworzące ścieżkę do wybranego celu
2020-04-28 23:27:45 +02:00
2020-04-28 23:44:01 +02:00
< br >
2020-04-28 23:41:12 +02:00
2020-04-29 00:35:24 +02:00
- Dodajemy pierwszy element który będziemy sprawdzać do listy openSet: `openSet.push(startField);`
- Kolorujemy punkt startowy na zielono: `colorGreen(startField, animationFrame);`
2020-04-29 00:49:59 +02:00
- Dopóki lista `openSet` nie bedzie pusta sprawdzamy jej elementy: `while(openSet.length > 0)`
2020-04-29 00:35:24 +02:00
- 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];
```
2020-04-29 00:49:59 +02:00
- Jeśli pole `current` okaże się naszym celem tworzymy ścieżkę z punktu startowego do naszego celu.
2020-04-28 23:47:06 +02:00
2020-04-28 23:27:45 +02:00
```javascript
if(current === goalField){
path = []
var temp = current;
path.push(temp);
while(temp.previous){
path.push(temp.previous);
temp = temp.previous
}
```
2020-04-29 00:49:59 +02:00
- Następnie kolorujemy tą ścieżkę i kończymy funkcję zwracając ścieżkę `path`
2020-04-28 23:47:37 +02:00
2020-04-28 23:27:45 +02:00
```javascript
for(var i = 0; i < path.length ; i + + ) {
2020-04-29 00:35:24 +02:00
animationFrame = colorYellow(path[i], animationFrame);
2020-04-28 23:27:45 +02:00
}
2020-04-29 00:35:24 +02:00
return path;
2020-04-28 23:27:45 +02:00
```
2020-04-29 00:35:24 +02:00
- Jeśli pole `current` nie jest naszym celem, to usuwamy je z listy `openSet` , dodajemy do listy `closedSet` oraz kolorujemy je na czerwono.
2020-04-28 23:47:37 +02:00
2020-04-28 23:41:00 +02:00
```javascript
removeFromSet(openSet, current);
2020-04-29 00:35:24 +02:00
closedSet.push(current);
animationFrame = colorRed(current, animationFrame);
2020-04-28 23:41:00 +02:00
```
2020-04-28 23:46:40 +02:00
- Pobieramy sąsiadów pola `current` : `var neighbors = current.neighbors;`
2020-04-29 00:49:59 +02:00
- Dla każdego sąsiada obliczamy koszt dotarcia do niego z punktu początkowego najlepszą ścieżką.
2020-04-28 23:47:37 +02:00
2020-04-28 23:27:45 +02:00
```javascript
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 {
2020-04-29 00:35:24 +02:00
neighbor.g = tempG;
openSet.push(neighbor);
animationFrame = colorGreen(neighbor,animationFrame);
2020-04-28 23:27:45 +02:00
}
```
2020-04-29 00:35:24 +02:00
- Po przypisaniu kosztu do sąsiada przypisujemy jego odległość do celu:< br > `neighbor.h = getDistance(neighbor, goalField);
2020-04-28 23:41:00 +02:00
2020-04-29 00:49:59 +02:00
- sumę jego kosztu oraz heurystki: `neighbor.f = neighbor.g + neighbor.h;`
2020-04-28 23:46:40 +02:00
- oraz jego poprzednika: `neighbor.previous = current;`
2020-04-28 23:48:19 +02:00
2020-04-28 23:27:45 +02:00
### Definicja funkcji następnika
2020-04-29 00:35:24 +02:00
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];
```
2020-04-28 23:27:45 +02:00
### Definicja przyjętej heurystyki
2020-04-29 00:49:59 +02:00
Jest to szacowana odległość od sprawdzanego pola do celu. Obliczana jest jako `Manhattan Distance` , ponieważ w naszym modelu Agent nie może poruszać się po skosie.
2020-04-29 00:35:24 +02:00
2020-04-29 00:49:59 +02:00
distance = `|x1 - x2| + |y1 - y2|`
2020-04-29 00:35:24 +02:00
### Testowanie projektu