use*_*661 3 python algorithm depth-first-search
我一直在尝试实现深度优先搜索的不同方法.我找到了一些工作方法,但它们涉及一些相当繁琐的字典工作.我使用列表开发了一个新想法,但此实现返回的操作与所需的结果不匹配.我会尝试尽可能清楚地评论代码:
start = problem.getStartState() ## returns an (x, y) tuple
children = problem.getSuccessors(start) ##returns the children of a parent node in ((start
state), action, cost) format.
stack = Stack() ##creates a Stack (LIFO) data structure
visited = [] ##list of visited nodes
visited.append(start)
for child in children:
stack.push((child, [], [], 0)) ##push children to fringe in the format of (child,
while stack: ##path taken, actions taken, cost)
parent = stack.pop()
node = parent[0]
if parent[0] in visited: continue
visited.append(parent[0])
path = parent[1] + [node[0]] ##assigns previous path/actions/cost to new
actions = parent[2] + [node[1]] ##node, creating a cumulative, ordered list of
print actions ##the path/actions and a cumulative cost
cost = parent[3] + node[2]
if problem.isGoalState(node[0]):
print parent[2]
return parent[2] ## returns list of actions
children = problem.getSuccessors(node[0])
if children != []:
for child in children:
stack.push((child, path, actions, cost)) ##assigns cumulative lists to child
Run Code Online (Sandbox Code Playgroud)
任何人都可以看到我的问题可能存在于这个实现中 顺便说一下,我知道DFS对于大多数情况来说是一种效率低下的算法.但是,一旦我得到这个实现的权利,它应该能够通过简单地改变存储的父节点的子数据结构跨越到其他搜索算法.
小智 6
CS188朋友:D这里很难读取你的代码...所有这些索引%)使用更多的变量,它会更清楚.我的解决方案
def depthFirstSearch(problem):
fringe = util.Stack();
expanded = set();
fringe.push((problem.getStartState(),[],0));
while not fringe.isEmpty():
curState, curMoves, curCost = fringe.pop();
if(curState in expanded):
continue;
expanded.add(curState);
if problem.isGoalState(curState):
return curMoves;
for state, direction, cost in problem.getSuccessors(curState):
fringe.push((state, curMoves+[direction], curCost));
return [];
我希望我不需要发表评论.这很容易阅读:)祝你有个美好的一天;)