Dodanie wypisywanie kosztu do AStar1 i ustawiono staly koszt obrotu

This commit is contained in:
Paulina Smierzchalska 2024-04-27 20:09:12 +02:00
parent 03434fdb79
commit af15a10048
2 changed files with 23 additions and 10 deletions

View File

@ -38,30 +38,40 @@ def get_cost_for_plant(plant_name):
def A_star(istate, pole): def A_star(istate, pole):
# goalTreasure = (random.randint(0,NUM_X-1), random.randint(0,NUM_Y-1)) #goalTreasure = (5, 5)
# #jeśli chcemy używać random musimy wykreslić sloty z kamieniami, ponieważ tez mogą się wylosować i wtedy traktor w ogóle nie rusza
#lub zrobić to jakoś inaczej, np. funkcja szukająca najmniej nawodnionej rośliny
while True: while True:
goalTreasure = (random.randint(0, NUM_X - 1), random.randint(0, NUM_Y - 1)) # Współrzędne celu goalTreasure = (random.randint(0, NUM_X - 1), random.randint(0, NUM_Y - 1)) # Współrzędne celu
if goalTreasure not in stoneList: if goalTreasure not in stoneList:
break break
fringe = PriorityQueue() # Kolejka priorytetowa dla wierzchołków do rozpatrzenia fringe = PriorityQueue() # Kolejka priorytetowa dla wierzchołków do rozpatrzenia
explored = [] # Lista odwiedzonych stanów explored = [] # Lista odwiedzonych stanów
obrot = 1
# Tworzenie węzła początkowego # Tworzenie węzła początkowego
x = Node.Node(istate) x = Node.Node(istate)
x.g = 0 x.g = 0
x.h = heuristic(x.state, goalTreasure) x.h = heuristic(x.state, goalTreasure)
fringe.put((x.g + x.h, x)) # Dodanie węzła do kolejki fringe.put((x.g + x.h, x)) # Dodanie węzła do kolejki
total_cost = 0
while not fringe.empty(): while not fringe.empty():
_, elem = fringe.get() # Pobranie węzła z najniższym priorytetem _, elem = fringe.get() # Pobranie węzła z najniższym priorytetem
if BFS.goalTest3(elem.state, goalTreasure): # Sprawdzenie, czy osiągnięto cel if BFS.goalTest3(elem.state, goalTreasure): # Sprawdzenie, czy osiągnięto cel
path = [] path = []
total_cost = elem.g
print("Koszt", total_cost)
while elem.parent is not None: # Odtworzenie ścieżki while elem.parent is not None: # Odtworzenie ścieżki
path.append([elem.parent, elem.action]) path.append([elem.parent, elem.action])
elem = elem.parent elem = elem.parent
for node, action in path:
# Obliczanie kosztu ścieżki dla każdego pola i wyświetlanie
plant_name = get_plant_name_from_coordinates(node.state['x'], node.state['y'], pole)
plant_cost = get_cost_for_plant(plant_name)
if action == "left" or action == "right": # Liczenie kosztu tylko dla pól nie będących obrotami
total_cost += obrot
else:
total_cost += plant_cost
return path return path
explored.append(elem.state) explored.append(elem.state)
@ -78,8 +88,11 @@ def A_star(istate, pole):
# Pobranie kosztu dla danej rośliny # Pobranie kosztu dla danej rośliny
plant_cost = get_cost_for_plant(plant_name) plant_cost = get_cost_for_plant(plant_name)
# Obliczenie kosztu ścieżki dla dziecka if child.action == "left" or child.action == "right":
child.g = elem.g + plant_cost child.g = elem.g + obrot
else:
child.g = elem.g + plant_cost
# Obliczenie heurystyki dla dziecka # Obliczenie heurystyki dla dziecka
child.h = heuristic(child.state, goalTreasure) child.h = heuristic(child.state, goalTreasure)

10
App.py
View File

@ -79,12 +79,12 @@ def init_demo(): #Demo purpose
if (Astar): if (Astar):
aStarRoot = AStar.A_star({'x': 0, 'y': 0, 'direction': "E"}, pole) aStarRoot = AStar.A_star({'x': 0, 'y': 0, 'direction': "E"}, pole)
if aStarRoot: if aStarRoot:
print("Pełna ścieżka agenta:") #print("Pełna ścieżka agenta:")
aStarRoot.reverse() aStarRoot.reverse()
for node in aStarRoot: #for node in aStarRoot:
state = node[0].state # Pobranie stanu z obiektu Node # state = node[0].state # Pobranie stanu z obiektu Node
action = node[1] # Pobranie akcji # action = node[1] # Pobranie akcji
#print("Współrzędne pola:", state['x'], state['y'], "- Akcja:",action) # wypisuje ścieżkę i kroki które robi traktor # print("Współrzędne pola:", state['x'], state['y'], "- Akcja:",action) # wypisuje ścieżkę i kroki które robi traktor
print_to_console("Traktor porusza się obliczoną ścieżką A*") print_to_console("Traktor porusza się obliczoną ścieżką A*")
traktor.move_by_root(aStarRoot, pole, [traktor.irrigateSlot]) traktor.move_by_root(aStarRoot, pole, [traktor.irrigateSlot])
else: else: