mirror of
https://github.com/fverdugo/XM_40017.git
synced 2026-11-15 06:07:17 +01:00
More work on tsp
This commit is contained in:
1 parent
9372448ef5
commit
5a7d33d8ea
2 files changed
+5525
-1015
No files matched your search
+5058
-891
File diff suppressed because it is too large.
Load diff
|
Before Width: | Height: | Size: 3.0 MiB After Width: | Height: | Size: 3.2 MiB |
+467
-124
@@ -2,7 +2,7 @@
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "533363df",
|
||||
"id": "e3666bcd",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<img src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/3/39/VU_logo.png/800px-VU_logo.png?20161029201021\" width=\"350\">\n",
|
||||
@@ -14,7 +14,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "98ebaf0c",
|
||||
"id": "1e74dfd9",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Contents\n",
|
||||
@@ -27,7 +27,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "14864a1b",
|
||||
"id": "bf3dd0e6",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## The traveling sales person (TSP) problem\n",
|
||||
@@ -48,33 +48,484 @@
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"g18228.png": {
|
||||
"image/png": "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 truncated
|
||||
"g22650.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "14ae7875",
|
||||
"id": "dad0547d",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div>\n",
|
||||
"<img src=\"attachment:g18228.png\" align=\"left\" width=\"450\"/>\n",
|
||||
"<img src=\"attachment:g22650.png\" align=\"left\" width=\"450\"/>\n",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "aca8b2c4",
|
||||
"id": "c303dddf",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Branch and bound algorithm\n",
|
||||
"\n",
|
||||
"We consider a [branch and bound strategy](https://en.wikipedia.org/wiki/Branch_and_bound) to solve the ASP problem. The first ingredient of this strategy is to enumerate all potential solutions of the problem using a search tree. The tree is defined as follows:\n",
|
||||
"\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",
|
||||
"\n",
|
||||
"\n",
|
||||
"The nearest city first heuristic is a way to speed up the search as we increase the possibility of finding the solution in the first paths enumerated in the tree."
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"g25091.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "9797bb92",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div>\n",
|
||||
"<img src=\"attachment:g25091.png\" align=\"left\" width=\"525\"/>\n",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "ecf89636",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Pruning the search tree\n",
|
||||
"\n",
|
||||
"We look for a solution by going over the branches of the search tree via first-depth search. Each time we hit a lead in the tree we have a route between all cities and this a possible solution of the TSP problem (called a partial solution). In this process, we keep track of which is the shortest partial solution found so far. Note that we don't need to completely traverse all branches. In some cases, the distance at an intermediate point in a route will be already equal or greater than the best distance found so-far. In this case, we don't need to continue moving within this branch and we can jump to the next one. This is the \"bound\" criterion in our branch and bound strategy, which is also referred to as \"pruning\" the search tree.\n",
|
||||
"\n",
|
||||
"In the example below, the first route has distance 6. At an intermediate point of the 2nd route we have already covered a distance equal to 6 which guarantees that the solution will not be in this part of the tree.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"g23181.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "f18d02d6",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div>\n",
|
||||
"<img src=\"attachment:g23181.png\" align=\"left\" width=\"300\"/>\n",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "239b7362",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Thus, there are only 2 more complete routes that we need to visit. Using this strategy we have significantly reduced the routes visited: from 6 possible routes to 3 visited routes."
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"g23549.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "0fbe1ee0",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div>\n",
|
||||
"<img src=\"attachment:g23549.png\" align=\"left\" width=\"300\"/>\n",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "4fe017a4",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Serial implementation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "40027c85",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Input distance"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"id": "2eeecdd6",
|
||||
"metadata": {},
|
||||
"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": 1,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"C = [\n",
|
||||
" 0 2 3 2\n",
|
||||
" 2 0 4 1\n",
|
||||
" 3 4 0 3\n",
|
||||
" 2 1 3 0 \n",
|
||||
"]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 24,
|
||||
"id": "03cac0a1",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"4-element Vector{Vector{Tuple{Int64, Int64}}}:\n",
|
||||
" [(1, 0), (2, 2), (3, 3), (4, 4)]\n",
|
||||
" [(2, 0), (4, 1), (1, 2), (3, 3)]\n",
|
||||
" [(3, 0), (1, 3), (2, 3), (4, 10)]\n",
|
||||
" [(4, 0), (2, 1), (1, 4), (3, 10)]"
|
||||
]
|
||||
},
|
||||
"execution_count": 24,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"C = [\n",
|
||||
" [(1,0), (2,2), (3,3), (4,4)],\n",
|
||||
" [(2,0), (4,1), (1,2), (3,3)],\n",
|
||||
" [(3,0), (1,3), (2,3), (4,10)], \n",
|
||||
" [(4,0), (2,1), (1,4), (3,10)]\n",
|
||||
"]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "f2b70f85",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Nearest-city first heuristic"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"id": "a50706bc",
|
||||
"metadata": {},
|
||||
"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",
|
||||
" map(1:n) do i\n",
|
||||
" Ci = C[i,:]\n",
|
||||
" cities = sortperm(Ci)\n",
|
||||
" distances = Ci[cities]\n",
|
||||
" collect(zip(cities,distances))[2:end]\n",
|
||||
" end\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "6dd0288e",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"connections = sort_neighbors(C)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "4f8cf018",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Implementation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 25,
|
||||
"id": "d00beaba",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"(path, distance, min_distance) = ([1, 2, 4, 3], 13, 13)\n",
|
||||
"(path, distance, min_distance) = ([1, 3, 2, 4], 7, 7)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"7"
|
||||
]
|
||||
},
|
||||
"execution_count": 25,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"function tsp_serial(C,city)\n",
|
||||
" #connections = sort_neighbors(C)\n",
|
||||
" num_cities = length(connections)\n",
|
||||
" path=zeros(Int,num_cities)\n",
|
||||
" hops = 1\n",
|
||||
" path[hops] = city\n",
|
||||
" distance = 0\n",
|
||||
" min_distance = typemax(Int)\n",
|
||||
" tsp_serial_recursive!(connections,hops,path,distance,min_distance)\n",
|
||||
"end\n",
|
||||
"function tsp_serial_recursive!(connections,hops,path,distance,min_distance)\n",
|
||||
" num_cities = length(connections)\n",
|
||||
" if hops == num_cities\n",
|
||||
" min_distance = min(distance,min_distance)\n",
|
||||
" @show path, distance, min_distance\n",
|
||||
" return min_distance\n",
|
||||
" else\n",
|
||||
" next_hops = hops + 1\n",
|
||||
" current_city = path[hops]\n",
|
||||
" for (next_city,distance_increment) in connections[current_city]\n",
|
||||
" if !visited(next_city,hops,path)\n",
|
||||
" next_distance = distance + distance_increment\n",
|
||||
" path[next_hops] = next_city\n",
|
||||
" if next_distance < min_distance\n",
|
||||
" min_distance = tsp_serial_recursive!(connections,next_hops,path,next_distance,min_distance)\n",
|
||||
" end\n",
|
||||
" end\n",
|
||||
" end \n",
|
||||
" end\n",
|
||||
" return min_distance\n",
|
||||
"end\n",
|
||||
"function visited(city,hops,path)\n",
|
||||
" for i = 1:hops\n",
|
||||
" if path[i] == city\n",
|
||||
" return true\n",
|
||||
" end\n",
|
||||
" end\n",
|
||||
" return false\n",
|
||||
"end\n",
|
||||
"\n",
|
||||
"city = 1\n",
|
||||
"tsp_serial(C,city)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "505e00f7",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"function tsp_serial(C,city)\n",
|
||||
" connections = sort_neighbors(C)\n",
|
||||
" num_cities = length(connections)\n",
|
||||
" current_route = (;path=zeros(Int,num_cities),distance=Ref(0))\n",
|
||||
" min_route = (;path=zeros(Int,num_cities),distance=Ref(typemax(Int)))\n",
|
||||
" hops = 1\n",
|
||||
" current_route.path[hops] = city\n",
|
||||
" tsp_serial_recursive!(connections,hops,current_route,min_route)\n",
|
||||
" min_route\n",
|
||||
"end\n",
|
||||
"function tsp_serial_recursive(connections,hops,current_route,min_route)\n",
|
||||
" num_cities = length(connections)\n",
|
||||
" if hops == num_cities\n",
|
||||
" if current_route.distance < min_route.distance\n",
|
||||
" min_route.path .= current_route.path\n",
|
||||
" min_route.distance[] = current_route.distance \n",
|
||||
" return\n",
|
||||
" end\n",
|
||||
" else\n",
|
||||
" next_hops = hops + 1\n",
|
||||
" current_city = current_route.path[hops]\n",
|
||||
" for (next_city,distance_increment) in connections[current_city]\n",
|
||||
" if !visited(next_city,hops,current_route.path)\n",
|
||||
" \n",
|
||||
" next_distance = current_distance + distance_increment\n",
|
||||
" \n",
|
||||
" if next_distance < min_distance\n",
|
||||
" return tsp_serial_recursive(connections,hops+1,current_route,min_route)\n",
|
||||
" end\n",
|
||||
" end\n",
|
||||
" end \n",
|
||||
" end\n",
|
||||
" min_distance\n",
|
||||
"end\n",
|
||||
"\n",
|
||||
"function visited(city,hops,path)\n",
|
||||
" for i = 1:hops\n",
|
||||
" if path[i] == city\n",
|
||||
" return true\n",
|
||||
" end\n",
|
||||
" end\n",
|
||||
" return false\n",
|
||||
"end\n",
|
||||
"\n",
|
||||
"city = 1\n",
|
||||
"tsp_serial(C,city)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "94d8193f",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Generating some test data\n",
|
||||
"\n",
|
||||
"The following function generates a random symmetric distance matrix, we have used a large. Note that the TSP problem at least requires that the underlying graph is connected (otherwise there is no route that visits all nodes). The next function does not guarantee this. In any case, we can still used a non-connected graph as input. The outcome of the search will be that there is no possible route."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "88fc4499",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"function rand_symmetric_distance_table(n)\n",
|
||||
" threshold = 0.2\n",
|
||||
" mincost = 3\n",
|
||||
" maxcost = 10\n",
|
||||
" infinity = 10000*maxcost\n",
|
||||
" C = fill(infinity,n,n)\n",
|
||||
" for j in 1:n\n",
|
||||
" for i in 1:j\n",
|
||||
" if rand() > threshold\n",
|
||||
" C[i,j] = rand(mincost:maxcost)\n",
|
||||
" C[j,i] = C[i,j]\n",
|
||||
" end\n",
|
||||
" end\n",
|
||||
" C[j,j] = 0\n",
|
||||
" end\n",
|
||||
" C,infinity\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "d649cf80",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"n = 10000\n",
|
||||
"C, inf = rand_symmetric_distance_table(n)\n",
|
||||
"city = 1\n",
|
||||
"(;path,distance) = tsp_serial(C,city)\n",
|
||||
"if distance >= inf\n",
|
||||
" println(\"The input graph is nonconnected\")\n",
|
||||
"else\n",
|
||||
" (;path,distance)\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"g23360.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "b0ea4b99",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div>\n",
|
||||
"<img src=\"attachment:g23360.png\" align=\"left\" width=\"300\"/>\n",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"g22999.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "e734b6dc",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div>\n",
|
||||
"<img src=\"attachment:g22999.png\" align=\"left\" width=\"300\"/>\n",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"attachments": {
|
||||
"g22822.png": {
|
||||
"image/png": "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 truncated
|
||||
}
|
||||
},
|
||||
"cell_type": "markdown",
|
||||
"id": "c8f723c4",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<div>\n",
|
||||
"<img src=\"attachment:g22822.png\" align=\"left\" width=\"300\"/>\n",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "6f8100ad",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "bef63110",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "9f66ca90",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "88b90b22",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "8850d90e",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
@@ -84,25 +535,10 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"execution_count": null,
|
||||
"id": "5d4935ee",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"4-element Vector{Int64}:\n",
|
||||
" 2\n",
|
||||
" 3\n",
|
||||
" 4\n",
|
||||
" 5"
|
||||
]
|
||||
},
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"if procs() == workers()\n",
|
||||
" addprocs(4)\n",
|
||||
@@ -111,7 +547,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"execution_count": null,
|
||||
"id": "4a2756ae",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
@@ -128,92 +564,10 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"id": "39e9e667",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"tsp_serial_impl (generic function with 1 method)"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"function tsp_serial_impl(connections,hops,path,current_distance,min_distance)\n",
|
||||
" num_cities = length(connections)\n",
|
||||
" if hops == num_cities\n",
|
||||
" if current_distance < min_distance\n",
|
||||
" return current_distance\n",
|
||||
" end\n",
|
||||
" else\n",
|
||||
" current_city = path[hops]\n",
|
||||
" next_hops = hops + 1\n",
|
||||
" for (next_city,distance_increment) in connections[current_city]\n",
|
||||
" if !visited(next_city,hops,path)\n",
|
||||
" path[next_hops] = next_city\n",
|
||||
" next_distance = current_distance + distance_increment\n",
|
||||
" if next_distance < min_distance\n",
|
||||
" return tsp_serial_impl(connections,next_hops,path,next_distance,min_distance)\n",
|
||||
" end\n",
|
||||
" end\n",
|
||||
" end \n",
|
||||
" end\n",
|
||||
" min_distance\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"id": "83b58881",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"tsp_serial (generic function with 1 method)"
|
||||
]
|
||||
},
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"function tsp_serial(connections,city)\n",
|
||||
" num_cities = length(connections)\n",
|
||||
" path=zeros(Int,num_cities)\n",
|
||||
" hops = 1\n",
|
||||
" path[hops] = city\n",
|
||||
" current_distance = 0\n",
|
||||
" min_distance = typemax(Int)\n",
|
||||
" min_distance = tsp_serial_impl(connections,hops,path,current_distance,min_distance)\n",
|
||||
" (;path=path,distance=min_distance)\n",
|
||||
"end"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"execution_count": null,
|
||||
"id": "78095098",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(path = [1, 4, 5, 2, 3, 6], distance = 222)"
|
||||
]
|
||||
},
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"connections = [\n",
|
||||
" [(1,0),(4,39),(5,76), (6,78),(3,94),(2,97)],\n",
|
||||
@@ -229,21 +583,10 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"execution_count": null,
|
||||
"id": "03f0dd8e",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(path = [1, 4, 5, 2, 3, 6], distance = 222)"
|
||||
]
|
||||
},
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"@everywhere function tsp_dist_impl(connections,hops,path,current_distance,min_distance,max_hops,jobs_chnl,ftr_result)\n",
|
||||
" num_cities = length(connections)\n",
|
||||
|
||||
Reference in new issue
Block a user