From 0cb2160e9ef3f43a5d7e03c3b2f974fa0b11a1b3 Mon Sep 17 00:00:00 2001 From: onyx-and-iris Date: Tue, 19 Dec 2023 15:47:26 +0000 Subject: [PATCH] add chapter9 exercises --- chapter9/dijkstra1.png | Bin 0 -> 24774 bytes chapter9/dijkstra2.png | Bin 0 -> 17740 bytes chapter9/dijkstra3.png | Bin 0 -> 18323 bytes chapter9/ex171a.py | 73 +++++++++++++++++++++++ chapter9/ex171b.py | 58 ++++++++++++++++++ chapter9/ex171c.py | 59 +++++++++++++++++++ chapter9/examples/heaptest.py | 10 ++++ chapter9/examples/list.py | 14 +++++ chapter9/examples/priorityqueuetest.py | 12 ++++ chapter9/rama.py | 78 +++++++++++++++++++++++++ 10 files changed, 304 insertions(+) create mode 100644 chapter9/dijkstra1.png create mode 100644 chapter9/dijkstra2.png create mode 100644 chapter9/dijkstra3.png create mode 100644 chapter9/ex171a.py create mode 100644 chapter9/ex171b.py create mode 100644 chapter9/ex171c.py create mode 100644 chapter9/examples/heaptest.py create mode 100644 chapter9/examples/list.py create mode 100644 chapter9/examples/priorityqueuetest.py create mode 100644 chapter9/rama.py diff --git a/chapter9/dijkstra1.png b/chapter9/dijkstra1.png new file mode 100644 index 0000000000000000000000000000000000000000..fb7c39e0cfddd80d88f4b172ef9f0a1d6cc533ef GIT binary patch literal 24774 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%0AUg(*?s9T6_<< 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 z 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 literal 0 HcmV?d00001 diff --git a/chapter9/ex171a.py b/chapter9/ex171a.py new file mode 100644 index 0000000..444b25a --- /dev/null +++ b/chapter9/ex171a.py @@ -0,0 +1,73 @@ +import logging +import math + +logging.basicConfig(level=logging.DEBUG) +logger = logging.getLogger(__name__) + +graph = {} +graph["start"] = {} +graph["start"]["a"] = 5 +graph["start"]["b"] = 2 +graph["a"] = {} +graph["a"]["b"] = 8 +graph["a"]["c"] = 4 +graph["a"]["d"] = 2 +graph["b"] = {} +graph["b"]["a"] = 8 +graph["b"]["d"] = 7 +graph["c"] = {} +graph["c"]["d"] = 6 +graph["c"]["fin"] = 3 +graph["d"] = {} +graph["d"]["fin"] = 1 +graph["fin"] = {} + +costs = {} +costs["a"] = 5 +costs["b"] = 2 +costs["c"] = math.inf +costs["d"] = math.inf +costs["fin"] = math.inf + +parents = {} +parents["a"] = "start" +parents["b"] = "start" +parents["c"] = None +parents["d"] = None +parents["fin"] = None + +processed = set() + + +def find_lowest_cost_node(costs): + lowest_cost = math.inf + lowest_cost_node = None + for node in costs: + cost = costs[node] + if cost < lowest_cost and node not in processed: + lowest_cost = cost + lowest_cost_node = node + return lowest_cost_node + + +node = find_lowest_cost_node(costs) +while node is not None: + cost = costs[node] + neighbors = graph[node] + for n in neighbors.keys(): + new_cost = cost + neighbors[n] + if costs[n] > new_cost: + costs[n] = new_cost + parents[n] = node + processed.add(node) + node = find_lowest_cost_node(costs) + +print(f"lowest cost route: {costs['fin']}") +route = [] +next = "fin" +while next != "start": + route.append(next) + next = parents[next] +route.append("start") + +print(f"route: {list(reversed(route))}") diff --git a/chapter9/ex171b.py b/chapter9/ex171b.py new file mode 100644 index 0000000..6c7bcb2 --- /dev/null +++ b/chapter9/ex171b.py @@ -0,0 +1,58 @@ +import logging +import math + +logging.basicConfig(level=logging.DEBUG) +logger = logging.getLogger(__name__) + +graph = {} +graph["start"] = {} +graph["start"]["a"] = 10 +graph["a"] = {} +graph["a"]["c"] = 20 +graph["b"] = {} +graph["b"]["a"] = 1 +graph["b"]["c"] = 1 +graph["c"] = {} +graph["c"]["b"] = 1 +graph["c"]["fin"] = 30 +graph["fin"] = {} + +costs = {} +costs["a"] = 10 +costs["b"] = math.inf +costs["c"] = math.inf +costs["fin"] = math.inf + +parents = {} +parents["a"] = "start" +parents["b"] = None +parents["c"] = None +parents["fin"] = None + +processed = set() + + +def find_lowest_cost_node(costs): + lowest_cost = math.inf + lowest_cost_node = None + for node in costs: + cost = costs[node] + if cost < lowest_cost and node not in processed: + lowest_cost = cost + lowest_cost_node = node + return lowest_cost_node + + +node = find_lowest_cost_node(costs) +while node is not None: + cost = costs[node] + neighbors = graph[node] + for n in neighbors.keys(): + new_cost = cost + neighbors[n] + if costs[n] > new_cost: + costs[n] = new_cost + parents[n] = node + processed.add(node) + node = find_lowest_cost_node(costs) + +print(f"lowest cost route: {costs['fin']}") diff --git a/chapter9/ex171c.py b/chapter9/ex171c.py new file mode 100644 index 0000000..74e3cba --- /dev/null +++ b/chapter9/ex171c.py @@ -0,0 +1,59 @@ +import logging +import math + +logging.basicConfig(level=logging.DEBUG) +logger = logging.getLogger(__name__) + +graph = {} +graph["start"] = {} +graph["start"]["a"] = 2 +graph["start"]["b"] = 2 +graph["a"] = {} +graph["a"]["b"] = 2 +graph["b"] = {} +graph["b"]["c"] = 2 +graph["b"]["fin"] = 2 +graph["c"] = {} +graph["c"]["fin"] = 2 +graph["fin"] = {} + + +costs = {} +costs["a"] = 2 +costs["b"] = 2 +costs["c"] = math.inf +costs["fin"] = math.inf + +parents = {} +parents["a"] = "start" +parents["b"] = "start" +parents["c"] = None +parents["fin"] = None + +processed = set() + + +def find_lowest_cost_node(costs): + lowest_cost = math.inf + lowest_cost_node = None + for node in costs: + cost = costs[node] + if cost < lowest_cost and node not in processed: + lowest_cost = cost + lowest_cost_node = node + return lowest_cost_node + + +node = find_lowest_cost_node(costs) +while node is not None: + cost = costs[node] + neighbors = graph[node] + for n in neighbors.keys(): + new_cost = cost + neighbors[n] + if costs[n] > new_cost: + costs[n] = new_cost + parents[n] = node + processed.add(node) + node = find_lowest_cost_node(costs) + +print(f"lowest cost route: {costs['fin']}") diff --git a/chapter9/examples/heaptest.py b/chapter9/examples/heaptest.py new file mode 100644 index 0000000..9af2fb5 --- /dev/null +++ b/chapter9/examples/heaptest.py @@ -0,0 +1,10 @@ +import heapq + +customers = [] +heapq.heappush(customers, (2, "Harry")) +heapq.heappush(customers, (3, "Charles")) +heapq.heappush(customers, (1, "Riya")) +heapq.heappush(customers, (4, "Stacy")) + +while customers: + print(heapq.heappop(customers)) diff --git a/chapter9/examples/list.py b/chapter9/examples/list.py new file mode 100644 index 0000000..0e04b1c --- /dev/null +++ b/chapter9/examples/list.py @@ -0,0 +1,14 @@ +customers = [] +customers.append((2, "Harry")) # no sort needed here because 1 item. +customers.append((3, "Charles")) +customers.sort(reverse=True) +# Need to sort to maintain order +customers.append((1, "Riya")) +customers.sort(reverse=True) +# Need to sort to maintain order +customers.append((4, "Stacy")) +customers.sort(reverse=True) + +while customers: + print(customers.pop(0)) +# Will print names in the order: Stacy, Charles, Harry, Riya. diff --git a/chapter9/examples/priorityqueuetest.py b/chapter9/examples/priorityqueuetest.py new file mode 100644 index 0000000..4c48746 --- /dev/null +++ b/chapter9/examples/priorityqueuetest.py @@ -0,0 +1,12 @@ +from queue import PriorityQueue + +customers = ( + PriorityQueue() +) # we initialise the PQ class instead of using a function to operate upon a list. +customers.put((2, "Harry")) +customers.put((3, "Charles")) +customers.put((1, "Riya")) +customers.put((4, "Stacy")) + +while customers: + print(customers.get()) diff --git a/chapter9/rama.py b/chapter9/rama.py new file mode 100644 index 0000000..ba9abf2 --- /dev/null +++ b/chapter9/rama.py @@ -0,0 +1,78 @@ +import logging +import math + +logging.basicConfig(level=logging.DEBUG) +logger = logging.getLogger(__name__) + + +### setup the graph + +graph = {} +graph["start"] = {} +graph["start"]["a"] = 6 +graph["start"]["b"] = 2 + +graph["a"] = {} +graph["a"]["fin"] = 1 + +graph["b"] = {} +graph["b"]["a"] = 3 +graph["b"]["fin"] = 5 + +graph["fin"] = {} + +### set up costs + +costs = {} +costs["a"] = 6 +costs["b"] = 2 +costs["fin"] = math.inf + +### setup parents + +parents = {} +parents["a"] = "start" +parents["b"] = "start" +parents["fin"] = None + +### our processed queue + +processed = set() + +### algorithm + + +def find_lowest_cost_node(costs): + lowest_cost = math.inf + lowest_cost_node = None + for node in costs: + cost = costs[node] + if cost < lowest_cost and node not in processed: + lowest_cost = cost + lowest_cost_node = node + return lowest_cost_node + + +node = find_lowest_cost_node(costs) # find lowest-cost node not already processed +while node is not None: + cost = costs[node] + neighbors = graph[node] + logger.debug(f"node: {node} cost: {cost} neighbor: {neighbors}") + for n in neighbors.keys(): + new_cost = cost + neighbors[n] + if costs[n] > new_cost: + costs[n] = new_cost + parents[n] = node + processed.add(node) + logger.debug(f"processed: {processed}") + node = find_lowest_cost_node(costs) + + +route = [] +next = "fin" +while next != "start": + route.append(next) + next = parents[next] +route.append("start") + +print(f"route: {list(reversed(route))}")