stworzone screeny

This commit is contained in:
Adam Osiowy 2020-04-28 17:33:36 +02:00
parent 8d7d85fc35
commit fc0f59ba53
7 changed files with 34 additions and 21 deletions

View File

@ -13,21 +13,20 @@ def heurystyka(obiekty, a, b):
def astar(obiekty, start, cel): def astar(obiekty, start, cel):
sasiedzi = [(0, 1), (0, -1), (1, 0), (-1, 0)] sasiedzi = [(0, 1), (0, -1), (1, 0), (-1, 0)]
close_set = set() close_set = set()
came_from = {} came_from = {}
hscore = {start: heurystyka(obiekty, start, cel)} hscore = {start: heurystyka(obiekty, start, cel)}
gscore = {start: 0} gscore = {start: 0}
fscore = {start: heurystyka(obiekty, start, cel)} fscore = {start: heurystyka(obiekty, start, cel)}
oheap = []
heapq.heappush(oheap, (fscore[start], start)) fringe = []
while oheap: heapq.heappush(fringe, (fscore[start], start))
current = heapq.heappop(oheap)[1] while fringe:
current = heapq.heappop(fringe)[1]
if current == cel: if current == cel:
data = [] data = []
while current in came_from: while current in came_from:
data.append(current) data.append(current)
current = came_from[current] current = came_from[current]
return data[::-1] return data[::-1]
@ -41,14 +40,14 @@ def astar(obiekty, start, cel):
continue continue
elif 6 <= sasiad[0] <= 7 and 10 <= sasiad[1] <= 11: elif 6 <= sasiad[0] <= 7 and 10 <= sasiad[1] <= 11:
continue continue
tentative_h_score = heurystyka(obiekty, sasiad, cel) + heurystyka(obiekty, current, sasiad)
if sasiad in [i[1] for i in oheap] and tentative_h_score < hscore.get(current, 0): tentative_h_score = heurystyka(obiekty, sasiad, cel) + heurystyka(obiekty, current, sasiad)
if sasiad in [i[1] for i in fringe] and tentative_h_score < hscore.get(current, 0):
continue continue
elif sasiad not in close_set and sasiad not in [i[1] for i in oheap]: elif sasiad not in close_set and sasiad not in [i[1] for i in fringe]:
came_from[sasiad] = current came_from[sasiad] = current
hscore[sasiad] = tentative_h_score hscore[sasiad] = tentative_h_score
fscore[sasiad] = tentative_h_score + gscore[current] fscore[sasiad] = tentative_h_score + gscore[current]
gscore[sasiad] = gscore[current] + heurystyka(obiekty, current, sasiad) gscore[sasiad] = gscore[current] + heurystyka(obiekty, current, sasiad)
heapq.heappush(oheap, (fscore[sasiad], sasiad)) heapq.heappush(fringe, (fscore[sasiad], sasiad))
return False return False

15
game.py
View File

@ -38,10 +38,15 @@ WINDOW_SIZE = [1300, 980]
def game(): def game():
obiekty = utworzObiekty() obiekty = utworzObiekty()
nieodwiedzone_domy = obiekty["wspolrzedne_domow"]
nieodwiedzone_kontenery = [(obiekty["kontener_szklo"].x, obiekty["kontener_szklo"].y),
(obiekty["kontener_papier"].x, obiekty["kontener_papier"].y),
(obiekty["kontener_metal"].x, obiekty["kontener_metal"].y),
(obiekty["kontener_plastik"].x, obiekty["kontener_plastik"].y),
(obiekty["kontener_organiczne"].x, obiekty["kontener_organiczne"].y)]
# Petla az uzytkownik zamknie program # Petla az uzytkownik zamknie program
done = False done = False
clock = pygame.time.Clock() clock = pygame.time.Clock()
temp = True
# -------- Glowna petla programu ----------- # -------- Glowna petla programu -----------
while not done: while not done:
@ -70,14 +75,6 @@ def game():
obiekty["smieciarka"].w_dol() obiekty["smieciarka"].w_dol()
rysowaniePlanszy(obiekty) rysowaniePlanszy(obiekty)
while temp:
nieodwiedzone_domy = obiekty["wspolrzedne_domow"]
nieodwiedzone_kontenery = [(obiekty["kontener_szklo"].x, obiekty["kontener_szklo"].y),
(obiekty["kontener_papier"].x, obiekty["kontener_papier"].y),
(obiekty["kontener_metal"].x, obiekty["kontener_metal"].y),
(obiekty["kontener_plastik"].x, obiekty["kontener_plastik"].y),
(obiekty["kontener_organiczne"].x, obiekty["kontener_organiczne"].y)]
temp = False
while nieodwiedzone_domy: while nieodwiedzone_domy:
nieodwiedzone_domy.sort(key=lambda x: astar.heurystyka(obiekty, (obiekty["smieciarka"].x, obiekty["smieciarka"].y), x)) nieodwiedzone_domy.sort(key=lambda x: astar.heurystyka(obiekty, (obiekty["smieciarka"].x, obiekty["smieciarka"].y), x))
cel = nieodwiedzone_domy.pop(0) cel = nieodwiedzone_domy.pop(0)

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 MiB

View File

@ -8,7 +8,13 @@
## 1. Ogólne działanie: ## 1. Ogólne działanie:
![gif](resources/screenShots/gifAstar.gif) ![gif](resources/screenShots/route-planning.gif)
- Śmieciarka zaczyna ruch z pozycji (10, 10), po czym odwiedza wszystkie domy,
których współrzędne zostały wylosowane, następnie jedzie na wysypisko do najbliższego kontenera,
po czym wybiera następny najbliższy nieodwiedzony kontener.
- Droga między domami jest wyznaczana przez algorytm A*.
- Każdy następny dom jest najbliższym, jeszcze nieodwiedzonym domem.
--- ---
@ -20,7 +26,12 @@
## 3. Funkcja następnika: ## 3. Funkcja następnika:
![funkcja](resources/screenShots/petlaGlowna.png) ![succ](resources/screenShots/funkcjaNastepnika.png)
gdzie sąsiedzi to:
```
sasiedzi = [(0, 1), (0, -1), (1, 0), (-1, 0)]
```
--- ---
@ -28,4 +39,10 @@
![heurystyka](resources/screenShots/heurystyka.png) ![heurystyka](resources/screenShots/heurystyka.png)
- Heurystyka to suma odległości Manhattan
- Koszt wjechania na pole, na którym jest dom wynosi 3
- Koszt wjechania na pole, które jest wysypiskiem wynosi 2
- Koszt wjechania na pole, które jest kontenerem wynosi 3
- Koszt wjechania na zwyczajne pole wynosi 1
--- ---