From 165af92f6b636ac57e8d826ea1b1e58bbd335d09 Mon Sep 17 00:00:00 2001 From: Francesc Verdugo Date: Mon, 30 Sep 2024 17:09:14 +0200 Subject: [PATCH] Minor in tsp --- notebooks/tsp.ipynb | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/notebooks/tsp.ipynb b/notebooks/tsp.ipynb index 9035578..2c43267 100644 --- a/notebooks/tsp.ipynb +++ b/notebooks/tsp.ipynb @@ -72,7 +72,7 @@ "## The traveling sales person (TSP) problem\n", "\n", "\n", - "In this notebook, we will study another algorithm that works with graphs, the [traveling sales person (TSP) problem](https://en.wikipedia.org/wiki/Travelling_salesman_problem). The classical formulation of this problem is as follows (quoted from Wikipedia) \"Given a list of cities and the distances between each pair of cities, what is the shortest possible route that visits each city exactly once?\" This problem has applications in combinatorial optimization, theoretical computer science, and operations research. It is very expensive problem to solve (NP-hard problem), which makes parallel computing often required to solve it.\n", + "In this notebook, we will study another algorithm that works with graphs, the [traveling sales person (TSP) problem](https://en.wikipedia.org/wiki/Travelling_salesman_problem). The classical formulation of this problem is as follows (quoted from Wikipedia) \"Given a list of cities and the distances between each pair of cities, what is the shortest possible route that visits each city exactly once?\" This problem has applications in combinatorial optimization, theoretical computer science, and operations research. It is a very expensive problem to solve (NP-hard problem), which makes parallel computing often required.\n", "\n", "
\n", "Note: There are two key variations of this problem. One in which the sales person returns to the initial city, and another in which the sales person does not return to the initial city. We will consider the second variant for simplicity.\n", @@ -265,7 +265,22 @@ "id": "f769627c", "metadata": {}, "source": [ - " This returns a vector of tuples that contains information about the connections to this city of the form (destination, distance). In this case, city 3 is connected to city 3 at distance 0 (itself), then with city 1 at distance 3, then with city 4 at distance 3, and finally with city 2 at distance 4. Note that the connections are sorted by their distance in ascending order (here is where the nearest city first heuristic is used). " + " This returns a vector of tuples that contains information about the connections to this city of the form (destination, distance). In this case, city 3 is connected to city 3 at distance 0 (itself), then with city 1 at distance 3, then with city 4 at distance 3, and finally with city 2 at distance 4. Note that the connections are sorted by their distance in ascending order (here is where the nearest city first heuristic is used). Remember the graph with the distance between cities:" + ] + }, + { + "attachments": { + "g27477.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "6758ba5d", + "metadata": {}, + "source": [ + "
\n", + "\n", + "
" ] }, {