コード例 #1
0
def construct_graph_from_json(my_graph, list):

    neighbors = list['neighbors']

    added_queue = set()
    added_queue.add(list['id'])

    queue = Queue(maxsize=0)
    queue.put(list['neighbors'][0]['id'])

    parent = list['id']
    print("Constructing graph... ")
    while queue.qsize() > 0:
        for nnode in neighbors:
            added_queue.add(nnode['id'])
            weight = transition_state(parent, nnode['id'])
            if (nnode['id'] != '7f3dc077574c013d98b2de8f735058b4'):
                my_graph.add_edge(
                    g.Edge(g.Node(parent), g.Node(nnode['id']),
                           weight['event']['effect']))
            if 'f1f131f647621a4be7c71292e79613f9' not in added_queue:
                queue.put(nnode['id'])

        print("Queue size is: " + str(queue.qsize()))
        parent = queue.get()
        room = get_state(parent)
        neighbors.clear()
        neighbors = room['neighbors']

    print("Constructed Graph: " + str(my_graph))
    return my_graph
コード例 #2
0
 def test_a_star_3(self):
     start_time = time.time()
     for g in self.graph_3s:
         path = utils.convert_edge_to_grid_actions(
             searches.a_star_search(g, graph.Node(utils.Tile(3, 0, "@1")),
                                    graph.Node(utils.Tile(2, 7, "@2"))))
         self.assertTrue(string_equal_without_order(path, "SSSSEESESSWWWW"))
     print("A_star_3: %.6f seconds" % (time.time() - start_time))
コード例 #3
0
 def test_a_star_5(self):
     start_time = time.time()
     expected_path = "SSSSSSSSSSEESSEESESESSEESSEESESESESESSEESESESESESESSESEESESESSESEESSEESSEESESESESESSESEESSESESEESSESEESESSESEESESESESESSEESESESESESESESESESSEESESESESESESSEESSEESESSESEESSEESESSEESESESESESESSEESESESSEESESSESEESSEESESESESSEESSESEESESSESESESESEESSEESESESESESESESESESESESESESESESSEESESSEESSEESESESESSEESESESSEESESESSEESESESESESESESESESESESESESSESEESSEESESSEESESSEESSEESESSEESESESESESESESESESESSEESEEEESSSSSE"
     path = utils.convert_edge_to_grid_actions(
         searches.a_star_search(self.graph_5,
                                graph.Node(utils.Tile(4, 0, "@1")),
                                graph.Node(utils.Tile(201, 206, "@5"))))
     print("A_star_5: %.6f seconds" % (time.time() - start_time))
     self.assertTrue(string_equal_without_order(path, expected_path))
コード例 #4
0
 def test_a_star_1(self):
     start_time = time.time()
     for g in self.graph_1s:
         self.assertEqual(
             "SSSSE",
             utils.convert_edge_to_grid_actions(
                 searches.a_star_search(g,
                                        graph.Node(utils.Tile(3, 0, "@1")),
                                        graph.Node(utils.Tile(4, 4,
                                                              "@6")))))
     print("A_star_1: %.6f seconds" % (time.time() - start_time))
コード例 #5
0
 def test_dijkstra_5(self):
     for g in self.graph_2s:
         self.assertEqual([
             graph.Edge(graph.Node(0), graph.Node(6), 3),
             graph.Edge(graph.Node(6), graph.Node(4), 1),
             graph.Edge(graph.Node(4), graph.Node(5), 5)
         ], searches.dijkstra_search(g, graph.Node(0), graph.Node(5)))
コード例 #6
0
 def test_dijkstra_3(self):
     for g in self.graph_1s:
         self.assertEqual([
             graph.Edge(graph.Node(1), graph.Node(2), 1),
             graph.Edge(graph.Node(2), graph.Node(4), 1),
             graph.Edge(graph.Node(4), graph.Node(5), 1)
         ], searches.dijkstra_search(g, graph.Node(1), graph.Node(5)))
コード例 #7
0
 def test_dijkstra_1(self):
     for g in self.graph_1s:
         self.assertEqual([
             graph.Edge(graph.Node(1), graph.Node(3), 1),
             graph.Edge(graph.Node(3), graph.Node(10), 1),
             graph.Edge(graph.Node(10), graph.Node(8), 1)
         ], searches.dijkstra_search(g, graph.Node(1), graph.Node(8)))
コード例 #8
0
 def test_dfs_4(self):
     for g in self.graph_2s:
         self.assertEqual([
             graph.Edge(graph.Node(0), graph.Node(1), 4),
             graph.Edge(graph.Node(1), graph.Node(2), 7),
             graph.Edge(graph.Node(2), graph.Node(5), 2)
         ], searches.dfs(g, graph.Node(0), graph.Node(5)))
