Sztuczna_inteligencja_gr_13/bin/Classess/Node.py

154 lines
5.3 KiB
Python
Raw Normal View History

2021-04-30 23:52:55 +02:00
from resources.Globals import *
2021-04-29 16:28:43 +02:00
2021-04-24 17:32:07 +02:00
class Node:
def __init__(self):
self.state = State()
self.parent = None
2021-04-26 18:21:56 +02:00
self.action = ""
2021-04-24 17:32:07 +02:00
class State:
def __init__(self):
self.coord = []
self.direction = ""
def successor(state):
2021-04-26 18:21:56 +02:00
node_state_left = Node()
node_state_right = Node()
node_state_forward = Node()
if state.direction == "east":
node_state_left.state = State()
node_state_left.state.coord = state.coord
node_state_left.state.direction = "north"
node_state_left.action = "Left"
node_state_right.state = State()
node_state_right.state.coord = state.coord
node_state_right.state.direction = "south"
node_state_right.action = "Right"
2021-05-01 01:24:35 +02:00
if state.coord[0] + STEP < FRAME_WIDTH:
node_state_forward.state = State()
2021-05-01 01:24:35 +02:00
node_state_forward.state.coord = [state.coord[0] + STEP, state.coord[1]]
node_state_forward.state.direction = state.direction
node_state_forward.action = "Up"
2021-04-26 18:21:56 +02:00
elif state.direction == "west":
node_state_left.state = State()
node_state_left.state.coord = state.coord
node_state_left.state.direction = "south"
node_state_left.action = "Left"
node_state_right.state = State()
node_state_right.state.coord = state.coord
node_state_right.state.direction = "north"
node_state_right.action = "Right"
2021-05-01 01:24:35 +02:00
if state.coord[0] > x_start:
node_state_forward.state = State()
2021-05-01 01:24:35 +02:00
node_state_forward.state.coord = [state.coord[0] - STEP, state.coord[1]]
node_state_forward.state.direction = state.direction
node_state_forward.action = "Up"
2021-04-26 18:21:56 +02:00
elif state.direction == "north":
node_state_left.state = State()
node_state_left.state.coord = state.coord
node_state_left.state.direction = "west"
node_state_left.action = "Left"
node_state_right.state = State()
node_state_right.state.coord = state.coord
node_state_right.state.direction = "east"
node_state_right.action = "Right"
2021-05-01 01:24:35 +02:00
if state.coord[1] > x_start:
node_state_forward.state = State()
2021-05-01 01:24:35 +02:00
node_state_forward.state.coord = [state.coord[0], state.coord[1] - STEP]
node_state_forward.state.direction = state.direction
node_state_forward.action = "Up"
2021-04-26 18:21:56 +02:00
elif state.direction == "south":
2021-04-26 18:21:56 +02:00
node_state_left.state = State()
node_state_left.state.coord = state.coord
node_state_left.state.direction = "east"
node_state_left.action = "Left"
2021-04-26 18:21:56 +02:00
node_state_right.state = State()
node_state_right.state.coord = state.coord
node_state_right.state.direction = "west"
node_state_right.action = "Right"
2021-05-01 01:24:35 +02:00
if state.coord[1] + STEP < FRAME_HEIGHT:
node_state_forward.state = State()
2021-05-01 01:24:35 +02:00
node_state_forward.state.coord = [state.coord[0], state.coord[1] + STEP]
node_state_forward.state.direction = state.direction
node_state_forward.action = "Up"
2021-04-26 18:21:56 +02:00
if len(node_state_forward.state.coord) != 0:
return [node_state_left, node_state_right, node_state_forward]
else:
return [node_state_left, node_state_right]
2021-04-26 18:21:56 +02:00
2021-04-29 16:28:43 +02:00
def graph_search(fringe, explored, start_state, end_state_coord):
2021-04-26 18:21:56 +02:00
node = Node()
node.state = start_state
node.parent = node.state
fringe.append(node)
2021-04-29 16:28:43 +02:00
iterator = 0
2021-04-26 18:21:56 +02:00
2021-04-29 16:28:43 +02:00
end_loop = True
while end_loop:
2021-04-26 18:21:56 +02:00
if len(fringe) == 0:
2021-04-29 16:28:43 +02:00
end_loop = False
2021-04-26 18:21:56 +02:00
#return False
2021-04-29 16:28:43 +02:00
elem = fringe[iterator]
2021-04-26 18:21:56 +02:00
if elem.state.coord == end_state_coord:
return fringe
explored.append(elem)
another_states = successor(elem.state)
for i in range(0, len(another_states)):
n = len(fringe)
for j in range(0, n):
if another_states[i].state.coord[0] == fringe[j].state.coord[0] and another_states[i].state.coord[1] == fringe[j].state.coord[1]:
if another_states[i].state.direction == fringe[j].state.direction:
break
else:
states = []
for k in range(0, len(fringe)):
new_state = [fringe[k].state.coord, fringe[k].state.direction]
states.append(new_state)
now_state = [another_states[i].state.coord, another_states[i].state.direction]
if now_state in states:
break
another_states[i].parent = elem.state
fringe.append(another_states[i])
else:
states = []
for k in range(0, len(fringe)):
new_state = [fringe[k].state.coord, fringe[k].state.direction]
states.append(new_state)
now_state = [another_states[i].state.coord, another_states[i].state.direction]
2021-04-29 16:28:43 +02:00
if now_state in states:
2021-04-26 18:21:56 +02:00
break
2021-04-29 16:28:43 +02:00
2021-04-26 18:21:56 +02:00
if another_states[i].state.direction == fringe[j].state.direction:
another_states[i].parent = elem.state
fringe.append(another_states[i])
2021-04-29 16:28:43 +02:00
iterator += 1