astar
This commit is contained in:
parent
89d1aa7802
commit
827a105f17
BIN
__pycache__/granny.cpython-39.pyc
Normal file
BIN
__pycache__/granny.cpython-39.pyc
Normal file
Binary file not shown.
BIN
__pycache__/pool.cpython-39.pyc
Normal file
BIN
__pycache__/pool.cpython-39.pyc
Normal file
Binary file not shown.
Binary file not shown.
150
astar.py
Normal file
150
astar.py
Normal file
@ -0,0 +1,150 @@
|
||||
from truck import Truck
|
||||
|
||||
class Node():
|
||||
def __init__(self, parent=None, position=None):
|
||||
self.parent = parent
|
||||
self.position = position
|
||||
|
||||
self.g = 0
|
||||
self.h = 0
|
||||
self.f = 0
|
||||
|
||||
def __eq__(self, other):
|
||||
return self.position == other.position
|
||||
|
||||
|
||||
def astar(maze, start, end):
|
||||
start_node = Node(position=start)
|
||||
end_node = Node(position=end)
|
||||
x=0
|
||||
open_list = []
|
||||
closed_list = []
|
||||
|
||||
open_list.append(start_node)
|
||||
|
||||
while len(open_list) > 0:
|
||||
|
||||
current_node = open_list[0]
|
||||
current_index = 0
|
||||
for index, item in enumerate(open_list):
|
||||
if item.f < current_node.f:
|
||||
current_node = item
|
||||
current_index = index
|
||||
|
||||
open_list.pop(current_index)
|
||||
closed_list.append(current_node)
|
||||
|
||||
if current_node == end_node:
|
||||
path = []
|
||||
|
||||
current = current_node
|
||||
while current is not None:
|
||||
path.append(current.position)
|
||||
if (maze[current.position[0]][current.position[1]] == 1):
|
||||
x = x + 1
|
||||
if (maze[current.position[0]][current.position[1]] == 2):
|
||||
x = x + 3
|
||||
if (maze[current.position[0]][current.position[1]] == 6):
|
||||
x = x + 20
|
||||
if (maze[current.position[0]][current.position[1]] == 7):
|
||||
x = x + 5
|
||||
if (maze[current.position[0]][current.position[1]] == 8):
|
||||
x = x + 1
|
||||
|
||||
current = current.parent
|
||||
return path[::-1]
|
||||
#return x
|
||||
|
||||
children = []
|
||||
for new_position in [(0, -1), (0, 1), (-1, 0), (1, 0)]:
|
||||
|
||||
node_position = (
|
||||
current_node.position[0] + new_position[0], current_node.position[1] + new_position[1])
|
||||
|
||||
if node_position[0] > (len(maze) - 1) or node_position[0] < 0 or node_position[1] > (len(maze[len(maze)-1]) - 1) or node_position[1] < 0:
|
||||
continue
|
||||
|
||||
if Node(current_node, node_position) in closed_list:
|
||||
continue
|
||||
|
||||
if maze[node_position[0]][node_position[1]] == 9:
|
||||
continue
|
||||
|
||||
new_node = Node(current_node, node_position)
|
||||
|
||||
children.append(new_node)
|
||||
|
||||
for child in children:
|
||||
|
||||
for closed_child in closed_list:
|
||||
if child == closed_child:
|
||||
continue
|
||||
|
||||
if(maze[child.position[0]][child.position[1]]==1):
|
||||
child.g = 1
|
||||
if(maze[child.position[0]][child.position[1]]==2):
|
||||
child.g = 3
|
||||
if(maze[child.position[0]][child.position[1]]==6):
|
||||
child.g = 20
|
||||
if(maze[child.position[0]][child.position[1]]==7):
|
||||
child.g = 5
|
||||
if(maze[child.position[0]][child.position[1]]==8):
|
||||
child.g = 1
|
||||
child.h = ((child.position[0] - end_node.position[0]) **
|
||||
2) + ((child.position[1] - end_node.position[1]) ** 2)
|
||||
child.f = child.g + child.h
|
||||
|
||||
for open_node in open_list:
|
||||
if child == open_node and child.g > open_node.g:
|
||||
continue
|
||||
|
||||
open_list.append(child)
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
maze = [[9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9],
|
||||
[9, 9, 9, 9, 9, 1, 1, 9, 9, 9, 1, 1, 1, 9, 9, 9, 1,
|
||||
1, 9, 9, 1, 1, 1, 9, 9, 1, 1, 9, 1, 1, 9, 9],
|
||||
[9, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 9, 1, 1,
|
||||
8, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 9],
|
||||
[9, 1, 1, 1, 2, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 1, 9,
|
||||
1, 0, 1, 7, 1, 1, 1, 9, 1, 1, 1, 1, 1, 1, 9],
|
||||
[9, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 9, 9,
|
||||
9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9],
|
||||
[9, 9, 9, 1, 1, 1, 1, 9, 1, 1, 1, 1, 1, 1, 1, 2, 1,
|
||||
1, 1, 1, 9, 6, 6, 9, 1, 1, 2, 1, 1, 9, 1, 9],
|
||||
[9, 1, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9],
|
||||
[9, 1, 1, 1, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 9, 9, 9,
|
||||
9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9],
|
||||
[9, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1,
|
||||
1, 9, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 1, 1, 9],
|
||||
[9, 1, 1, 1, 1, 9, 1, 1, 1, 1, 1, 1, 9, 1, 1, 1, 9,
|
||||
9, 9, 7, 6, 9, 9, 9, 9, 6, 2, 1, 9, 9, 9, 9],
|
||||
[9, 1, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 9, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 1, 1, 9],
|
||||
[9, 1, 1, 1, 9, 9, 9, 9, 9, 1, 1, 9, 9, 9, 1, 1, 9,
|
||||
9, 9, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 1, 1, 9],
|
||||
[9, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 2, 1, 1, 9, 9, 1, 9, 1, 1, 7, 1, 1, 9],
|
||||
[9, 1, 1, 1, 1, 1, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9],
|
||||
[9, 1, 1, 9, 1, 1, 9, 9, 9, 1, 9, 1, 1, 1, 9, 9, 9,
|
||||
1, 1, 1, 1, 1, 9, 1, 1, 1, 9, 9, 1, 1, 1, 9],
|
||||
[9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 1, 1, 2, 1,
|
||||
1, 1, 1, 9, 9, 9, 9, 1, 1, 1, 2, 1, 1, 9, 9],
|
||||
[9, 1, 1, 1, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 9, 1, 1,
|
||||
1, 9, 1, 1, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 9],
|
||||
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]]
|
||||
|
||||
start = (13, 7)
|
||||
end = (3, 18)
|
||||
|
||||
path = astar(maze, start, end)
|
||||
print(path)
|
||||
return path
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
14
granny.py
Normal file
14
granny.py
Normal file
@ -0,0 +1,14 @@
|
||||
class Granny:
|
||||
def __init__(self, position, grid_size):
|
||||
self.pos = position
|
||||
self.size = grid_size
|
||||
def create_granny(grid_size):
|
||||
grannies = []
|
||||
with open(file='houses.txt', mode='r', encoding='utf-8') as file:
|
||||
for l_index, line in enumerate(file):
|
||||
for h_index, if_house in enumerate(line):
|
||||
if if_house == '3':
|
||||
granny = Granny(
|
||||
[h_index*grid_size, l_index*grid_size], grid_size)
|
||||
grannies.append(granny)
|
||||
return grannies
|
24
houses.txt
24
houses.txt
@ -1,16 +1,16 @@
|
||||
11111111111111111111111111111111
|
||||
10100011110000111100010000011101
|
||||
10100000000000011000000111000001
|
||||
10100011110000111100010003011101
|
||||
10100020000000011002000111000001
|
||||
10111111110001011010001110011001
|
||||
10000000000001000010000100000001
|
||||
11111111110001000010000000001111
|
||||
11110000000111000100001111111111
|
||||
10000000000000010001100000000001
|
||||
10001110000011100010000000000001
|
||||
10000300002001000010000100000001
|
||||
11111111110001300010000002001111
|
||||
11110320000111200100001111111111
|
||||
10000000020000010301100300000001
|
||||
10001110000011120010200200000001
|
||||
11111011110111001010111111111011
|
||||
10001000001000011010000001110001
|
||||
10000010000001001000111100000011
|
||||
10011111111001000010011001111011
|
||||
10000110001000000001110000000011
|
||||
10010000100010111100000001100001
|
||||
10001030001000011010000001110001
|
||||
10200010000001001000111100200011
|
||||
10011111111001020010011001111011
|
||||
10000112001000000001110000000011
|
||||
10012000130010111100200001100001
|
||||
11111111111111111111111111111111
|
BIN
img/granny.png
Normal file
BIN
img/granny.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.4 KiB |
23
main.py
23
main.py
@ -18,7 +18,8 @@ from truck import Truck
|
||||
from trash import Trash
|
||||
from TSP import tsp, tspmove
|
||||
from bfs import bfs, distance
|
||||
|
||||
from pool import create_pools
|
||||
from granny import create_granny
|
||||
|
||||
model = load_model("model.h5")
|
||||
|
||||
@ -70,10 +71,14 @@ def game_keys(truck, multi_trash, houses, auto=False):
|
||||
break
|
||||
|
||||
|
||||
def update_images(gameDisplay, truck, multi_trash, houses):
|
||||
def update_images(gameDisplay, truck, multi_trash, houses,pools,grannies):
|
||||
gameDisplay.fill(gray)
|
||||
for house in houses:
|
||||
gameDisplay.blit(pygame.image.load('./img/house.png'), house.pos)
|
||||
for pool in pools:
|
||||
gameDisplay.blit(pygame.image.load('./img/wet.png'), pool.pos)
|
||||
for granny in grannies:
|
||||
gameDisplay.blit(pygame.image.load('./img/granny.png'), granny.pos)
|
||||
for trash in multi_trash:
|
||||
gameDisplay.blit(pygame.image.load('./img/trash.png'), trash.pos)
|
||||
gameDisplay.blit(truck.image, truck.pos)
|
||||
@ -93,6 +98,8 @@ def game_loop():
|
||||
|
||||
truck = Truck(game_w, game_h, grid_size)
|
||||
houses = create_houses(grid_size)
|
||||
pools = create_pools(grid_size)
|
||||
grannies = create_granny(grid_size)
|
||||
|
||||
for _ in range(7):
|
||||
trash = Trash(game_w, game_h, grid_size)
|
||||
@ -118,7 +125,9 @@ def game_loop():
|
||||
if (event.key == pygame.K_k):
|
||||
print(":>")
|
||||
trash = multi_trash[0]
|
||||
dis_dump = distance(truck.pos,[80,80])
|
||||
dis = [120,120]
|
||||
print(truck.pos)
|
||||
dis_dump = distance(dis,truck.pos)
|
||||
dis_trash = distance(truck.pos, trash.pos)
|
||||
print(dis_dump, dis_trash, truck.mass, truck.space, trash.mass, trash.space)
|
||||
decision = tree.making_decision(decision_tree,
|
||||
@ -144,7 +153,7 @@ def game_loop():
|
||||
pygame.KEYDOWN, {'key': action}))
|
||||
|
||||
game_keys(truck, multi_trash, houses, True)
|
||||
update_images(gameDisplay, truck, multi_trash, houses)
|
||||
update_images(gameDisplay, truck, multi_trash, houses,pools,grannies)
|
||||
else:
|
||||
truck.space=0
|
||||
truck.mass=0
|
||||
@ -165,7 +174,7 @@ def game_loop():
|
||||
pygame.KEYDOWN, {'key': action}))
|
||||
|
||||
game_keys(truck, multi_trash, houses, True)
|
||||
update_images(gameDisplay, truck, multi_trash, houses)
|
||||
update_images(gameDisplay, truck, multi_trash, houses,pools,grannies)
|
||||
if (event.key == pygame.K_t):
|
||||
solution = tsp(multi_trash, truck)
|
||||
actions = tspmove(solution, truck, multi_trash)
|
||||
@ -184,7 +193,7 @@ def game_loop():
|
||||
pygame.KEYDOWN, {'key': action}))
|
||||
|
||||
game_keys(truck, multi_trash, houses, True)
|
||||
update_images(gameDisplay, truck, multi_trash, houses)
|
||||
update_images(gameDisplay, truck, multi_trash, houses,pools,grannies)
|
||||
truck.direction = [1, 0]
|
||||
truck.dir_control = 0
|
||||
truck.image = pygame.image.load('./img/truck.png')
|
||||
@ -196,7 +205,7 @@ def game_loop():
|
||||
else:
|
||||
pygame.event.post(event)
|
||||
game_keys(truck, multi_trash, houses)
|
||||
update_images(gameDisplay, truck, multi_trash, houses)
|
||||
update_images(gameDisplay, truck, multi_trash, houses,pools,grannies)
|
||||
clock.tick(60)
|
||||
|
||||
|
||||
|
14
pool.py
Normal file
14
pool.py
Normal file
@ -0,0 +1,14 @@
|
||||
class Pool:
|
||||
def __init__(self, position, grid_size):
|
||||
self.pos = position
|
||||
self.size = grid_size
|
||||
def create_pools(grid_size):
|
||||
pools = []
|
||||
with open(file='houses.txt', mode='r', encoding='utf-8') as file:
|
||||
for l_index, line in enumerate(file):
|
||||
for h_index, if_house in enumerate(line):
|
||||
if if_house == '2':
|
||||
pool = Pool(
|
||||
[h_index*grid_size, l_index*grid_size], grid_size)
|
||||
pools.append(pool)
|
||||
return pools
|
4
trash.py
4
trash.py
@ -37,8 +37,8 @@ class Trash:
|
||||
self.size = grid_size
|
||||
self.content = draw_trash(filenames)[0]
|
||||
self.names = draw_trash(filenames)[1]
|
||||
self.mass = random.randint(0, 25)
|
||||
self.space = random.randint(0, 25)
|
||||
self.mass = random.randint(1, 25)
|
||||
self.space = random.randint(1, 25)
|
||||
|
||||
def new_pos(self, truck_pos, houses, multi):
|
||||
self.trash_content, self.trash_names = draw_trash(filenames)
|
||||
|
Loading…
Reference in New Issue
Block a user