コード例 #9
0
 def test_bfs_3(self):
     for g in self.graph_1s:
         self.assertEqual([
             graph.Edge(graph.Node(1), graph.Node(2), 1),
             graph.Edge(graph.Node(2), graph.Node(4), 1),
             graph.Edge(graph.Node(4), graph.Node(5), 1)
         ], searches.bfs(g, graph.Node(1), graph.Node(5)))
コード例 #10
0
 def test_bfs_1(self):
     for g in self.graph_1s:
         self.assertEqual([
             graph.Edge(graph.Node(1), graph.Node(3), 1),
             graph.Edge(graph.Node(3), graph.Node(10), 1),
             graph.Edge(graph.Node(10), graph.Node(8), 1)
         ], searches.bfs(g, graph.Node(1), graph.Node(8)))
コード例 #11
0
def bfs(initial_node, dest_node):
    """
    Breadth First Search
    uses graph to do search from the initial_node to dest_node
    returns a list of actions going from the initial node to dest_node
    """
    queue = []
    actions = []

    queue.append([initial_node])

    while queue:
        path = queue.pop(0)
        # last node in path
        node = path[-1]

        if node == dest_node:
            # convert nodes to edges
            for i in range(len(path) - 1):
                edge = g.Edge(path[i], path[i + 1], transition_state(path[i].data, path[i + 1].data)['event']['effect'])
                actions.append(edge)
            return actions

        for neighbor_room in get_state(node.data)['neighbors']:
            neighbor = g.Node(neighbor_room['id'])
            new_path = list(path)
            new_path.append(neighbor)
            queue.append(new_path)
コード例 #12
0
def queue_search(initial_node, dest_node, visit_queue, dijkstra=False):
    distances = {}
    distance_paths = {}
    parents = {}

    path = []
    path_trace_tile = None

    distances[initial_node] = 0
    distance_paths[initial_node] = [initial_node]
    visit_queue.put((0, initial_node))

    while not visit_queue.empty():
        entry = visit_queue.get()
        current = entry[1]
        if entry[0] != distances[current]:
            continue

        current_state = get_state(current)
        for neighbor in current_state['neighbors']:
            adjacent = neighbor['id']
            possible_distance = distances[current] + (-1 * transition_state(
                current, neighbor['id'])['event']['effect'])
            possible_distance_path = distance_paths[current] + [adjacent]

            if adjacent not in distances or (
                    dijkstra and possible_distance < distances[adjacent]
                    and len(possible_distance_path) == len(
                        set(possible_distance_path))):
                distances[adjacent] = possible_distance
                distance_paths[adjacent] = possible_distance_path
                parents[adjacent] = current
                if dest_node == adjacent:
                    path_trace_tile = adjacent
                visit_queue.put((distances[adjacent], adjacent))

    while path_trace_tile in parents:
        distance = transition_state(parents[path_trace_tile],
                                    path_trace_tile)['event']['effect']
        path.append(
            graph.Edge(graph.Node(parents[path_trace_tile]),
                       graph.Node(path_trace_tile), distance))
        path_trace_tile = parents[path_trace_tile]

    return list(reversed(path))
コード例 #13
0
 def test_bfs_4(self):
     for g in self.graph_2s:
         self.assertEqual(
             [
                 graph.Edge(graph.Node(0), graph.Node(3), 1),
                 graph.Edge(graph.Node(3), graph.Node(5), 11)
             ],
             searches.bfs(g, graph.Node(0), graph.Node(5))
         )
コード例 #14
0
 def test_bfs_5(self):
     for g in self.graph_2s:
         self.assertEqual(
             [
                 graph.Edge(graph.Node(0), graph.Node(1), 4),
                 graph.Edge(graph.Node(1), graph.Node(2), 7)
             ],
             searches.bfs(g, graph.Node(0), graph.Node(2))
         )
コード例 #15
0
 def test_remove_edge(self):
     # removing edges that doesn't exist should return false
     self.assertEqual(
         False,
         self.graph_1.remove_edge(
             graph.Edge(graph.Node(1), graph.Node(6), 1)))
     self.assertEqual(
         True,
         self.graph_1.remove_edge(
             graph.Edge(graph.Node(6), graph.Node(5), 1)))
     self.assertEqual(False,
                      self.graph_1.adjacent(graph.Node(6), graph.Node(5)))
