diff --git a/degrees.py b/degrees.py index c68171e..caea424 100644 --- a/degrees.py +++ b/degrees.py @@ -93,41 +93,45 @@ def shortest_path(source, target): """ frontier = QueueFrontier() explored = StackFrontier() + # Create our initial node, since this is the starting node there will be no parent node. + # No need to worry about populating a movie_id. frontier.add(Node(source, None, None)) - results = [[]] + results = [] - while frontier: + while not frontier.empty(): currentNode = frontier.remove() - + # Is the currentNode's state (person_id) equal to the target (also a person_id)? if currentNode.state == target: tmp = currentNode - print("Found %s" %(people[tmp.state])) - print("Found!") - cost = 0 - r = [] - r.append(tmp) - index = len(results) - + # If so, loop over the currentNode's parents, grandparents and so forth until we hit a node + # that has no parent node. while tmp: - if not tmp.parent: - r.append(tmp.parent) - print("Parent found! %s" %(people[tmp.state])) + # If the parent node is None, then that means we've hit the last node in the list. + # So, we won't be adding this tmp node to the result listing as it is the source. + if not tmp.parent == None: + results.append((tmp.action, tmp.state)) tmp = tmp.parent - cost+=1 - results.append(r) - print("Estimated Cost %d" %(cost)) - #break + # Since we traversed the target node's parents from bottom up, so reverse the list to present the order of the connections + # in the order the caller code is expecting. + results.reverse() + print(results) + break - if not explored.contains_state(currentNode.state): - # currentNode.state has person ID. - neighbors = neighbors_for_person(currentNode.state) - explored.add(currentNode) + # currentNode.state has person ID. + neighbors = neighbors_for_person(currentNode.state) + # currentNode has been explored, so add it it the explored stack. + explored.add(currentNode) + + for i in neighbors: + # i is a pair (movie_id, person_id), so i[i] contains the person_id. + if not explored.contains_state(i[1]): + # i[0] contains movie_id (this seemed like the best thing to use for the "action" parameter of the Node object for) + # currentNode is being set as the parent node of the new node being added to the frontier + # i[1] contains person_id + frontier.add(Node(i[1], currentNode, i[0])) - for i in neighbors: - frontier.add(Node(i[1], currentNode, None)) - - return results + return None def person_id_for_name(name): """