168 lines
6.1 KiB
Python
168 lines
6.1 KiB
Python
class Node:
|
|
def __init__(self):
|
|
self.state = State()
|
|
self.parent = None
|
|
self.action = ""
|
|
|
|
|
|
class State:
|
|
def __init__(self):
|
|
self.coord = []
|
|
self.direction = ""
|
|
|
|
|
|
def successor(state):
|
|
|
|
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"
|
|
|
|
if state.coord[0] + 53 < 533:
|
|
node_state_forward.state = State()
|
|
node_state_forward.state.coord = [state.coord[0] + 53, state.coord[1]]
|
|
node_state_forward.state.direction = state.direction
|
|
node_state_forward.action = "Up"
|
|
|
|
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"
|
|
|
|
if state.coord[0] > 3:
|
|
node_state_forward.state = State()
|
|
node_state_forward.state.coord = [state.coord[0] - 53, state.coord[1]]
|
|
node_state_forward.state.direction = state.direction
|
|
node_state_forward.action = "Up"
|
|
|
|
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"
|
|
|
|
if state.coord[1] > 3:
|
|
node_state_forward.state = State()
|
|
node_state_forward.state.coord = [state.coord[0], state.coord[1] - 53]
|
|
node_state_forward.state.direction = state.direction
|
|
node_state_forward.action = "Up"
|
|
|
|
elif state.direction == "south":
|
|
|
|
node_state_left.state = State()
|
|
node_state_left.state.coord = state.coord
|
|
node_state_left.state.direction = "east"
|
|
node_state_left.action = "Left"
|
|
|
|
node_state_right.state = State()
|
|
node_state_right.state.coord = state.coord
|
|
node_state_right.state.direction = "west"
|
|
node_state_right.action = "Right"
|
|
|
|
if state.coord[1] + 53 < 533:
|
|
node_state_forward.state = State()
|
|
node_state_forward.state.coord = [state.coord[0], state.coord[1] + 53]
|
|
node_state_forward.state.direction = state.direction
|
|
node_state_forward.action = "Up"
|
|
|
|
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]
|
|
|
|
|
|
def graphsearch(fringe, explored, start_state, end_state_coord):
|
|
|
|
node = Node()
|
|
node.state = start_state
|
|
node.parent = node.state
|
|
#node.action = "Right"
|
|
fringe.append(node)
|
|
iter = 0
|
|
|
|
bool = True
|
|
while bool:
|
|
if len(fringe) == 0:
|
|
bool = False
|
|
#return False
|
|
|
|
elem = fringe[iter]
|
|
|
|
if elem.state.coord == end_state_coord:
|
|
bool = False
|
|
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
|
|
# states.append(new_state)
|
|
# now_state = another_states[i].state
|
|
# if now_state in states:
|
|
# break
|
|
|
|
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
|
|
|
|
# bool_break = False
|
|
# for k in range(0, n):
|
|
# if another_states[i].state.coord[0] == fringe[k].state.coord[0] and another_states[i].state.coord[1] == fringe[k].state.coord[1]:
|
|
# if another_states[i].state.direction == fringe[k].state.direction:
|
|
# bool_break = True
|
|
# if bool_break:
|
|
# 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]
|
|
if now_state in states:
|
|
break
|
|
# if another_states[i] in fringe:
|
|
# break
|
|
if another_states[i].state.direction == fringe[j].state.direction:
|
|
another_states[i].parent = elem.state
|
|
fringe.append(another_states[i])
|
|
iter += 1
|