コード例 #16
0
def dijkstra_search(initial_node, dest_node):
    """
    Dijkstra Search
    uses graph to do search from the initial_node to dest_node
    returns a list of actions going from the initial node to dest_node
    """
    dist = {}
    prev = {}
    queue = []
    actions = []
    visited = []

    dist[initial_node] = 0
    queue.append((0, initial_node))

    while queue:
        node = queue.pop(0)[1]
        visited.append(node)

        current_room = get_state(node.data)
        for neighbor_room in current_room['neighbors']:
            neighbor = g.Node(neighbor_room['id'])
            alt = dist[node] - transition_state(node.data, neighbor.data)['event']['effect']

            if neighbor not in dist or (alt < dist[neighbor] and neighbor not in visited):
                queue.append((alt, neighbor))
                dist[neighbor] = alt
                prev[neighbor] = node

        # sort
        queue = sorted(queue, key=lambda priority: priority[0])

    current = dest_node

    # convert nodes to edges
    while current != initial_node:
        parent = prev[current]
        actions = [g.Edge(parent, current, transition_state(parent.data, current.data)['event']['effect'])] + actions
        current = parent

    return actions
コード例 #17
0
    def test_add_node(self):
        self.assertEqual(False, self.graph_1.add_node(graph.Node(1)))
        self.assertEqual(False, self.graph_1.add_node(graph.Node(6)))

        self.assertEqual(True, self.graph_1.add_node(graph.Node(11)))

    def test_remove_node(self):
        self.assertEqual(True, self.graph_1.remove_node(graph.Node(6)))
        # check if the node is removed and neighbors of 9 is also removed
        self.assertEqual([], self.graph_1.neighbors(graph.Node(9)))
        # Removing a node that doens't exist in the graph should return false as noop
        self.assertEqual(False, self.graph_1.remove_node(graph.Node(1234)))

    def test_add_edge(self):
        self.assertEqual(False, self.graph_1.adjacent(graph.Node(1), graph.Node(4)))

        self.assertEqual(True, self.graph_1.add_edge(graph.Edge(graph.Node(1), graph.Node(4), 1)))
        self.assertEqual([graph.Node(2),graph.Node(3),graph.Node(4)], self.graph_1.neighbors(graph.Node(1)))
        self.assertEqual(True, self.graph_1.adjacent(graph.Node(1), graph.Node(4)))

        # When adding edge that already existed, should return false
        self.assertEqual(False, self.graph_1.add_edge(graph.Edge(graph.Node(1), graph.Node(2), 1)))


    def test_remove_edge(self):
        # removing edges that doesn't exist should return false
        self.assertEqual(False, self.graph_1.remove_edge(graph.Edge(graph.Node(1), graph.Node(6), 1)))
        self.assertEqual(True, self.graph_1.remove_edge(graph.Edge(graph.Node(6), graph.Node(5), 1)))
self.assertEqual(False, self.graph_1.adjacent(graph.Node(6), graph.Node(5)))
コード例 #18
0
    def test_add_edge(self):
        self.assertEqual(False,
                         self.graph_1.adjacent(graph.Node(1), graph.Node(4)))

        self.assertEqual(
            True,
            self.graph_1.add_edge(graph.Edge(graph.Node(1), graph.Node(4), 1)))
        self.assertEqual(
            [graph.Node(2), graph.Node(3),
             graph.Node(4)], self.graph_1.neighbors(graph.Node(1)))
        self.assertEqual(True,
                         self.graph_1.adjacent(graph.Node(1), graph.Node(4)))

        # When adding edge that already existed, should return false
        self.assertEqual(
            False,
            self.graph_1.add_edge(graph.Edge(graph.Node(1), graph.Node(2), 1)))
コード例 #19
0
 def test_remove_node(self):
     self.assertEqual(True, self.graph_1.remove_node(graph.Node(6)))
     # check if the node is removed and neighbors of 9 is also removed
     self.assertEqual([], self.graph_1.neighbors(graph.Node(9)))
     # Removing a node that doens't exist in the graph should return false as noop
     self.assertEqual(False, self.graph_1.remove_node(graph.Node(1234)))
コード例 #20
0
    def test_add_node(self):
        self.assertEqual(False, self.graph_1.add_node(graph.Node(1)))
        self.assertEqual(False, self.graph_1.add_node(graph.Node(6)))

        self.assertEqual(True, self.graph_1.add_node(graph.Node(11)))
