Friday, 27 January 2023

Case Study: Shortest Paths

 


Case Study: Shortest Paths

The shortest path problem is a classic problem in computer science. It asks, given a graph G = (V, E) and a set of distances dij for each edge (i, j) in E, what is the shortest path between two given nodes in V. These two nodes are often referred to as s (for source) and d (for destination).

The shortest path problem is a classic problem in computer science that asks for the shortest path between two given nodes in a graph, given a set of distances for the edges in the graph. This problem is not a decision problem, as it does not involve determining whether a given instance has a certain property or not. Instead, it involves finding a solution (the shortest path between the two nodes) that satisfies a specific condition (minimizing the total distance).

However, we can make the shortest path problem into an equivalent decision problem by asking whether there exists a path between the two nodes with a total distance less than a given value k. This decision problem can be phrased as: "Given a graph G = (V, E), a set of distances dij for each edge (i, j) in E, and a value k, is there a path between two given nodes s and d in V with a total distance less than k?" This decision problem is a yes/no question, and it can be used to determine whether a given instance of the shortest path problem has a solution that satisfies the condition of having a total distance less than k.

     Is this a decision problem, or something else?

The decision version of the shortest path problem is in NP, because a "yes" instance of the problem can be verified in polynomial time by using a witness (the path itself). However, it is not known whether the problem can be solved in polynomial time, so it is not known whether the shortest path problem is in P. The decision version of the shortest path problem is not in co-NP, because it does not involve verifying "no" instances of the problem.

     If not, can we make it into an equivalent decision problem?

     Is the decision problem in P?

     Is it in NP?

     Is it in Co-NP?

To summarize, the shortest path problem is a problem that involves finding the shortest path between two given nodes in a graph, given a set of distances for the edges in the graph. The problem is not a decision problem, but we can make it into an equivalent decision problem by asking whether there exists a path between the two nodes with a total distance less than a given value k. The decision version of the shortest path problem is in NP, because a "yes" instance of the problem can be verified in polynomial time using a witness (the path itself), but it is not known whether the problem can be solved in polynomial time. The decision version of the shortest path problem is not in co-NP, because it does not involve verifying "no" instances of the problem.

Shortest path decision

The original shortest path problem doesn’t have a true or false answer. It requires the output of an actual path between two vertices of a graph.

     In its current form, shortest path can be called an optimisation problem or more generally, a function problem.

     We can modify it so that it become a decision problem, a bit like last week’s version of TSP

     Instead of asking for the shortest, we can ask if there is a path with total distance less than k for some value of k. This question has a yes/no answer.

We often do this with optimisation problems because it makes them much easier to classify

Optimization problems, like the shortest path problem, do not have a true or false answer and require the output of an actual solution that satisfies a specific condition (in this case, minimizing the total distance). By modifying the problem to ask whether there exists a path with a total distance less than a given value k, we can turn it into a decision problem, which has a yes/no answer. This can be useful because decision problems are easier to classify and can be more efficiently solved using algorithms and data structures designed for decision problems.

It is often the case that optimization problems can be transformed into decision problems by asking whether a solution exists that satisfies a certain condition. For example, in the case of the traveling salesman problem, we can ask whether there exists a tour with a total distance less than a given value k, rather than asking for the shortest possible tour. This transformation can make it easier to classify the problem and find efficient algorithms for solving it.

Shortest path problem classification

Is shortest path in P?

YES: run Dijkstra’s algorithm and if the shortest path is less than k, return true. Otherwise return false.

Is it in NP?

YES: given a path from s to d as a witness, we can easily check it’s a valid path and add up the edge distances to see if the total is less than k (alternatively we can just ignore the witness and use Dijkstra’s algorithm)

Is it in Co-NP? YES: simply ignore the witness and run Dijkstra’s algorithm

It is not known whether the shortest path problem is in P, which is the class of problems that can be solved in polynomial time. The shortest path problem involves finding the shortest path between two given nodes in a graph, given a set of distances for the edges in the graph. While the decision version of the shortest path problem, which asks whether there exists a path with a total distance less than a given value k, is in NP (nondeterministic polynomial time), it is not known whether the problem can be solved in polynomial time.

