mirror of
https://github.com/fverdugo/XM_40017.git
synced 2025-11-08 21:44:23 +01:00
273 lines
7.5 KiB
Plaintext
273 lines
7.5 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"id": "8850d90e",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"using Distributed"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"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"
|
|
}
|
|
],
|
|
"source": [
|
|
"if procs() == workers()\n",
|
|
" addprocs(4)\n",
|
|
"end"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"id": "4a2756ae",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"@everywhere 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"
|
|
]
|
|
},
|
|
{
|
|
"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,
|
|
"id": "78095098",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"(path = [1, 4, 5, 2, 3, 6], distance = 222)"
|
|
]
|
|
},
|
|
"execution_count": 6,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"connections = [\n",
|
|
" [(1,0),(4,39),(5,76), (6,78),(3,94),(2,97)],\n",
|
|
" [(2,0),(5,25),(4,58),(3,62),(1,97),(6,109)],\n",
|
|
" [(3,0),(6,58),(2,62),(4,68),(5,70),(1,94)],\n",
|
|
" [(4,0),(5,38),(1,39),(2,58),(3,68),(6,78)],\n",
|
|
" [(5,0),(2,25),(4,38),(3,70),(1,76),(6,104)],\n",
|
|
" [(6,0),(3,58),(1,78),(4,78),(5,104),(2,109)]\n",
|
|
"]\n",
|
|
"city = 1\n",
|
|
"tsp_serial(connections,city)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"id": "03f0dd8e",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"(path = [1, 4, 5, 2, 3, 6], distance = 222)"
|
|
]
|
|
},
|
|
"execution_count": 10,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"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",
|
|
" if hops == num_cities\n",
|
|
" if current_distance < min_distance\n",
|
|
" if ftr_result !== nothing\n",
|
|
" @spawnat 1 begin\n",
|
|
" result = fetch(ftr_result)\n",
|
|
" result.path .= path\n",
|
|
" result.min_distance_ref[] = current_distance\n",
|
|
" end |> wait\n",
|
|
" end\n",
|
|
" return current_distance\n",
|
|
" end\n",
|
|
" elseif hops <= max_hops\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_dist_impl(connections,next_hops,path,next_distance,min_distance,max_hops,jobs_chnl,ftr_result)\n",
|
|
" end\n",
|
|
" end\n",
|
|
" end \n",
|
|
" else\n",
|
|
" if jobs_chnl !== nothing\n",
|
|
" put!(jobs_chnl,(;hops,path,current_distance))\n",
|
|
" end\n",
|
|
" end\n",
|
|
" min_distance\n",
|
|
"end\n",
|
|
"\n",
|
|
"function tsp_dist(connections,city)\n",
|
|
" max_hops = 2\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",
|
|
" jobs_chnl = RemoteChannel(()->Channel{Any}(10))\n",
|
|
" ftr_result = @spawnat 1 (;path,min_distance_ref=Ref(min_distance))\n",
|
|
" task = @async begin\n",
|
|
" tsp_dist_impl(connections,hops,path,current_distance,min_distance,max_hops,jobs_chnl,nothing)\n",
|
|
" for w in workers()\n",
|
|
" put!(jobs_chnl,nothing)\n",
|
|
" end\n",
|
|
" end\n",
|
|
" @sync for w in workers()\n",
|
|
" @spawnat w begin\n",
|
|
" max_hops = typemax(Int)\n",
|
|
" jobs_channel = nothing\n",
|
|
" while true\n",
|
|
" job = take!(jobs_chnl)\n",
|
|
" if job == nothing\n",
|
|
" break\n",
|
|
" end\n",
|
|
" hops = job.hops\n",
|
|
" path = job.path\n",
|
|
" current_distance = job.current_distance\n",
|
|
" tsp_dist_impl(connections,hops,path,current_distance,min_distance,max_hops,jobs_channel,ftr_result)\n",
|
|
" end\n",
|
|
" end\n",
|
|
" end \n",
|
|
" result = fetch(ftr_result)\n",
|
|
" (;path = result.path, distance = result.min_distance_ref[])\n",
|
|
"end\n",
|
|
"city = 1\n",
|
|
"tsp_dist(connections,city)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "370a1205",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Julia 1.9.1",
|
|
"language": "julia",
|
|
"name": "julia-1.9"
|
|
},
|
|
"language_info": {
|
|
"file_extension": ".jl",
|
|
"mimetype": "application/julia",
|
|
"name": "julia",
|
|
"version": "1.9.1"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|