finish A*
This commit is contained in:
@ -93,19 +93,57 @@ def depthFirstSearch(problem: SearchProblem):
|
|||||||
# action_list=["South", "South", "West", "South", "West", "West", "South", "West"]
|
# action_list=["South", "South", "West", "South", "West", "West", "South", "West"]
|
||||||
vis_stk=util.Stack()
|
vis_stk=util.Stack()
|
||||||
has_visited={}
|
has_visited={}
|
||||||
vis_stk.push((problem.getStartState(),[]))
|
vis_stk.push(problem.getStartState())
|
||||||
|
# print(f'push {problem.getStartState()}')
|
||||||
has_visited[problem.getStartState()]=True
|
has_visited[problem.getStartState()]=True
|
||||||
|
nex_idx={}
|
||||||
|
nex_idx[problem.getStartState()]=0
|
||||||
|
best_actions={}
|
||||||
|
best_actions[problem.getStartState()]=[]
|
||||||
|
stored_successors={}
|
||||||
|
def SafelyFetchSuccessors(problem,stored_successors,state):
|
||||||
|
if state in stored_successors:
|
||||||
|
return stored_successors[state]
|
||||||
|
else:
|
||||||
|
stored_successors[state]=problem.getSuccessors(state)
|
||||||
|
return stored_successors[state]
|
||||||
while True:
|
while True:
|
||||||
if vis_stk.isEmpty():
|
if vis_stk.isEmpty():
|
||||||
break
|
break
|
||||||
cur_state,cur_actions=vis_stk.pop()
|
cur_state=vis_stk.pop()
|
||||||
|
# print(f'pop {cur_state}')
|
||||||
|
cur_actions=best_actions[cur_state]
|
||||||
if problem.isGoalState(cur_state):
|
if problem.isGoalState(cur_state):
|
||||||
action_list=cur_actions
|
action_list=cur_actions
|
||||||
break
|
break
|
||||||
for next_state,action,_ in problem.getSuccessors(cur_state):
|
vis_stk.push(cur_state)
|
||||||
|
# print(f'push {cur_state}')
|
||||||
|
# successors=problem.getSuccessors(cur_state)
|
||||||
|
successors=SafelyFetchSuccessors(problem,stored_successors,cur_state)
|
||||||
|
# print(f"getting successors of {cur_state} with {successors}")
|
||||||
|
while nex_idx[cur_state]>=len(successors):
|
||||||
|
tmp=vis_stk.pop()
|
||||||
|
# print(f'pop {tmp}')
|
||||||
|
if vis_stk.isEmpty():
|
||||||
|
break
|
||||||
|
cur_state=vis_stk.pop()
|
||||||
|
# print(f'pop {cur_state}')
|
||||||
|
cur_actions=best_actions[cur_state]
|
||||||
|
vis_stk.push(cur_state)
|
||||||
|
# print(f'push {cur_state}')
|
||||||
|
# successors=problem.getSuccessors(cur_state)
|
||||||
|
successors=SafelyFetchSuccessors(problem,stored_successors,cur_state)
|
||||||
|
# print(f'getting successors of {cur_state} with {successors}')
|
||||||
|
if vis_stk.isEmpty():
|
||||||
|
break
|
||||||
|
next_state,action,_=successors[nex_idx[cur_state]]
|
||||||
|
nex_idx[cur_state]+=1
|
||||||
if next_state not in has_visited:
|
if next_state not in has_visited:
|
||||||
vis_stk.push((next_state,cur_actions+[action]))
|
vis_stk.push(next_state)
|
||||||
|
# print(f'push {next_state}')
|
||||||
|
best_actions[next_state]=cur_actions+[action]
|
||||||
has_visited[next_state]=True
|
has_visited[next_state]=True
|
||||||
|
nex_idx[next_state]=0
|
||||||
return action_list
|
return action_list
|
||||||
|
|
||||||
def breadthFirstSearch(problem: SearchProblem):
|
def breadthFirstSearch(problem: SearchProblem):
|
||||||
@ -171,8 +209,35 @@ def nullHeuristic(state, problem=None):
|
|||||||
|
|
||||||
def aStarSearch(problem: SearchProblem, heuristic=nullHeuristic):
|
def aStarSearch(problem: SearchProblem, heuristic=nullHeuristic):
|
||||||
"""Search the node that has the lowest combined cost and heuristic first."""
|
"""Search the node that has the lowest combined cost and heuristic first."""
|
||||||
"*** YOUR CODE HERE ***"
|
kInf=1e100
|
||||||
util.raiseNotDefined()
|
action_list=[]
|
||||||
|
vis_que=util.PriorityQueue()
|
||||||
|
has_visited={}
|
||||||
|
vis_que.push(problem.getStartState(),heuristic(problem.getStartState(),problem))
|
||||||
|
dis={}
|
||||||
|
dis[problem.getStartState()]=0
|
||||||
|
best_actions={}
|
||||||
|
best_actions[problem.getStartState()]=[]
|
||||||
|
while True:
|
||||||
|
if vis_que.isEmpty():
|
||||||
|
break
|
||||||
|
cur_state=vis_que.pop()
|
||||||
|
cur_actions=best_actions[cur_state]
|
||||||
|
# print("cur_state:",cur_state, "cur cost=",dis[cur_state])
|
||||||
|
if problem.isGoalState(cur_state):
|
||||||
|
action_list=cur_actions
|
||||||
|
# print("minimal cost:",dis[cur_state])
|
||||||
|
break
|
||||||
|
if not cur_state in has_visited:
|
||||||
|
for next_state,action,cost in problem.getSuccessors(cur_state):
|
||||||
|
# print(f"next_state={next_state}")
|
||||||
|
# print(f"try update {next_state} with cost={dis[cur_state]+cost}")
|
||||||
|
if dis[cur_state]+cost<dis.get(next_state,kInf):
|
||||||
|
vis_que.update(next_state,dis[cur_state]+cost+heuristic(next_state,problem))
|
||||||
|
dis[next_state]=min(dis.get(next_state,kInf),dis[cur_state]+cost)
|
||||||
|
best_actions[next_state]=cur_actions+[action]
|
||||||
|
has_visited[cur_state]=True
|
||||||
|
return action_list
|
||||||
|
|
||||||
|
|
||||||
# Abbreviations
|
# Abbreviations
|
||||||
|
Reference in New Issue
Block a user