コード例 #21
0
    def test_neighbors(self):
        self.assertEqual([graph.Node(2), graph.Node(3)],
                         self.graph_1.neighbors(graph.Node(1)))
        self.assertEqual([graph.Node(5), graph.Node(7)],
                         self.graph_1.neighbors(graph.Node(4)))
        self.assertEqual([graph.Node(0)],
                         self.graph_1.neighbors(graph.Node(5)))
        self.assertEqual([], self.graph_1.neighbors(graph.Node(8)))

        self.assertEqual(
            [graph.Node(1), graph.Node(3),
             graph.Node(6)], self.graph_2.neighbors(graph.Node(0)))
        self.assertEqual([], self.graph_2.neighbors(graph.Node(5)))
コード例 #22
0
    def test_adjacent(self):
        self.assertEqual(True,
                         self.graph_1.adjacent(graph.Node(1), graph.Node(2)))
        self.assertEqual(True,
                         self.graph_1.adjacent(graph.Node(3), graph.Node(6)))
        self.assertEqual(True,
                         self.graph_1.adjacent(graph.Node(3), graph.Node(10)))

        self.assertEqual(False,
                         self.graph_1.adjacent(graph.Node(1), graph.Node(6)))
        self.assertEqual(False,
                         self.graph_1.adjacent(graph.Node(4), graph.Node(9)))

        self.assertEqual(True,
                         self.graph_2.adjacent(graph.Node(1), graph.Node(2)))
        self.assertEqual(True,
                         self.graph_2.adjacent(graph.Node(4), graph.Node(5)))

        self.assertEqual(False,
                         self.graph_2.adjacent(graph.Node(1), graph.Node(5)))
コード例 #23
0
 def test_edge_comparison(self):
     """Test edge comparison"""
     self.assertEqual(graph.Edge(graph.Node(1), graph.Node(2), 1),
                      graph.Edge(graph.Node(1), graph.Node(2), 1))
コード例 #24
0
 def test_node_comparison(self):
     """Test node comparison"""
     self.assertEqual(graph.Node(1), graph.Node(1))
コード例 #25
0
 def test_dfs_2(self):
     for g in self.graph_1s:
         self.assertEqual(
             [
                 graph.Edge(graph.Node(1), graph.Node(2), 1),
                 graph.Edge(graph.Node(2), graph.Node(4), 1),
                 graph.Edge(graph.Node(4), graph.Node(5), 1),
                 graph.Edge(graph.Node(5), graph.Node(0), 1),
                 graph.Edge(graph.Node(0), graph.Node(7), 1),
                 graph.Edge(graph.Node(7), graph.Node(10), 1)
             ],
             searches.dfs(g, graph.Node(1), graph.Node(10))
         )
コード例 #26
0
        print("Queue size is: " + str(queue.qsize()))
        parent = queue.get()
        room = get_state(parent)
        neighbors.clear()
        neighbors = room['neighbors']

    print("Constructed Graph: " + str(my_graph))
    return my_graph


if __name__ == "__main__":
    # Your code starts here
    empty_room = get_state('7f3dc077574c013d98b2de8f735058b4')
    print("Original JSON: " + str(empty_room))
    graph = construct_graph_from_json(g.AdjacencyList(), empty_room)

    #print(transition_state(empty_room['id'], empty_room['neighbors'][0]['id']))
    bfs_path = s.bfs(graph, g.Node('7f3dc077574c013d98b2de8f735058b4'),
                     g.Node('f1f131f647621a4be7c71292e79613f9'))
    if bfs_path:
        print("Bfs_path: " + str(bfs_path))
    else:
        print("Bfs_path: No Path Found")

    dijkstra_path = dijkstra_search(graph,
                                    g.Node('7f3dc077574c013d98b2de8f735058b4'),
                                    g.Node('f1f131f647621a4be7c71292e79613f9'))
    if dijkstra_path:
        print("Dijkstra_path: " + str(dijkstra_path))
    else:
        print("Dijkstra_path: No Path Found")
コード例 #27
0
        # sort
        queue = sorted(queue, key=lambda priority: priority[0])

    current = dest_node

    # convert nodes to edges
    while current != initial_node:
        parent = prev[current]
        actions = [g.Edge(parent, current, transition_state(parent.data, current.data)['event']['effect'])] + actions
        current = parent

    return actions

if __name__ == "__main__":
    # Your code starts here
    empty_room_node = g.Node(get_state('7f3dc077574c013d98b2de8f735058b4')['id'])
    dark_room_node = g.Node(get_state('f1f131f647621a4be7c71292e79613f9')['id'])

    strings = bfs_path(empty_room_node, dark_room_node)
    print("BFS path:")
    for actions in strings[0]:
        print(actions)
    print("Total hp: " + strings[1])

    strings = dijkstra_path(empty_room_node, dark_room_node)
    print("\nDijkstra path:")
    for actions in strings[0]:
        print(actions)
    print("Total hp: " + strings[1])