mirror of
https://github.com/fverdugo/XM_40017.git
synced 2026-11-15 06:17:17 +01:00
Polish notebooks ASP, LEQ
This commit is contained in:
1 parent
bf45227674
commit
e34d92008b
8 files changed
+20487
-28374
No files matched your search
+201
-30
@@ -25,6 +25,46 @@
|
||||
"- How to fix static load imbalance"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "480af594",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div class=\"alert alert-block alert-info\">\n",
|
||||
"<b>Note:</b> Do not forget to execute the cell below before starting this notebook! \n",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"id": "7e93809a",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"ge_dep_check (generic function with 1 method)"
|
||||
]
|
||||
},
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"using Printf\n",
|
||||
"function answer_checker(answer,solution)\n",
|
||||
" if answer == solution\n",
|
||||
" \"🥳 Well done! \"\n",
|
||||
" else\n",
|
||||
" \"It's not correct. Keep trying! 💪\"\n",
|
||||
" end |> println\n",
|
||||
"end\n",
|
||||
"ge_par_check(answer) = answer_checker(answer, \"a\")\n",
|
||||
"ge_dep_check(answer) = answer_checker(answer, \"b\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "8dcee319",
|
||||
@@ -33,7 +73,7 @@
|
||||
"## Gaussian elimination\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"System of linear algebraic equations\n",
|
||||
"[Gaussian elimination](https://en.wikipedia.org/wiki/Gaussian_elimination) is a method to solve systems of linear equations, e.g.\n",
|
||||
"\n",
|
||||
"$$\n",
|
||||
"\\left[\n",
|
||||
@@ -60,7 +100,7 @@
|
||||
"\\right]\n",
|
||||
"$$\n",
|
||||
"\n",
|
||||
"Elimination steps\n",
|
||||
"The steps of the Gaussian elimination will transform the system into an upper triangular matrix. The system of linear equations can now easily be solved by backward substitution. \n",
|
||||
"\n",
|
||||
"\n",
|
||||
"$$\n",
|
||||
@@ -112,15 +152,29 @@
|
||||
"id": "94c10106",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Serial implementation\n"
|
||||
"### Serial implementation\n",
|
||||
"The following algorithm computes the Gaussian elimination on a matrix which represents a system of linear equations.\n",
|
||||
"- The first inner loop in line 4 divides the current row by the value of the diagonal entry, thus transforming the diagonal to contain only ones. \n",
|
||||
"- The second inner loop beginning in line 8 substracts the rows from one another such that all entries below the diagonal become zero. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 1,
|
||||
"id": "e4070214",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"gaussian_elimination! (generic function with 1 method)"
|
||||
]
|
||||
},
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"function gaussian_elimination!(B)\n",
|
||||
" n,m = size(B)\n",
|
||||
@@ -140,12 +194,36 @@
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "3763b000",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div class=\"alert alert-block alert-info\">\n",
|
||||
"<b>Note:</b> This algorithm is not correct for all matrices: if any diagonal element <code>B[k,k]</code> is zero, the computation in the first inner loop fails. To get around this problem, another step can be added to the algorithm that swaps the rows until the diagonal entry of the current row is not zero. This process of finding a nonzero value is called <b>pivoting</b>. \n",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 2,
|
||||
"id": "eb30df0d",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"3×4 Matrix{Float64}:\n",
|
||||
" 1.0 3.0 1.0 9.0\n",
|
||||
" 0.0 1.0 2.0 8.0\n",
|
||||
" 0.0 0.0 1.0 4.0"
|
||||
]
|
||||
},
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"A = Float64[1 3 1; 1 2 -1; 3 11 5]\n",
|
||||
"b = Float64[9,1,35]\n",
|
||||
@@ -153,6 +231,14 @@
|
||||
"gaussian_elimination!(B)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "8d941741",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"The result is an upper triangular matrix which can be used to solve the system by backward substitution. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "39f2e8ef",
|
||||
@@ -185,6 +271,40 @@
|
||||
"```"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "e52c4b38",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div class=\"alert alert-block alert-success\">\n",
|
||||
"<b>Question:</b> Which of the loops can be parallelized?\n",
|
||||
"</div>\n",
|
||||
"\n",
|
||||
" a) the inner loops, but not the outer loop\n",
|
||||
" b) the outer loop, but not the inner loops\n",
|
||||
" c) all loops\n",
|
||||
" d) only the first inner loop"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"id": "078e974e",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"It's not correct. Keep trying! 💪\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"answer = \"x\" # replace x with a, b, c, or d \n",
|
||||
"ge_par_check(answer)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "14d57c52",
|
||||
@@ -193,6 +313,17 @@
|
||||
"### Two possible data partitions"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "c518f863",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"The outer loop of the algorithm is not parallelizable, since the iterations depend on the results of the previous iterations. However, we can extract parallelism from the inner loops. Let's have a look at two different parallelization schemes. \n",
|
||||
"\n",
|
||||
"1. **Block-wise partitioning**: Each processor gets a block of subsequent rows. \n",
|
||||
"2. **Cyclic partitioning**: The rows are cyclicly distributed among the processors. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"g23933.png": {
|
||||
@@ -213,8 +344,9 @@
|
||||
"id": "a67e0aad",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Which is the work per process at iteration k ?\n",
|
||||
"\n"
|
||||
"## What is the work per process at iteration k?\n",
|
||||
"To evaluate the efficiency of both partitioning schemes, consider how much work the processors do in the following example. \n",
|
||||
"In any iteration k, which part of the matrix is updated in the inner loops? "
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -237,12 +369,7 @@
|
||||
"id": "d083cd53",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div>\n",
|
||||
" <br>\n",
|
||||
" <br>\n",
|
||||
" <br>\n",
|
||||
" <br>\n",
|
||||
"</div>"
|
||||
"It is clear from the code that at a given iteration `k`, the matrix is updated from row `k` to `n` and from column `k` to `m`. If we look at how that reflects the distribution of work over the processes, we can see that CPU 1 does not have any work, whereas CPU 2 does a little work and CPU 3 and 4 do a lot of work. Thus, the work load is _imbalanced_ across the different processes. "
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -269,7 +396,37 @@
|
||||
"\n",
|
||||
"- CPUs with rows <k are idle during iteration k\n",
|
||||
"- Bad load balance means bad speedups, as some CPUs are waiting instead of doing useful work\n",
|
||||
"- Solution: cyclic partition "
|
||||
"- Solution: cyclic partition \n",
|
||||
" \n",
|
||||
"### Data dependencies\n",
|
||||
" \n",
|
||||
"<div class=\"alert alert-block alert-success\">\n",
|
||||
"<b>Question:</b> What are the data dependencies of this partitioning?\n",
|
||||
"</div>\n",
|
||||
"\n",
|
||||
" a) CPUs with rows >k need all rows <=k\n",
|
||||
" b) CPUs with rows >k need part of row k\n",
|
||||
" c) All CPUs need row k \n",
|
||||
" d) CPUs with row k needs all rows >k \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"id": "e0565e92",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"It's not correct. Keep trying! 💪\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"answer = \"x\" # replace x with a, b, c, or d \n",
|
||||
"ge_dep_check(answer)"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -279,11 +436,7 @@
|
||||
"source": [
|
||||
"### Cyclic partition\n",
|
||||
"\n",
|
||||
"- Less load imbalance\n",
|
||||
"- Same data dependencies as 1d block partition\n",
|
||||
"- Useful for some problems with predictable load imbalance\n",
|
||||
"- A form of static load balancing\n",
|
||||
"- Not suitable for all communication patterns (e.g. Jacobi)"
|
||||
"In contrast, if we look at how the work is balanced for the same example and cyclic partitioning, we find that the processes have similar work load. "
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -301,25 +454,43 @@
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "866824c6",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Conclusion\n",
|
||||
"Cyclic partitioning tends to work well in problems with predictable load imbalance. It is a form of **static load balancing** which means using a pre-defined load schedule based on prior information about the algorithm (as opposed to **dynamic load balancing** which can schedule loads more flexibly during runtime). The data dependencies are the same as for the 1d block partitioning.\n",
|
||||
"\n",
|
||||
"At the same time, cyclic partitioning is not suitable for all communication patterns. For example, it can lead to a large communication overhead in the parallel Jacobi method, since the computation of each value depends on its neighbouring elements."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "20982b04",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Exercise\n",
|
||||
"\n",
|
||||
"- The actual parallel implementation is let as an exercise\n",
|
||||
"- Implement both 1d block and 1d cyclic partitions and compare performance\n",
|
||||
"- Closely related with Floyd's algorithm\n",
|
||||
"- Generate input matrix with function below (a random matrix is not enough, we need a non singular matrix that does not require pivoting)"
|
||||
"The actual implementation of the parallel algorithm is left as an exercise. Implement both 1d block and 1d cyclic partitioning and compare their performance. The implementation is closely related to that of Floyd's algorithm. To test your algorithms, generate input matrices with the function below (a random matrix is not enough, we need a non singular matrix that does not require pivoting). "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 5,
|
||||
"id": "a65cf8e6",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"tridiagonal_matrix (generic function with 1 method)"
|
||||
]
|
||||
},
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"function tridiagonal_matrix(n)\n",
|
||||
" C = zeros(n,n)\n",
|
||||
@@ -352,7 +523,7 @@
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Julia 1.9.0",
|
||||
"display_name": "Julia 1.9.1",
|
||||
"language": "julia",
|
||||
"name": "julia-1.9"
|
||||
},
|
||||
@@ -360,7 +531,7 @@
|
||||
"file_extension": ".jl",
|
||||
"mimetype": "application/julia",
|
||||
"name": "julia",
|
||||
"version": "1.9.0"
|
||||
"version": "1.9.1"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
+332
-39
@@ -26,6 +26,47 @@
|
||||
"- How communication can affect the correctness of a distributed algorithm\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "394d4b7a",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div class=\"alert alert-block alert-info\">\n",
|
||||
"<b>Note:</b> Do not forget to run the next cell before starting studying this notebook. \n",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 18,
|
||||
"id": "1dc78750",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"floyd_impl_check (generic function with 1 method)"
|
||||
]
|
||||
},
|
||||
"execution_count": 18,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"using Printf\n",
|
||||
"\n",
|
||||
"function answer_checker(answer,solution)\n",
|
||||
" if answer == solution\n",
|
||||
" \"🥳 Well done! \"\n",
|
||||
" else\n",
|
||||
" \"It's not correct. Keep trying! 💪\"\n",
|
||||
" end |> println\n",
|
||||
"end\n",
|
||||
"floyd_check(answer) = answer_checker(answer,\"c\")\n",
|
||||
"floyd_impl_check(answer) = answer_checker(answer, \"d\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "ade31d26",
|
||||
@@ -70,10 +111,21 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 8,
|
||||
"id": "4fe447c5",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"floyd! (generic function with 1 method)"
|
||||
]
|
||||
},
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"function floyd!(C)\n",
|
||||
" n = size(C,1)\n",
|
||||
@@ -99,10 +151,25 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 9,
|
||||
"id": "860e537c",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"4×4 Matrix{Int64}:\n",
|
||||
" 0 9 6 1\n",
|
||||
" 2 0 8 3\n",
|
||||
" 5 3 0 6\n",
|
||||
" 10 8 5 0"
|
||||
]
|
||||
},
|
||||
"execution_count": 9,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"inf = 1000\n",
|
||||
"C = [\n",
|
||||
@@ -229,17 +296,28 @@
|
||||
"source": [
|
||||
"### Serial performance\n",
|
||||
"\n",
|
||||
"This algorithm is memory bound, meaning that the main cost is in getting and setting data from the input matrix `C`. In this situations, the order in which we traverse the entries of matrix `C` has a significant performance impact.\n",
|
||||
"This algorithm is memory bound, meaning that the main cost is in getting and setting data from the input matrix `C`. In this situation, the order in which we traverse the entries of matrix `C` has a significant performance impact.\n",
|
||||
"\n",
|
||||
"The following function computes the same result as for the previous function `floyd!`, but the nesting of loops over i and j is changed.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 10,
|
||||
"id": "75cac17e",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"floyd2! (generic function with 1 method)"
|
||||
]
|
||||
},
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"function floyd2!(C)\n",
|
||||
" n = size(C,1)\n",
|
||||
@@ -265,10 +343,19 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 5,
|
||||
"id": "907bc8c9",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
" 3.927992 seconds\n",
|
||||
" 6.501955 seconds\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"n = 1000\n",
|
||||
"C = rand(n,n)\n",
|
||||
@@ -336,7 +423,7 @@
|
||||
"\n",
|
||||
"`C[i,j] = min(C[i,j],C[i,k]+C[k,j])`\n",
|
||||
"\n",
|
||||
"If each process updates a block of rows of matrix $C$, which data we need for this operation?\n"
|
||||
"If each process updates a block of rows of matrix $C$, which data do we need for this operation?\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -423,6 +510,40 @@
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "2cf55de3",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div class=\"alert alert-block alert-success\">\n",
|
||||
"<b>Question:</b> How much data is communicated in each iteration in this parallel algorithm?\n",
|
||||
"</div>\n",
|
||||
"\n",
|
||||
" a) O(N²/P)\n",
|
||||
" b) O(N)\n",
|
||||
" c) O(NP)\n",
|
||||
" d) O(P)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 17,
|
||||
"id": "1bf4de56",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"It's not correct. Keep trying! 💪\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"answer = \"x\" # replace x with a, b, c or d\n",
|
||||
"floyd_check(answer)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "eba45ea4",
|
||||
@@ -433,40 +554,68 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "e96eda2d",
|
||||
"id": "a15bc34e",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"- Each process updates $N^2/P$ entries per iteration\n",
|
||||
"- 1 process broadcasts a message of length $N$ to $P-1$ processes per iteration\n",
|
||||
"- The send cost in this process is $O(N P)$ per iteration (if we use send/receive instead of broadcast)\n",
|
||||
"- $P-1$ processes receive one message of length $N$ per iteration\n",
|
||||
"- The receive cost is $O(N)$ per iteration at each process\n",
|
||||
"- The send/computation ratio is $O(P^2/N)$\n",
|
||||
"- The receive/computation ratio is $O(P/N)$\n",
|
||||
"- The algorithm is potentially scalable if $P<<N$"
|
||||
"**Computation cost:** Each process updates $N^2/P$ entries per iteration. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"g20431.png": {
|
||||
"image/png": "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 truncated
|
||||
"fig-asp-efficiency-comp.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "96b3a09f",
|
||||
"id": "cc2668c8",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div>\n",
|
||||
"<img src=\"attachment:g20431.png\" align=\"left\" width=\"225\"/>\n",
|
||||
" <img src=\"attachment:fig-asp-efficiency-comp.png\" align=\"left\" width=\"225\"/>\n",
|
||||
" </div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "d89d2b45",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"**Communication cost:** \n",
|
||||
"- Each process broadcasts a message of length $N$ to $P-1$ processes per iteration. Thus, the **send cost** per process is $O(N P)$ per iteration (if we use send/receive instead of broadcast).\n",
|
||||
"- $P-1$ processes receive one message of length $N$ per iteration. Hence, the **receive cost** is $O(N)$ per iteration at each process. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"fig-asp-efficiency-comm-2.png": {
|
||||
"image/png": "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p08fpkyZwsUXX0y7djFzq1atqqqKp556ittuu42PPvoo3rDdwK+AG909bsdeSQwlUCIiIiKSVGZ2EFBI2K7XNdaYgw8+mKuuuooJEyaQm5ub1PjSUWVlJUuXLuXOO+9kw4a4OdJWoBi4zd3jduyV5lECJSIiIiJJYWbtgcuAW4CYjZo6derEZZddxqRJk+jcuXMyw8sI27dvZ/HixSxYsIAtW+LmSJ8DdwL3uHvcjr3SNEqgRERERKRFmVkW8F1CL6cjY43p0KEDl156KZMnT6Z79+5JjS8Tbd68meLiYu6//3527oybI60lNB5+wN33JC+61k0JlIiIiIi0CAvVHsYSvokfGGtMTk4OBQUFTJ06lV69Yi5KSR3Wr19PcXExDz/8MLt374437B1CP61H3L0qedG1TkqgRERERCThzOwcworTybE+z8rKYvTo0UyfPp3+/fsnNbbWaO3atSxYsIAlS5awd+/eeMPeBG5192VJDK3VUQIlIiIiIgljZqcRVjtGxhszYsQIbrrpJo499tikxdVWvPPOO9x1112UlJTUNWwFMMPd/5KksFoVJVAiIiIi0mxmdhxwE3BRvDFDhgxh+vTpDB06NHmBtVGrVq1izpw5vPDCC3UNexYocvdXkxRWq6AESkRERESazMz6E8qRTwCyYo0ZNGgQU6ZMIT8/P4mRCUBpaSmzZs3ijTfeiDfEgceAme7+bvIiy1xKoERERESk0cysL3AjcDkQs8PtgAEDuP766xkzZgyhnoSkgrvz5JNPMnfuXN5///14wyqBxcAt7r4uedFlHiVQIiIiItJgZnYIcD0wCegQa0yfPn2YMmUKF198Me3axcytJAWqqqp46qmnmDVrFh9//HG8YbuBXwE3unvcjr1tmRIoEREREamXmR0EFBK263WNNebggw/mqquuYsKECeTm5iY1Pmm4yspKli5dyp133smGDXFzpK1AMXCbu8ft2NsWKYESERERkbjMrD1wGXALELNRU6dOnbjsssuYNGkSnTt3TmZ40gzbt29n8eLFLFiwgC1b4uZInwN3Ave4e9yOvW2JEigREREROYCZZQHfJfRyOjLWmA4dOnDppZcyefJkunfvntT4JHE2b95McXEx999/Pzt3xs2R1hIaIj/g7nuSF136UQIlIiIiIvtYqPYwlvDN8sBYY3JycigoKGDq1Kn06hVzUUoy0Pr16ykuLuahhx6isrIy3rC3CeXqH/M2mkgogRIRERERAMzsHMKK08mxPs/KymL06NFMnz6d/v37JzU2SZ61a9eyYMEClixZwt69e+MNexO41d2XJTG0tKAESkRERKSNM7PTgFnAWfHGjBgxghtvvJHjjjsueYFJSr3zzjvcddddlJSULine truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "e96eda2d",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div>\n",
|
||||
"<img src=\"attachment:fig-asp-efficiency-comm-2.png\" align=\"left\" width=\"300\"/>\n",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "6993b9d0",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"In summary, the send/computation ratio is $O(P^2/N)$ and the receive/computation ratio is $O(P/N)$. Therefore, algorithm is potentially scalable if $P<<N$."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "494aa965",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Parallel Implementation\n"
|
||||
"## Parallel Implementation\n",
|
||||
"\n",
|
||||
"Now, we will explore the parallel implementation of Floyd's algorithm using MPIClusterManagers."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -489,10 +638,21 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 2,
|
||||
"id": "6bc0122b",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"MPI.ThreadLevel(2)"
|
||||
]
|
||||
},
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"using MPIClusterManagers\n",
|
||||
"using Distributed\n",
|
||||
@@ -511,15 +671,26 @@
|
||||
"source": [
|
||||
"### Code\n",
|
||||
"\n",
|
||||
"We split the code in two functions. The first function is called on the main process (the process running this notebook). It splits the input matrix into blocks of rows. Then, we call `floyd_worker!` (see below) remotely on each worker using the corresponding block of rows.\n"
|
||||
"We split the code into two functions. The first function is called on the main process (the process running this notebook). It splits the input matrix into blocks of rows. Then, we call `floyd_worker!` (see below) to remotely compute Floyd's algorithm in each worker with its corresponding block of rows.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 4,
|
||||
"id": "22234b2f",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"floyd_dist! (generic function with 1 method)"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"function floyd_dist!(C)\n",
|
||||
" m = size(C,1)\n",
|
||||
@@ -539,12 +710,12 @@
|
||||
"id": "9fc3be11",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"The second function is the one run on the workers. Note that we considered MPI for communication in this case."
|
||||
"The second function is the one that runs on the workers. Note that we use MPI for communication in this case."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 5,
|
||||
"id": "d5a8d3a8",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
@@ -557,6 +728,7 @@
|
||||
" C_k = similar(Cw,n)\n",
|
||||
" for k in 1:n\n",
|
||||
" if k in rows_w\n",
|
||||
" # Send row k to other workers if I have it\n",
|
||||
" myk = (k-first(rows_w))+1\n",
|
||||
" C_k .= view(Cw,myk,:)\n",
|
||||
" for proc in 0:(nranks-1)\n",
|
||||
@@ -566,6 +738,7 @@
|
||||
" MPI.Send(C_k,comm;dest=proc,tag=0)\n",
|
||||
" end\n",
|
||||
" else\n",
|
||||
" # Wait until row k is received\n",
|
||||
" MPI.Recv!(C_k,comm,source=MPI.ANY_SOURCE,tag=0)\n",
|
||||
" end\n",
|
||||
" for j in 1:n\n",
|
||||
@@ -578,6 +751,46 @@
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "bc81a83d",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div class=\"alert alert-block alert-success\">\n",
|
||||
"<b>Question:</b> Which of the following statements is true?\n",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "4ec6718c",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
" a) The processes are synchronized in each iteration due to the blocking send and receive of row k.\n",
|
||||
" b) Receiving processes may overwrite the data in row k, which can lead to incorrect behavior.\n",
|
||||
" c) The sending process can only continue the computation after the data are received in every other process.\n",
|
||||
" d) The receiving process does not know the source of the received data."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 19,
|
||||
"id": "4f4a57de",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"It's not correct. Keep trying! 💪\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"answer = \"x\" # replace x with a, b, c or d\n",
|
||||
"floyd_impl_check(answer)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "c624722a",
|
||||
@@ -588,10 +801,21 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 20,
|
||||
"id": "09937668",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"rand_distance_table (generic function with 1 method)"
|
||||
]
|
||||
},
|
||||
"execution_count": 20,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"function rand_distance_table(n)\n",
|
||||
" threshold = 0.4\n",
|
||||
@@ -613,10 +837,37 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 21,
|
||||
"id": "dd77ee3d",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"\u001b[91m\u001b[1mTest Failed\u001b[22m\u001b[39m at \u001b[39m\u001b[1mIn[21]:7\u001b[22m\n",
|
||||
" Expression: C_seq == C_par\n",
|
||||
" Evaluated: [0 6 … 3 5; 6 0 … 8 9; … ; 7 8 … 0 6; 3 9 … 5 0] == [0 6 … 3 5; 6 0 … 8 9; … ; 7 8 … 0 6; 3 9 … 5 0]\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ename": "LoadError",
|
||||
"evalue": "\u001b[91mThere was an error during testing\u001b[39m",
|
||||
"output_type": "error",
|
||||
"traceback": [
|
||||
"\u001b[91mThere was an error during testing\u001b[39m",
|
||||
"",
|
||||
"Stacktrace:",
|
||||
" [1] record(ts::Test.FallbackTestSet, t::Union{Test.Error, Test.Fail})",
|
||||
" @ Test C:\\Users\\gelie\\AppData\\Local\\Programs\\julia-1.9.1\\share\\julia\\stdlib\\v1.9\\Test\\src\\Test.jl:960",
|
||||
" [2] do_test(result::Test.ExecutionResult, orig_expr::Any)",
|
||||
" @ Test C:\\Users\\gelie\\AppData\\Local\\Programs\\julia-1.9.1\\share\\julia\\stdlib\\v1.9\\Test\\src\\Test.jl:670",
|
||||
" [3] top-level scope",
|
||||
" @ C:\\Users\\gelie\\AppData\\Local\\Programs\\julia-1.9.1\\share\\julia\\stdlib\\v1.9\\Test\\src\\Test.jl:478"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"using Test\n",
|
||||
"load = 10\n",
|
||||
@@ -667,7 +918,7 @@
|
||||
"id": "df60e4e7",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"However, FIFO ordering is not enough. In the next figure communication between process 1 and process 3 is particularly slow. Note that process 3 receives messages from process 1 after the messages received from 2 even though FIFO order is satisfied between any two processors."
|
||||
"However, FIFO ordering is not enough. In the next figure, communication between process 1 and process 3 is particularly slow. Note that process 3 receives messages from process 1 after it receives the messages from 2 even though FIFO ordering is satisfied between any two processors."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -692,12 +943,54 @@
|
||||
"source": [
|
||||
"### Possible solutions\n",
|
||||
"\n",
|
||||
"- Use synchronous send MPI_SSEND (less efficient). Note that the blocking send MPI_SEND used above does not guarantee that the message was received.\n",
|
||||
"- Use synchronous send MPI_SSEND (less efficient). Note that the blocking send MPI_SEND used above does not guarantee that the message was received. \n",
|
||||
"- Barrier at the end of each iteration over $k$ (simple solution, but synchronization overhead)\n",
|
||||
"- Order incoming messages (buffering and extra user code needed)\n",
|
||||
"- Use a specific rank id instead of `MPI.ANY_SOURCE` or use `MPI.Bcast!` (one needs to know which are the rows owned by the other ranks)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "aab3fbfb",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Exercise 1\n",
|
||||
"Rewrite the function `floyd_worker!()` such that it runs correctly using `MPI.Bcast!`. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "aab1900f",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@everywhere function floyd_worker!(Cw,rows_w)\n",
|
||||
" comm = MPI.Comm_dup(MPI.COMM_WORLD)\n",
|
||||
" rank = MPI.Comm_rank(comm)\n",
|
||||
" nranks = MPI.Comm_size(comm)\n",
|
||||
" m,n = size(Cw)\n",
|
||||
" C_k = similar(Cw,n)\n",
|
||||
" # TODO: calculate order of source processor ranks\n",
|
||||
" for k in 1:n\n",
|
||||
" root_id = # TODO: calculate the rank of processor that owns k\n",
|
||||
" if k in rows_w\n",
|
||||
" myk = (k-first(rows_w))+1\n",
|
||||
" C_k .= view(Cw,myk,:)\n",
|
||||
" end\n",
|
||||
" MPI.Bcast!(C_k, root=root_id, comm)\n",
|
||||
" # TODO: enqueue C_k in list or array\n",
|
||||
" # TODO: dequeue next C_k from array/list\n",
|
||||
" for j in 1:n\n",
|
||||
" for i in 1:m\n",
|
||||
" @inbounds Cw[i,j] = min(Cw[i,j],Cw[i,k]+C_k[j])\n",
|
||||
" end\n",
|
||||
" end\n",
|
||||
" end\n",
|
||||
" Cw\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "c789dc7a",
|
||||
@@ -713,7 +1006,7 @@
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Julia 1.9.0",
|
||||
"display_name": "Julia 1.9.1",
|
||||
"language": "julia",
|
||||
"name": "julia-1.9"
|
||||
},
|
||||
@@ -721,7 +1014,7 @@
|
||||
"file_extension": ".jl",
|
||||
"mimetype": "application/julia",
|
||||
"name": "julia",
|
||||
"version": "1.9.0"
|
||||
"version": "1.9.1"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
+19497
-28155
File diff suppressed because it is too large.
Load diff
|
Before Width: | Height: | Size: 6.2 MiB After Width: | Height: | Size: 6.4 MiB |
@@ -39,7 +39,7 @@
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div class=\"alert alert-block alert-info\">\n",
|
||||
"<b>Note:</b> Do not forget to run the next cell before starting studying this notebook. \n",
|
||||
"<b>Note:</b> Do not forget to run the next cell before you start studying this notebook. \n",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
@@ -977,7 +977,7 @@
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Julia 1.9.0",
|
||||
"display_name": "Julia 1.9.1",
|
||||
"language": "julia",
|
||||
"name": "julia-1.9"
|
||||
},
|
||||
@@ -985,7 +985,7 @@
|
||||
"file_extension": ".jl",
|
||||
"mimetype": "application/julia",
|
||||
"name": "julia",
|
||||
"version": "1.9.0"
|
||||
"version": "1.9.1"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -1175,7 +1175,7 @@
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Julia 1.9.0",
|
||||
"display_name": "Julia 1.9.1",
|
||||
"language": "julia",
|
||||
"name": "julia-1.9"
|
||||
},
|
||||
@@ -1183,7 +1183,7 @@
|
||||
"file_extension": ".jl",
|
||||
"mimetype": "application/julia",
|
||||
"name": "julia",
|
||||
"version": "1.9.0"
|
||||
"version": "1.9.1"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -1322,7 +1322,7 @@
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Julia 1.9.0",
|
||||
"display_name": "Julia 1.9.1",
|
||||
"language": "julia",
|
||||
"name": "julia-1.9"
|
||||
},
|
||||
@@ -1330,7 +1330,7 @@
|
||||
"file_extension": ".jl",
|
||||
"mimetype": "application/julia",
|
||||
"name": "julia",
|
||||
"version": "1.9.0"
|
||||
"version": "1.9.1"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -823,7 +823,7 @@
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Julia 1.9.0",
|
||||
"display_name": "Julia 1.9.1",
|
||||
"language": "julia",
|
||||
"name": "julia-1.9"
|
||||
},
|
||||
@@ -831,7 +831,7 @@
|
||||
"file_extension": ".jl",
|
||||
"mimetype": "application/julia",
|
||||
"name": "julia",
|
||||
"version": "1.9.0"
|
||||
"version": "1.9.1"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
+448
-141
@@ -14,7 +14,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "1e74dfd9",
|
||||
"id": "5d49d8e7",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Contents\n",
|
||||
@@ -28,7 +28,47 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "bf3dd0e6",
|
||||
"id": "480af594",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div class=\"alert alert-block alert-info\">\n",
|
||||
"<b>Note:</b> Do not forget to execute the cell below before starting this notebook! \n",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"id": "7e93809a",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"tsp_check_2 (generic function with 1 method)"
|
||||
]
|
||||
},
|
||||
"execution_count": 13,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"using Printf\n",
|
||||
"function answer_checker(answer,solution)\n",
|
||||
" if answer == solution\n",
|
||||
" \"🥳 Well done! \"\n",
|
||||
" else\n",
|
||||
" \"It's not correct. Keep trying! 💪\"\n",
|
||||
" end |> println\n",
|
||||
"end\n",
|
||||
"tsp_check_1(answer) = answer_checker(answer, 16)\n",
|
||||
"tsp_check_2(answer) = answer_checker(answer, 2)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "e1d637cb",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## The traveling sales person (TSP) problem\n",
|
||||
@@ -36,22 +76,21 @@
|
||||
"\n",
|
||||
"### Problem statement\n",
|
||||
"\n",
|
||||
"- Given a graph $G$ with a distance table $C$ and an initial node (i.e. a city) in the graph\n",
|
||||
"- Compute the shortest route that visits all cities exactly once, without returning to the initial city.\n"
|
||||
"Given a graph $G$ with a distance table $C$ and an initial node (i.e. a city) in the graph, compute the shortest route that visits all cities exactly once, without returning to the initial city."
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"g22650.png": {
|
||||
"image/png": "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 truncated
|
||||
"fig-tsp-intro.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "dad0547d",
|
||||
"id": "bf3dd0e6",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div>\n",
|
||||
"<img src=\"attachment:g22650.png\" align=\"left\" width=\"450\"/>\n",
|
||||
"<img src=\"attachment:fig-tsp-intro.png\" align=\"left\" width=\"450\"/>\n",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
@@ -60,12 +99,11 @@
|
||||
"id": "c303dddf",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Branch and bound algorithm\n",
|
||||
"### Sequential algorithm (branch and bound)\n",
|
||||
"\n",
|
||||
"- The root is the initial city\n",
|
||||
"- The children of a node are the neighbor cities not visited so-far\n",
|
||||
"- **We sort the children using the nearest city first heuristic**\n",
|
||||
"- A node will be a leaf of the tree when all neighbor cities are already visited\n"
|
||||
"The sequential algorithm finds a shortest path by traversing the paths tree of the problem. The root of this tree is the initial city. The children of each node in the graph are the neighbour cities that have not been visited on the path so far. When all neighbour cities are already visited, the city becomes a leaf node in the tree.\n",
|
||||
"\n",
|
||||
"The possile solutions of the problem are the paths from the root of the tree to a leaf node. Note that we assume the children are sorted using the **nearest city first heuristic**. This allows to quickly find a minimum bound for the distance which will be used to prune the remaining paths (see next section). "
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -88,62 +126,98 @@
|
||||
"id": "9da5f5ae",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"- Number of possible paths might be up to O(N!)\n",
|
||||
"- Visiting all paths is impractical (even in parallel)"
|
||||
"Of course, visiting all paths in the tree is impractical for moderate and large numbers of cities. The number of possible paths might be up to $O(N!)$. Therefore, an essential part of the algorithm is to bound the search by remembering the current minimum distance. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "8a40faff",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Pruning the search tree\n",
|
||||
"\n",
|
||||
"The algorithm keeps track of the best solution of all paths visited so far. This allows to skip searching paths that already exceed this value. \n",
|
||||
"\n",
|
||||
"For example, in the following graph only 3 out of 6 possible routes need to be visted when we cut off the search after the minimum distance is exceeded. (The grey nodes are the ones we don't visit because the minimum distance had been exceeded at the previous node already.)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"fig-tsp-pruning.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "ecf89636",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Pruning the search tree\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "239b7362",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"- Only 3 out of 6 routes need to be visited"
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"g23181.png": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAx8AAAHMCAYAAAC0kRUNAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAewgAAHsIBbtB1PgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7N13eJvV9cDx75UdyyRhE0ZKSByHsEqhQNmbsH6Flrbslk0ZhTJCElt2KAJiS07SFMIMUGahNIxSkrZAgQBll1JKG1ZiO+xRSBgZlm3p/v44ViK/1rb0ap3P8/hp9epa77GJpfe8955zDUoppdTgbQHsA2wLjO/7WhdYB1gbCAMrgC+BpcDbwFvAQuDvwOfuh6yUUkoppZQqBR7gIOAmYDFgB/EVBl4DZgDfdfOHUEoppZRSShWvTYFpwHsMLuFI9vUf4GJguEs/k1JKKaWUUqqIjAauA1aRv6TD+fU58CtgPRd+PqWUUi4whQ5AKaVUUasFpgCNwFopxkaARcCbwDvAR8By4Ou+59dHZjO2ALYCtkGSmlT+BzQAtyNJiVJKKaWUUqrM7IMkEclmJ5YBNwNHAxtlcY7RwGnAfaSeVXkWGJf1T6OUUkoppZQqOh6gGeghcSLwNHAMMjOSK+sBZwNvJDnvV8DxOTynUkoppZRSqkDWBv5K4ov/vwF75zkGD/ATpPA8URyz+8YppZRSSimlStAGwAvEv9j/CDjZ5XiqgQuR2Y54Mf2R3M68KKWUUkoppVywGbLxX7yL/HuRzQILZTSJk6LH0QREKaWUUkqpkrEe8G8GXtiHgHMKGFesIcCvSTwDUlW40JRSSimllFLp8ALPMPCC/hvgkALGlch5yI7oznhvKmRQSimllFJKqdSuZeCF/JfAroUMKoXjgV4Gxv3zQgallFJKKaWUSuxo4i+1mlDIoNJ0FgNjXwXsWMiglFJKKaWUUgNthsxwxF68R5CEpFRcycAE5D9IfYhSSqkiZAodgFJKqYK4GzjRcew3wMQcvHYVsBWwMzDS8dwzSOeqXPAAjwAHO45PBmbm6BxKKaWUUkqpQTiAgTMGrwA1Wb7eSOBIwA/MA5bGef3oV9Mg4o5nU+Azxzm+Ab6V4/MopZRSSimlsvAc/S/Ww2RXYD4U+JrEiYYbyQfAqXHOc10ezqOUUmqQqgsdgFJKVSp/p3+9Wlu7D7A/hjGNdY0/ceG0BwF7Oo5dB7ycxWt5gLUHHdHg3QGcAewdc+x0oAXZmV0ppVSR0JoPpZRyiX+hf7i31rs7MAHD3shsw+ri6IgnMrJ5TPPHeQ7jcSQBiVoB1AH/y+K1hiNLnOJZDrxG/4QAoBlozeJcqewFPOs4Ngu4JA/nUkoplSWd+VBKqTzxL/QPr6mt2ddjPAdZ7AHADshsQVwmYvYC7s9jSHXAgY5jN5Fd4hFrObJD+j9jvt5CumdFBvna6XoOWIDUs0SdiizzCrkUg1JKqRQ0+VBKqRyZa+dWtbe370gVE7BMAPYBvBab1vcbzD7kN/k4hf4z3mGkw1W2VgHbAW/3vZaT27PrM+iffGwAHA485HIcSimlEtDkQymlsmStNW2dbd+J2MhBBjOhvbN9HzwMTzPXiHkhPsTwlDV2QV4CXeNnjsdPAu8P4vXCwBuD+P5cewyp8Yht7/szNPlQSqmiocmHUkploO29tpGR3shewIRgR/D7GL5lTMY3+D8B/m6Mec6G7bON9Y2vGmMyTVkyNQ6odxy7M8/ndFsYuAeYFHNsAvJZ11uQiJRSSvWjyYdSSiUxY/GMjXureg8w1hwETIj0RupWP5l+zvEx8KTFLjAR87RvnG9x7JM+fLkKN5mDHI/DwJ/dOLHL5tE/+VgX2InsunkppZTKMU0+lFIqhv8j/1DvKu+ewAQ8TOi1vd/F4km3bqPPCuAFDI8T5nGXZjZS2d/x+DVgWQHiyLcXgZXIHiRRB6LJh1JKFQVNPpRSFW3OK3OGLFt/2W4WOwHDQXSxG6av/W366UIIeMFgnoh4Ik90d3b/w3+Af/UyH5dmNlL5juPxU4UIwgXdwPPIcqso58+ulFKqQDT5UEpVnMC7gbFEpCPVMpYdbLHrZfEyHcieGY+HwqFH/Vv6v85xmLlUxcB6j/8WIhCXLKR/8rFVoQJRSinVnyYfSqmyN+OTGcN6V/TuQd9SKsLsHH0ug+VUq5MNW2OfbNq86Ys8hJovYwCv49jbBYjDLW85Ho9HKnQKvfRNKaUqniYfSqmyFFwU3M5W2yOwTOhd2bsvhhogk8vPz4CnMTwOPOar8y3JS6Du2CzOsU7Xo3BPh+PxcJLvxq6UUsolmnwopcrCjMUzNu719O6HLLc5wmJHZnifuxiLxHNl7TjHvnQ9CvfEWwK3Npp8KKVUwWnyoZQqSf6F/pohtUP2qTJVh1nsob30bp/hS4Qt9p8G86ix5rGu97peLMIi8VwZ7njcC3QVIhCXJEo+lFJKFZgmH0qpktHS0bJJFVWHWuwRwCHAuhm2wP0UeAbD4xETmdc8pvnjvARafGocj3sKEoV7uuMcc9a8KKWUKgBNPpRSRWuunVvV3t6+I4Yj8XAElp0sNpPtxFcBz5XpUqpMLHc8rkU6YIULEIsb4s1y6JIrpZQqApp8KKWKSkztxpEdnR1H4kHa4KafMnQAjxvM/C7T9Td/nX/18qIyW0qVCeeFtwGGEX95UjmIl3yU68+qlFIlRZMPpVRB+Rf4q2tG1+xhjDncWHN4L707IBfH6bbB/QLDYxb7qDX2sQpaSpWJr+Ic25TyvSDfxPE4gs58KKVUUdDkQynluumd0zftjfQebow53GBkkz+bdrJhMbxqrf0rHv4ybvS4l481x5br8qFcaY9zbDzwjtuBuMS5qeD7xK8DUUop5TJNPpRSrojZd+PIsA3vYYzxQNoJx3LgKQzzwtXhP08dNfXDvAZbfr5Eiu1jZwS2BuYXJpy8G+94XM4bKiqlVEnR5EMplRf+Tn+tN+LdG8ORwI8sdlSG+250APOxzNtg2QZPn73L2eXeoSnf3qZ/8rFboQJxgfNnc+54rpRSqkA0+VBK5UzrotYRnirP4RZ7BJbDMBntrbACWIBhXjgc/uvUcVPfz1ecFep5YN+YxwcAHqQeopx8i4EzH88XIhCllFIDafKhlBqU2OVUwB4W68ng21fPboS6Qs/4t/Pruvz8eRJojHm8IbAj8GphwsmbQxyPLbCgEIEopZQaSJMPpVRGZr0/a63u7u4DI0SONMZ832I3z2A5VReWBQYzr9f2ztfZDVc9B4Tov9neCZRf8nGC4/F/gc8KEYhSSqmBNPlQSqUUu5wq1BM6DMPahrT3+vsc+CswLxQOPerf0l+u7V2L3Urkv8NRMcdORGZDyqVb2EjgQMex+wsRiFJKqfg0+VBKxdW2pG2bSDhyFIYfAbtksrO4wbwWITK/iqp5q+pWveI3/nKrKyhVz9E/+RgJ/BB4sDDh5NzZyM7tURa4u0CxKKWUikOTD6XUasFFwe2sxx4DHBOJRLZNf3KDLuBZY8z83nDvg7qcqqh4gO8DFwAT4jzfRHkkH+sAv3QcM8hsz3XATcAqt4NSSinVX/qXFkqpsjPXzq3q6OjYwxp7DJafYPhWBt+uy6mKmxc4DllWtU2Ksd8H/pLleY4HWpI8P9bxeCmy70g8HwD7ZRnHVODKJM9/BtwAXAN8keU5lFJKDZImH0pVmFnvz1qru6d7gsUegSzB2Tjtb7a8AcwzmPldY7ue1+VURWkEcB7wi77/n47FwPbIDFamzgLmZPF98XQyMFlJxyjgDWB4GmOXA7cCV/WdTymllIt02ZVSFWDm2zM36qnu+QGGo0I9oYOB2jS/tQd4GssfwzY8T5dTFbV6ZGnVmcDQJOO6gUXAdjHHxgGTST5zUMyuZmDisQIYFmfscOT3dD4y29MKvJDX6JRSSq2mMx9Klalge3AL67GH9e2/cSgwJM1vXQU8gWFedbj6ocnjJmub0uK2M3Ah0rmqKsm4r4A7gOnA18Cb0G+ZXQ+y5CnTC/FCz3ycCtzmOPYsspTsNGAisEWK13gOSWAepHw6fymlVFHS5EOpMuLY8G9P0vwbt9ilBvNnYF5oVeiv/u38y/MaqBqsaBF5I/LfOZlO5ML6FmQ2IOp44PeOse8B30XqMkrBeOAVYO2YY71IQvZ63+Po76oZ2C3F6y0GrkWL05VSKm80+VCqxK3uUGU4Htgqg299D3jEYOavv3T9R87e5eyePIWocidaRN5E6v/WryJJxz3IBXk8DwNHOo49gVysh7IP0xWbIDMc4xzHpwGXJvievYEG5OdL9vmnxelKKZUnmnwoVYKyTjhiCsYbxjY8Z4xJf29yVUgbIwXk5wMbJhkXQeoYrgYeT+N110eSlDGO4w8BR1O8S5DWBp4CdnIcfwY4iMTJVtSWyO/yLJLXP4WAuUg3r7ezCVQppVR/mnwoVSKyTDgiGP5FhPnWY+9tqmt6K58xqpwbh+xd8XNgrSTjohfJAaSWIxN7IBfyNY7jv0fqKbozfL182wiYz8AlVJ8iychHGbzWJsC5yO94gyTjokldAHg+g9dXSinloMmHUkUsy4SjF3jJGHOfqTL3NWzRkMnFmCoOeyMdmX5M8iLyz4HfArPJ7KLb6XhkJ3CP4/jfkBmQYtnDZQyyt8zWjuPfAAci9R/ZGI4U7F+C1JEk80/k9303xTszpJRSRUuTD6WKTGBxYGcMx2A4hvQ7/3QZax4B7uuKdM3XDf9KUrQw2ofMRiTTgVwA3wyszNH5zwWuj3N8CVJn8nKOzpOtI4HbGThD0dP33KM5OEf0v0ETsHuKse1ITUgu/xsopVTZ0+RDqSIQM8NxAqnvvEZ1AY8bzH1d4a6HNOEoWcV01/0i4NcMnAHpQrpFzSZ1PUWurYMUkZ/PwM+slcCxwJ/zcN50Z5/+h2xaeDXwcR7iUEqpsqLJh1IFoglHxYsWkadbbxBE9qPItxORfTOcNSAA/0GSgGdciMMAJwAzLine truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "d8218eaf",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div>\n",
|
||||
"<img src=\"attachment:g23181.png\" align=\"left\" width=\"300\"/>\n",
|
||||
"<img src=\"attachment:fig-tsp-pruning.png\" align=\"left\" width=\"700\"/>\n",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "f3c78a1d",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Note that it is not necessary that the graph be fully connected. Variations of this algorithm work for sparse graphs or directed graphs as well. \n",
|
||||
"\n",
|
||||
"In the previous example, the shortest route was also the leftmost path in the graph. Although it is more likely that the shortest route be found in the left part of the graph when using the nearest city first heuristic, the solution can be anywhere in the search tree."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "d1df7878",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div class=\"alert alert-block alert-success\">\n",
|
||||
"<b>Question:</b> Look at the following graph and its corresponding search tree. Which is the minimum distance for x, such that the shortest path is in the <b>right part</b> of the search tree?\n",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"g23549.png": {
|
||||
"image/png": "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 truncated
|
||||
"fig-tsp-question-1.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "0fbe1ee0",
|
||||
"id": "cce356c0",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div>\n",
|
||||
"<img src=\"attachment:g23549.png\" align=\"left\" width=\"300\"/>\n",
|
||||
"<img src=\"attachment:fig-tsp-question-1.png\" align=\"left\" width=\"400\"/>\n",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 25,
|
||||
"id": "ce2f2c8a",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"It's not correct. Keep trying! 💪\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"answer = -1 # Replace this with any positive integer value\n",
|
||||
"tsp_check_1(answer)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "4fe017a4",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Serial implementation"
|
||||
"## Serial implementation\n",
|
||||
"\n",
|
||||
"Let's implement the serial algorithm. First, we sort the neighbours according to their distance. "
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -156,10 +230,21 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 2,
|
||||
"id": "a50706bc",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"sort_neighbors (generic function with 1 method)"
|
||||
]
|
||||
},
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"function sort_neighbors(C)\n",
|
||||
" n = size(C,1)\n",
|
||||
@@ -174,10 +259,25 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 3,
|
||||
"id": "2eeecdd6",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"4×4 Matrix{Int64}:\n",
|
||||
" 0 2 3 2\n",
|
||||
" 2 0 4 1\n",
|
||||
" 3 4 0 3\n",
|
||||
" 2 1 3 0"
|
||||
]
|
||||
},
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"C = [\n",
|
||||
" 0 2 3 2\n",
|
||||
@@ -187,80 +287,148 @@
|
||||
"]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "f769627c",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"The data structure we will use for the connections table is a matrix of tuples of the form (destination, distance). The tuples are sorted by their distance in ascending order (per start city). "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 4,
|
||||
"id": "6dd0288e",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"4-element Vector{Vector{Tuple{Int64, Int64}}}:\n",
|
||||
" [(1, 0), (2, 2), (4, 2), (3, 3)]\n",
|
||||
" [(2, 0), (4, 1), (1, 2), (3, 4)]\n",
|
||||
" [(3, 0), (1, 3), (4, 3), (2, 4)]\n",
|
||||
" [(4, 0), (2, 1), (1, 2), (3, 3)]"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"C_sorted = sort_neighbors(C)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "00608e1d",
|
||||
"cell_type": "markdown",
|
||||
"id": "51ed8312",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"The connections matrix can be indexed by a city. This returns a `Vector{Tuple}}` of all the destinations and their corresponding distances. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"id": "00608e1d",
|
||||
"metadata": {
|
||||
"scrolled": true
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"4-element Vector{Tuple{Int64, Int64}}:\n",
|
||||
" (3, 0)\n",
|
||||
" (1, 3)\n",
|
||||
" (4, 3)\n",
|
||||
" (2, 4)"
|
||||
]
|
||||
},
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"city = 3\n",
|
||||
"C_sorted[city]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"g25091.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "7384a305",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div>\n",
|
||||
"<img src=\"attachment:g25091.png\" align=\"left\" width=\"525\"/>\n",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "4f8cf018",
|
||||
"id": "44025bd5",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Loop over all paths"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "6c91a99f",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Next, we write an algorithm that traverses the whole search tree and prints all the possible paths. The tree is traversed in depth-first order. Before we go to a neighbouring city, we also have to verify that it has not been visited on this path yet. If we reach a leaf node, we print the complete path and continue searching. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"fig-tsp-output-1.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "987a0273",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div>\n",
|
||||
"<img src=\"attachment:fig-tsp-output-1.png\" align=\"left\" width=\"600\"/>\n",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 6,
|
||||
"id": "2ddc2ec1",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"visit_all_paths_recursive! (generic function with 1 method)"
|
||||
]
|
||||
},
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"function visital_all_paths(C_sorted,city)\n",
|
||||
"function visit_all_paths(C_sorted,city)\n",
|
||||
" # Initialize path\n",
|
||||
" num_cities = length(C_sorted)\n",
|
||||
" path=zeros(Int,num_cities)\n",
|
||||
" hops = 1\n",
|
||||
" path[hops] = city\n",
|
||||
" visital_all_paths_recursive!(C_sorted,hops,path)\n",
|
||||
" visit_all_paths_recursive!(C_sorted,hops,path)\n",
|
||||
"end\n",
|
||||
"function visital_all_paths_recursive!(C_sorted,hops,path)\n",
|
||||
"function visit_all_paths_recursive!(C_sorted,hops,path)\n",
|
||||
" num_cities = length(C_sorted)\n",
|
||||
" if hops != num_cities\n",
|
||||
" city = path[hops]\n",
|
||||
" next_hops = hops + 1\n",
|
||||
" connections = C_sorted[city]\n",
|
||||
" for (next_city,distance_increment) in connections\n",
|
||||
" # Check if next_city is already on path\n",
|
||||
" already_visited = (next_city in view(path,1:hops))\n",
|
||||
" if ! already_visited\n",
|
||||
" path[next_hops] = next_city\n",
|
||||
" visital_all_paths_recursive!(C_sorted,next_hops,path)\n",
|
||||
" visit_all_paths_recursive!(C_sorted,next_hops,path)\n",
|
||||
" end\n",
|
||||
" end\n",
|
||||
" return nothing\n",
|
||||
" else\n",
|
||||
" #@show path\n",
|
||||
" println(path)\n",
|
||||
" return nothing\n",
|
||||
" end\n",
|
||||
@@ -269,46 +437,70 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 7,
|
||||
"id": "723a0f1a",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[1, 2, 4, 3]\n",
|
||||
"[1, 2, 3, 4]\n",
|
||||
"[1, 4, 2, 3]\n",
|
||||
"[1, 4, 3, 2]\n",
|
||||
"[1, 3, 4, 2]\n",
|
||||
"[1, 3, 2, 4]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"city = 1\n",
|
||||
"visital_all_paths(C_sorted,city)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"g25091.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "8cbc8597",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div>\n",
|
||||
"<img src=\"attachment:g25091.png\" align=\"left\" width=\"525\"/>\n",
|
||||
"</div>"
|
||||
"visit_all_paths(C_sorted,city)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "65e654df",
|
||||
"id": "0f68093d",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Serial implementation without pruning\n",
|
||||
"\n",
|
||||
"- Now, we add the computation of the minimum distance"
|
||||
"Now, we add the computation of the minimum distance. At each leaf node, we update the minimum distance. Furthermore, as we add another node to our path, we update the distance of the current path. That makes it necessary to include two more parameters in our recursive algorithm: `distance`, the distance of the current path, and `min_distance`, the best minimum distance found so far. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"fig-tsp-output-2.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "881076fa",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div>\n",
|
||||
"<img src=\"attachment:fig-tsp-output-2.png\" align=\"left\" width=\"600\"/>\n",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 8,
|
||||
"id": "5989f0ac",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"tsp_serial_no_prune_recursive! (generic function with 1 method)"
|
||||
]
|
||||
},
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"function tsp_serial_no_prune(C_sorted,city)\n",
|
||||
" num_cities = length(C_sorted)\n",
|
||||
@@ -328,6 +520,7 @@
|
||||
" for (next_city,distance_increment) in connections\n",
|
||||
" already_visited = (next_city in view(path,1:hops))\n",
|
||||
" if ! already_visited\n",
|
||||
" # Add new city to path\n",
|
||||
" next_distance = distance + distance_increment\n",
|
||||
" path[next_hops] = next_city\n",
|
||||
" min_distance = tsp_serial_no_prune_recursive!(\n",
|
||||
@@ -336,6 +529,7 @@
|
||||
" end\n",
|
||||
" return min_distance\n",
|
||||
" else\n",
|
||||
" # Set new minimum distance in leaf nodes\n",
|
||||
" min_distance = min(distance,min_distance)\n",
|
||||
" #@show path, distance, min_distance\n",
|
||||
" return min_distance\n",
|
||||
@@ -345,10 +539,21 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 9,
|
||||
"id": "d1be2bfc",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"6"
|
||||
]
|
||||
},
|
||||
"execution_count": 9,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"city = 1\n",
|
||||
"min_distance = tsp_serial_no_prune(C_sorted,city)"
|
||||
@@ -356,20 +561,46 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "3c160cf9",
|
||||
"id": "cb9b8353",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Final serial implementation\n",
|
||||
"\n",
|
||||
"- Now, we add pruning"
|
||||
"Finally, we add the pruning to our algorithm. Anytime the current distance exceeds the minimum distance, the search in this path is aborted and continued with another path. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"fig-tsp-output-3.png": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAABqwAAAHqCAYAAABx8m9eAAAACXBIWXMAAB7CAAAewgFu0HU+AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAIABJREFUeJzs3Xl4nFXZx/HvPZM2oWWxBUGw0CYtW+FVpChgK2v1laUvoFQQEFkrgq2yNJmAGkelnaSFWooKBQWprGG1tQIWqUKRxYILVoE2aaGICLSsbSbNzP3+8aQyDcnMJJktye9zXb24cuY8z/k1zSRcz537HHN3REREcsHMyoBPAeOAPYE9gFHA1sBQYFvgbeA94F1gNfA88E9gOfCUu7cVOreIiIiIiIiIiIgUl6lgJSIivWFmw4GTgGOBQwiKUz31DvAHYCFwh7uv731CERERERERERERKXUqWImISI+Y2ZHA+cAxQHkelmgBFgE/dvelebi/iIiIiIiIiIiIlAgVrEREpFvMbBJwGXBgAZd9DJjh7r8u4JoiIiIiIiIiIiJSICpYiYhIVsxsb+DHwOFZTH8X+DvwHLASeJ3g3KqNwBCC86x2AMYQnHW1T/tYJkuAC9z9+e7mFxERERERERERkdKlgpWIiKRlZmVAHVANDE4z9a9AI/Aw8KS7b+rGGoMIOraOACYD+6aZHgdiwA/dvS3bNURERERERERERKR0qWAlIiJdMrNdgVuB8V1M2QD8HLje3f+Sw3U/AZwNnAVs1cW0PwCnuPvLuVpXREREREREREREikMFKxER6ZSZHQrcBWzfycsbgLnAj9z9P3nMsBNwETCVzgtXrwEnuPuyfGUQERERERERERGR/FPBSkREPsDM/g+4jc6LRIuAae7eXMA8VcA84OhOXo4Dp7r7XYXKIyIiIiIiIiIiIrkVKnYAEREpLWb2FeBuPlisehc4zd0nFbJYBeDuTe5+DHAG8F6Hl8uB28zslEJm6kp9c/3HG5obPlXsHCIiIiIiIiIiIn2JOqxEROS/zGwSQbGqrMNLzwInuvtzhU+1JTMbC9wJ7N3hpU3Ace7+m8Knel+sOfYowZlfSwy7pKayJmdne4mIiIiIiIiIiPRXKliJiAgAZvZpYAkf7Kx6FJjk7m8WPlXnzGw4wdaEB3d46T3gSHd/ovCpINYU+yLGnSlDSeCucCJcO33M9FXFyCQiIiIiIiIiItIXqGAlIiKY2Y7AM8AuHV56ADjB3TcWPlV6ZjYEuBf4bIeXXgI+4e5vFDLP/OXzB60bvu5ZYI9OXo4D1yZDydilIy99pZC5RERERERERERE+gKdYSUiMsCZWQi4iQ8Wq54g2Aaw5IpVAO6+ATgeeKzDS7sCC8zMCpnnle1fGYrxKNDWycvlwLRQMrRqZvPMqxpWNowoZDYREREREREREZFSpw4rEZEBzsy+Cfyow/ALwEHuvq4IkbrFzHYgKK5VdXjpAnf/SaHzNDQ37Jkk+QPgRKCrolkrcDtJvh8ZHVlZuHQiIiIiIiIiIiKlSQUrEZEBzMw+AvwT2C5lOA4c7O7PFCdV95nZAQRnbZWnDL8N7OXuRdmCr6Gp4YCEJWYY1nHLwlSbMBaEk+HY9KrpLxQsnIiIiIiIiIiISIlRwUpEZAAzs9uAkzoM56Uzycx2AXZu/zCZ64KYmX0LmNNheIG7n57Ldbortip2BCGiwIQ005I495nb7JrRNR23OBQREREREREREen3VLASERmgzOzjwDNsuW3dkwTdVck8rHcDcEb7hy3uvlWO7x8iOM/qwJRhBz7m7s/mcq2eqG+qn+DmNcCxaScay83tqqrKqpsnMzlRmHQiIiIiIiIiIiLFpYKViEgJiL0Yq6KNwzAOM2xJTWXNTfle08zuACanDLUBB7j7X/Kw1iCgCRjRPpTzglX7Op8EHgdCKcO3uPupuV6rp9oLV98BPpdh6gvmNqelpWVB3di6dwuRTUREREREREREpFhUsBIRKYKGlxp2SbYlxwMTDfus45UpL98VqYycmM/1zWxPYAVbFnbytn2emdUD1SlDeSlYta91O/CllKEEsKe7r8rHej01c/XMA83tUoKOq1CaqW8Bv3D3H9dW1T5fmHQiIiIiIiIiIiKFpYKViEgBNKxsGJEsS07EOQI4DNg1zfTXIpWRnQi2s8uLTgpIedk6z8zGAZcCX+jwUj4LVvsAf2XLItDl7v7tfKzXW7NWzhqdCCemAecCmT4ny4C58TXxe+oOq2vLfzoREREREREREZHCUMFKRCQPoiuiW5dXlB8ETCTERJz92fKsqLRCodDY6pHV/8hHNjMLA2uAj6YML3L3Sb287x7ARcAOwPbA/7T/tzN5K1i1Z1kMHJUytAaoysfZXLkyo3nGToZ9w7Cv0/XnDQDDmoHrrcxurN61+l+FSSgiIiIiIiIiIpI/KliJiOTAnLVztoq3xsd7yI80tyOB/YFwN2+TBP6Gs7Qt3Db32yO/3Zz7pGBmE4Hfdhg+0d3v6uV9/xe4P8vp+S5YnQTc1mH4MHf/fb7WzJXZr84emtiQOMPxqcCeGaa3AYsNu76qsmrxZCYnChBRREREREREREQk51SwEhHpgUYaw6tWrdqPMBNxJgITgIoe3KoJWAIs8cH+u9qP1r6R06CdMLPZwMUpQ+uAXdw93sv7llLBaivgFWC7lOGYu9fma808sIbmholJkt8g8zlX4LyMcWM4Eb5h+pjpJXVel4iIiIiIiIiISCYqWImIZKlhTcPeyWQy6KAyDnP8Q928hQPPmttDhFg6uGzwIxeOuHBdPrKmY2ZPA59IGbrF3U/NwX33AM7q4uW9gONSPs5rwao9zx3A5JShJ9z9oHyumS8NLzXsktyUnIJxAcGWi+kZyw1bUNZadvPFe1z8ev4TioiIiIiIiIiI9I4KViIiXZjRPGOnEKFDgInA54HdenCbV4BHMZaE2kKLq8dUr81pyG4ys2HA62zZrXOuu1+f53UnA3ekDBWiYHUe8NOUoQSwvbu/lc9182nO2jlbtbS1fMncziHo6sukBVho2IJh64bdP2XclE15jigiIiIiIiIiItIjKliJiLSLro5+aDCDD2s/g+pIYO8e3OZ14GEze8gT/lBkdGRlblP2jpkdAnQ8x2l3d89rziIVrPYC/tFheLy7P5bPdQulYU3D3p70cxw/nWy6ruA1nLuSJO/cvWr3pTrvSkRERERERERESokKViIyYHVyDtUhwOBu3mYjsAxjCQmWxEfHn6mjLpn7tLlhZucC81OGNgJbu3teMxepYBUG3gPKU4bPdPcb87luoUVXRAdXbFVxfJLkOYYdSaazrgKvAfeECN25cc3Gh+sOq2vLc0wREREREREREZG0VLASkQElZZu/SY4fY9jwbt4igfFnkiwBlsRD8UfrRtW15CFqXpjZLOCSlKG/uPt+BVi34AWr9nX/DoxNGYq5e22+1y2Wy9de/tGytrIT3f2rbHlOWZccX2fYrw1rbNnY8kDd2LrWPMcUERERERERERH5ABWsRKRfm7N2zlbx1vh4YCIhJuLsD1g3b9MEQYGKMEsiu0XW5zxogZjZL4FTU4bucfcvFGDdYhWsfgVMShn6hbufke91S0H9yvp9PORfwTgD2CnLy9YDi1S8EhERERERERGRQlPBSkT6ndiLsSqSTMSZBEwEKrp5i38Dj2AsSSQSv7ls9GUv5T5lcZjZfcD/pQzd6O5nFmDdYhWsOhbo7nb3L+Z73VISXRotG7zb4M8ZNhnjOGBYlpeux7nPze8ZNGTQQ5fsdMl7+cwpIiIiIiIiIiIDmwpWItLnzVk7Z3hrW+vn3P3zwOeAnbt5i/eApYY9YNiD1ZXVz+U+ZWkws98Bh6cMXe3uUwuwbrEKVj8Bvp4y9Ft3/1y+1y1VjTSGm5qaDnbzycBJZN951QY8gbHQQ76wdrfaFflLKSIiIiIiIiIiA5EKViLSJ9WvrN/Hy/xYnInAocCgbt6iCViEs3BocugjU8dMjec+Zekxs0eB8SlDV7r7xQVYt1gFqznAt1KG/uDuh+Z73b6gF8UraN8m07BFQxJDHhwo7x8REREREREREckfFaxEpE+Y/ersoYkNiSMcPxY4GhjRzVu8BizFWBJqCy2uHlO9NvcpS5+Z3Q/8b8rQte5+XgHWLVbB6nrg7JShxe5+TL7X7Ws6FK++BHykG5dvAB4zs0XWZncN1PeWiIiIiIiIiIj0jgpWIlKyYi/Gqixpk9z9WOAQYHA3Lm/D+AvJoIsqPjr+TB11yTxF7TPM7E4g9QynW9z91K7m53DdYhWsbicowGx2m7t/Od/r9mWNNIZfaHrhsBChE4FJGB/txuUO/BlY7Oa/3bpt68fVfSUiIiIiIiIiItlQwUpESkbDcw3bJAYlPmtmR+Ec1c0H5QArgfvd/YHWltaldWPr3s1Hzr6sk46jh9x9YgHWLVbB6mHgsJShgnSU9Se93H5zI7AMY4klbdmw9cOemDJuyqb8JBURERERERERkb5MBSsRKar6lfX7eNiPNrej3HwC3XsY3uL470MW+k0oGVo8vWr6C/nK2V+Y2aXA5SlDL7n7bgVYt1gFq38BO6cMVbv7rHyv21/NfHnm9tZqRwATgf+je1sHArwLPI6xhARLIqMjTxN0ZYmIiIiIiIiIyACngpWIFFR0abSsYreKgxw/FuN4YM9u3mI18CCwJNQaur96z+p3ch6yHzOzLwJ3pgw5sI27v5fndQtesDKzbYG3Ogwf7+735XPdgaKRxvCqVav2w5hEiGNx9gesm7d5FfgDxpKEJx64rPKyNXmIKiIiIiIiIiIifYAKViKSdyldGZMIujK268blbcATGAvbOzKW5yXkAGFm+wJ/6zB8uLsvzfO6xShYTQR+22F4L3d/Lp/rDlQNKxtGJMuSR1vSjnLzw+ne+3yz54BHDHtkU2jTI98e+e3mHMcUEREREREREZESpYKViORF7MVYlSVtkrsfS3CGUFk3Ln+VoItqobk9WFNV07FLRnrILine truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "3c160cf9",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div>\n",
|
||||
"<img src=\"attachment:fig-tsp-output-3.png\" align=\"left\" width=\"600\"/>\n",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 10,
|
||||
"id": "8241e0df",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"tsp_serial_recursive! (generic function with 1 method)"
|
||||
]
|
||||
},
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"function tsp_serial(C_sorted,city)\n",
|
||||
" num_cities = length(C_sorted)\n",
|
||||
@@ -381,6 +612,7 @@
|
||||
" tsp_serial_recursive!(C_sorted,hops,path,distance,min_distance)\n",
|
||||
"end\n",
|
||||
"function tsp_serial_recursive!(C_sorted,hops,path,distance,min_distance)\n",
|
||||
" # Prune this path if its distance is too high already\n",
|
||||
" if distance >= min_distance\n",
|
||||
" return min_distance\n",
|
||||
" end\n",
|
||||
@@ -392,6 +624,7 @@
|
||||
" for (next_city,distance_increment) in connections\n",
|
||||
" already_visited = (next_city in view(path,1:hops))\n",
|
||||
" if ! already_visited\n",
|
||||
" # Add city to path \n",
|
||||
" next_distance = distance + distance_increment\n",
|
||||
" path[next_hops] = next_city\n",
|
||||
" min_distance = tsp_serial_recursive!(\n",
|
||||
@@ -400,6 +633,7 @@
|
||||
" end\n",
|
||||
" return min_distance\n",
|
||||
" else\n",
|
||||
" # Set new minimum distance in leaf nodes\n",
|
||||
" min_distance = min(distance,min_distance)\n",
|
||||
" #@show path, distance, min_distance\n",
|
||||
" return min_distance\n",
|
||||
@@ -409,10 +643,21 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 11,
|
||||
"id": "998087f2",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"6"
|
||||
]
|
||||
},
|
||||
"execution_count": 11,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"city = 1\n",
|
||||
"min_distance = tsp_serial(C_sorted,city)"
|
||||
@@ -423,17 +668,37 @@
|
||||
"id": "7f0a5d5c",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Performance"
|
||||
"### Performance\n",
|
||||
"Let's have a look at how well our code performs. In the following block, we create another random matrix and time the execution for both versions with and without pruning. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 12,
|
||||
"id": "e1eb74d8",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
" 34.405785 seconds (2 allocations: 224 bytes)\n",
|
||||
" 0.010765 seconds (2 allocations: 224 bytes)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"\u001b[32m\u001b[1mTest Passed\u001b[22m\u001b[39m"
|
||||
]
|
||||
},
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"n = 12 # It is safe to test up to 12\n",
|
||||
"n = 12 # It is safe to test up to n=12\n",
|
||||
"using Random\n",
|
||||
"using Test\n",
|
||||
"Random.seed!(1)\n",
|
||||
@@ -445,12 +710,20 @@
|
||||
"@test min_no_prune == min_prune"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "6088ddc9",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"You can observe that, especially for larger numbers of cities (n=11 or n=12), the performance of the algorithm with pruning is much better than the performance of the algorithm without pruning. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "733ce76e",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Parallel implementation"
|
||||
"## Parallel algorithm"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -458,7 +731,8 @@
|
||||
"id": "c6375465",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Where can we extract parallelism ?"
|
||||
"### Where can we extract parallelism ?\n",
|
||||
"Unlike the previous algorithms we studied, in this problem we don't know beforehand how much work is performed since we don't know where the pruning cuts off part of the search tree. Still, we want to divide the workload among multiple processes to enhance the performance. "
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -483,8 +757,7 @@
|
||||
"source": [
|
||||
"### Option 1\n",
|
||||
"\n",
|
||||
"- We assign a branch to each worker\n",
|
||||
"- Pros? Cons?\n"
|
||||
"The first idea how to parallelize the TSP algorithm is to assign a branch of our search tree to each process. However, as mentioned in an earlier section, the number of branches in the search tree can be up to $O(N!)$. This would require an unfeasibly large amount of proecesses which each do only very little work. "
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -508,8 +781,7 @@
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Option 2\n",
|
||||
"- We assign a fixed number of branches to each worker in advance\n",
|
||||
"- Pros? Cons?"
|
||||
"Instead of assigning one branch per worker, we can assign a fixed number of branches to each worker. This way, each worker can perform the pruning within their own subtree and less workers are needed. \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -527,15 +799,27 @@
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "e3af7def",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Performance issues\n",
|
||||
"\n",
|
||||
"#### Load balancing\n",
|
||||
"However, this approach has a problem with load balancing. Since we don't know beforehand how much pruning can be done in each subtree, some workers might end up doing less work than others. This uneven distribution of workload leads to some workers being idle, which impairs the speedup. \n",
|
||||
"\n",
|
||||
"#### Search overhead \n",
|
||||
"Another disadvantage of this kind of parallel search is that the pruning is now less effective. The workers each run their own version of the search algorithm and keep track of their local minimum distances. This means that less nodes will be pruned in total than in the serial version. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "d9edf5c1",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div>\n",
|
||||
" <br>\n",
|
||||
" <br>\n",
|
||||
" <br>\n",
|
||||
"<div class=\"alert alert-block alert-success\">\n",
|
||||
"<b>Question:</b> How many nodes are pruned in total when we assign two branches to each worker? Look at the illustration below.\n",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
@@ -555,54 +839,77 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "7d340c63",
|
||||
"cell_type": "code",
|
||||
"execution_count": 16,
|
||||
"id": "95e952af",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"It's not correct. Keep trying! 💪\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"### Main performance issues\n",
|
||||
"\n",
|
||||
"- Dynamic load imbalance\n",
|
||||
"- Search overhead"
|
||||
"answer = -1 # Replace with any integer value \n",
|
||||
"tsp_check_2(answer)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "c6d51e00",
|
||||
"id": "d0bc4fdd",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Dynamic load balancing with replicated workers model\n",
|
||||
"\n",
|
||||
"- The coordinator searches up to a certain depth in the tree\n",
|
||||
"- When the maximum depth is reached, the coordinator delegates the search to a worker\n",
|
||||
"- Worker processes repeatedly get work and execute it\n"
|
||||
"We can see from this example, that the serial algorithm was able to prune more nodes since it could use the global minimum distance as a pruning bound. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "6190b00a",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Option 3: Dynamic load balancing with replicated workers model\n",
|
||||
"In our parallel implementation, we will use a coordinator process and several worker processes. The coordinator process (or _master_) searches the tree up to a certain maximum depth _maxhops_. When _maxhops_ is reached, the coordinator creates a job and delegates it to a worker. The workers repeatedly get work from the master and execute it. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"Screenshot%20from%202023-09-25%2013-03-57.png": {
|
||||
"image/png": "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 truncated
|
||||
"fig-tsp-master-worker-2.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "a8f431d1",
|
||||
"id": "c6d51e00",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div>\n",
|
||||
"<img src=\"attachment:Screenshot%20from%202023-09-25%2013-03-57.png\" align=\"left\" width=\"600\"/>\n",
|
||||
"<img src=\"attachment:fig-tsp-master-worker-2.png\" align=\"left\" width=\"600\"/>\n",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "497bad13",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"This avoids the performance issues of the previous approach: the workers are not idle since they get new work every time they finish a job. To avoid the search overhead, it is also important that the workers communicate the minimum distance each time they update their local minimum distance. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "5e4fdbe1",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Code"
|
||||
"## Implementation of the parallel algorithm \n",
|
||||
"\n",
|
||||
"First, let's add our worker processes. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 19,
|
||||
"id": "354f5abb",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
@@ -612,7 +919,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 20,
|
||||
"id": "7f8f6702",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
@@ -629,7 +936,7 @@
|
||||
"source": [
|
||||
"### Visit paths in parallel\n",
|
||||
"\n",
|
||||
"- We follow a produce-consumer model using a remote channel"
|
||||
"Next we will write a simplified version of the algorithm which visits all paths in parallel. We will follow a produce-consumer model using a remote channel. TODO: continue"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -937,7 +1244,7 @@
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Julia 1.9.0",
|
||||
"display_name": "Julia 1.9.1",
|
||||
"language": "julia",
|
||||
"name": "julia-1.9"
|
||||
},
|
||||
@@ -945,7 +1252,7 @@
|
||||
"file_extension": ".jl",
|
||||
"mimetype": "application/julia",
|
||||
"name": "julia",
|
||||
"version": "1.9.0"
|
||||
"version": "1.9.1"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
Reference in new issue
Block a user