NP is the class of problems whose yes instances can be verified in polynomial time, given a suitable witness. In the case of the shortest path problem, a witness would be the path itself. However, finding a solution to the shortest path problem may require more time and computational resources than simply verifying a solution, so it is not known whether the problem is in P. It is possible that the shortest path problem is NP-hard, which means that it is at least as difficult to solve as the hardest problems in NP.

Dijkstra's algorithm is a graph search algorithm that solves the single-source shortest path problem for a graph with nonnegative edge weights, producing a shortest path tree. This algorithm is often used in routing and as a subroutine in other graph algorithms. It was conceived by computer scientist Edsger W. Dijkstra in 1956 and published three years later.

Here is an example implementation of Dijkstra's algorithm in Python, with line-by-line comments:

import math

 

# Helper function to find the index of the vertex with the minimum distance

def find_min_dist(distance, visited):

    min_distance = math.inf

    min_index = None

    for i, dist in enumerate(distance):

        if dist < min_distance and i not in visited:

            min_distance = dist

            min_index = i

    return min_index

 

# Function to perform Dijkstra's algorithm

def dijkstra(graph, source):

    # Number of vertices in the graph

    n = len(graph)

    # Initialize distances and visited lists

    distance = [math.inf] * n

    visited = []

    # Set the distance of the source vertex to 0

    distance[source] = 0

    # Iterate n - 1 times

    for _ in range(n - 1):

        # Find the vertex with the minimum distance

        min_index = find_min_dist(distance, visited)

        # Mark the vertex as visited

        visited.append(min_index)

        # Update the distances of the neighboring vertices

        for i, dist in enumerate(graph[min_index]):

            if dist != 0 and i not in visited:

                distance[i] = min(distance[i], distance[min_index] + dist)

    # Return the distance list

    return distance

 

# Test the function with a graph represented as an adjacency matrix

graph = [[0, 4, 0, 0, 0, 0, 0, 8, 0],

         [4, 0, 8, 0, 0, 0, 0, 11, 0],

         [0, 8, 0, 7, 0, 4, 0, 0, 2],

         [0, 0, 7, 0, 9, 14, 0, 0, 0],

         [0, 0, 0, 9, 0, 10, 0, 0, 0],

         [0, 0, 4, 14, 10, 0, 2, 0, 0],

         [0, 0, 0, 0, 0, 2, 0, 1, 6],

         [8, 11, 0, 0, 0, 0, 1, 0, 7],

         [0, 0, 2, 0, 0, 0, 6, 7, 0]]

 

# The source vertex is vertex 0

source = 0

# Get the distance list for the graph

distances = dijkstra(graph, source)

# Print the distance from the source vertex to each other vertex

print(distances)

This code will initialize a distance list with infinities and a visited list with no vertices. It will then set the distance of the source vertex to 0 and iterate n - 1 times, where n is the number of vertices in the graph. At each iteration, it will find the vertex with the minimum distance that has not yet been visited and mark it as visited. It will then update the distances of the neighbouring vertices by taking the minimum of the current distance and the distance through the current vertex. Finally, it will return the distance list.

General result

In fact, we can say with certainty that all problems in P are also in both NP and Co-NP. Since both yes and no instances can be solved (and therefore verified) efficiently.

However, we must ask an important question at this stage:

                Are there some problems which are in NP but not in P?

                IT’S WORTH A MILLION DOLLARS IF YOU CAN ANSWER IT

Yes, there are problems that are in NP but not known to be in P. These are known as NP-complete problems. NP-complete problems are a class of problems that are at least as hard as any problem in NP, and if any NP-complete problem can be solved in polynomial time, then all problems in NP can be solved in polynomial time. This means that if we can find a polynomial-time algorithm for any NP-complete problem, we can use it to solve all problems in NP in polynomial time as well. Some examples of NP-complete problems include the traveling salesman problem, the knapsack problem, and the Boolean satisfiability problem.

No comments:

Post a Comment