Navigating the High Seas

Home

Blogs

sailing deck Navigating the High Seas: How Dijkstra's Algorithm Helped Optimize Sailing Routes

Written by

Carissa O'Connell

July 20, 2024

With the sailing Olympics approaching, and as a sailor myself, enthusiasts around the world are gearing up for the excitement. To celebrate this prestigious event, I created a playful calculator that uses Dijkstra's algorithm to find the shortest distance between each location. The purpose of the program was simplified by removing the factors for wind and ocean current to show how Dijkstra's algorithm could be used. This project not only demonstrates the power of Dijkstra's algorithm but also provides a fun way to explore latitude and longitude locations.

The Challenge: Finding the Shortest Sailing Route

Imagine you're a sailor navigating through the open waters, trying to reach your destination as efficiently as possible. You have multiple stops to make along the way, and you want to minimize your travel distance to conserve fuel and to ensure you have enough supplies for the journey. This is where Dijkstra's algorithm comes in – a powerful tool for finding the shortest path between nodes in a graph.

How Dijkstra's Algorithm Works

Dijkstra's algorithm is a graph search algorithm that solves the single-source shortest path problem. It works by maintaining a priority queue of nodes, where the priority of each node is its minimum distance from the starting node. The algorithm repeatedly extracts the node with the minimum priority from the queue and updates the distances of its neighbors.

In the context of our sailing project, we represent each location as a node in a graph, and the distance between two nodes is calculated using the Haversine formula, which gives the distance between two points on a sphere (such as the Earth) based on their latitude and longitude coordinates.

Implementing Dijkstra's Algorithm in Python

To implement Dijkstra's algorithm in Python, we define a dijkstra function that takes a graph and a starting node as input. The function initializes a dictionary to store the distances from the starting node to all other nodes, with initial distances set to infinity. It then iterates through the nodes, updating the distances of each node's neighbors and keeping track of the shortest path.

def dijkstra(graph, start):
								distances = {node: float('infinity') for node in graph}
								distances[start] = 0
								unvisited_nodes = list(graph.keys())
								current_node = start
							
								while unvisited_nodes:
									for neighbor, distance in graph[current_node].items():
										if distance + distances[current_node] < distances[neighbor]:
											distances[neighbor] = distance + distances[current_node]
									unvisited_nodes.remove(current_node)
									if not unvisited_nodes:
										break
									current_node = min([(distances[node], node) for node in unvisited_nodes])[1]
							
								return distances
							

Putting it all Together

To use the dijkstra function in our sailing project, we create a graph for each leg of the journey, with nodes representing the current location and the next stop. We then call the dijkstra function to find the shortest distance between the nodes, and update the total distance traveled.

current_location = [float(x) for x in input("Enter your current location (latitude, longitude): ").split(',')]
									dest_location = [float(x) for x in input("Enter your desired destination (latitude, longitude): ").split(',')]
									num_stops = int(input("Enter the number of stops: "))
									stops = []
									for i in range(num_stops):
										stop = [float(x) for x in input(f"Enter stop {i+1} location (latitude, longitude): ").split(',')]
										stops.append(stop)
									
									total_distance = 0
									current_location = tuple(current_location)
									for i, stop in enumerate(stops + [dest_location]):
										graph = {}
										nodes = [current_location, tuple(stop)]
										for node in nodes:
											graph[node] = {}
											for neighbor in nodes:
												if node!= neighbor:
													graph[node][neighbor] = distance(node[0], node[1], neighbor[0], neighbor[1])
										print(f"Calculating shortest sailing route to stop {i+1}...")
										distance_to_stop = dijkstra(graph, current_location)[tuple(stop)]
										print(f"Shortest sailing distance: {distance_to_stop:.2f} kilometers")
										total_distance += distance_to_stop
										current_location = tuple(stop)
									
									print(f"Total shortest sailing distance: {total_distance:.2f} kilometers")
								

Check out the code for Dijkstra's Algorithm here

Conclusion

Dijkstra's algorithm has proven to be a powerful tool in optimizing sailing routes. By applying this algorithm to our sailing project, we can find the shortest distance between each location, reducing fuel consumption and minimizing our environmental impact. Whether you're a seasoned sailor or just starting out, this calculator is a fun way to explore the world of sailing and learn about the power of graph algorithms.

Image placeholder
Carissa O'Connell

Aloha! I am a passionate software developer looking to help people create programs that help improve efficiency, connect with nature, and play with logic.