diff --git a/.ipynb_checkpoints/heldAndKarp-checkpoint.ipynb b/.ipynb_checkpoints/heldAndKarp-checkpoint.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..3907e9630960c50fca0d7e2550b8f5282778031c --- /dev/null +++ b/.ipynb_checkpoints/heldAndKarp-checkpoint.ipynb @@ -0,0 +1,119 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Held \\& Karp algorithm" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "┌ Info: Precompiling Graphs [86223c79-3864-5bf0-83f7-82e725a168b6]\n", + "└ @ Base loading.jl:1260\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Modules loaded\n" + ] + } + ], + "source": [ + "using LinearAlgebra\n", + "using JuMP\n", + "using Cbc\n", + "using Graphs\n", + "\n", + "println(\"Modules loaded\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "function hk(W)\n", + " \n", + " # Initialization\n", + " n = size(W, 1)\n", + " \n", + " if size(W, 2)!=n\n", + " error(\"Weight matrice must be square\")\n", + " end\n", + " # \n", + " \n", + " λ = zeros(n)\n", + "\n", + " g = simple_graph(n-1, is_directed = false)\n", + " W_reduced = W[2:n,2:n]\n", + " z = 0\n", + " while z!=n # While not a tour\n", + " \n", + " # Minimum spanning tree (span_tree : st)\n", + " st = kruskal_minimum_spantree(g, W_reduced)[1]\n", + " \n", + " # Connect vertex 1\n", + " m = Model(Cbc.Optimizer()) # PL(NE) Model\n", + " \n", + " @variable(m, X[1:n, 1:n], Bin)\n", + " \n", + " @objective(m, Min, \n", + " 2*sum(λ[2:n]) + \n", + " sum((W[u,v] - λ[u] - λ[v])*X[u,v] for u ∈ 1:n for v ∈ 1:u)\n", + " )\n", + " \n", + " @constraint(m, degreeRoot, sum(X[1,:]) == 2)\n", + " @constraint(m, spanningTree[u ∈ 2:n, v ∈ 2:n], X[u,v] == st[u,v])\n", + " \n", + " optimize!(m)\n", + " \n", + " if !( \n", + " ( termination_status(m) == MOI.OPTIMAL ) || \n", + " ( termination_status(m) == MOI.TIME_LIMIT \n", + " && has_values(m) ) \n", + " )\n", + " error(\"Couldn't connect vertex 1 (PLNE failed).\")\n", + " end\n", + " \n", + " z = objective_value(m)\n", + " D = [sum(value.(X)[u,:]) for u ∈ 1:n]\n", + " # For the degree, we suppose a null diagonal, to be checked later on\n", + " \n", + " if z!=n # If not a tour, update\n", + " λ .= λ .+ 2.*(2.-D) # Experimenter d'autres règles\n", + " end\n", + " \n", + " end\n", + " \n", + " \n", + "end" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia 1.4.2", + "language": "julia", + "name": "julia-1.4" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.4.2" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/heldAndKarp.ipynb b/heldAndKarp.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..3907e9630960c50fca0d7e2550b8f5282778031c --- /dev/null +++ b/heldAndKarp.ipynb @@ -0,0 +1,119 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Held \\& Karp algorithm" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "┌ Info: Precompiling Graphs [86223c79-3864-5bf0-83f7-82e725a168b6]\n", + "└ @ Base loading.jl:1260\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Modules loaded\n" + ] + } + ], + "source": [ + "using LinearAlgebra\n", + "using JuMP\n", + "using Cbc\n", + "using Graphs\n", + "\n", + "println(\"Modules loaded\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "function hk(W)\n", + " \n", + " # Initialization\n", + " n = size(W, 1)\n", + " \n", + " if size(W, 2)!=n\n", + " error(\"Weight matrice must be square\")\n", + " end\n", + " # \n", + " \n", + " λ = zeros(n)\n", + "\n", + " g = simple_graph(n-1, is_directed = false)\n", + " W_reduced = W[2:n,2:n]\n", + " z = 0\n", + " while z!=n # While not a tour\n", + " \n", + " # Minimum spanning tree (span_tree : st)\n", + " st = kruskal_minimum_spantree(g, W_reduced)[1]\n", + " \n", + " # Connect vertex 1\n", + " m = Model(Cbc.Optimizer()) # PL(NE) Model\n", + " \n", + " @variable(m, X[1:n, 1:n], Bin)\n", + " \n", + " @objective(m, Min, \n", + " 2*sum(λ[2:n]) + \n", + " sum((W[u,v] - λ[u] - λ[v])*X[u,v] for u ∈ 1:n for v ∈ 1:u)\n", + " )\n", + " \n", + " @constraint(m, degreeRoot, sum(X[1,:]) == 2)\n", + " @constraint(m, spanningTree[u ∈ 2:n, v ∈ 2:n], X[u,v] == st[u,v])\n", + " \n", + " optimize!(m)\n", + " \n", + " if !( \n", + " ( termination_status(m) == MOI.OPTIMAL ) || \n", + " ( termination_status(m) == MOI.TIME_LIMIT \n", + " && has_values(m) ) \n", + " )\n", + " error(\"Couldn't connect vertex 1 (PLNE failed).\")\n", + " end\n", + " \n", + " z = objective_value(m)\n", + " D = [sum(value.(X)[u,:]) for u ∈ 1:n]\n", + " # For the degree, we suppose a null diagonal, to be checked later on\n", + " \n", + " if z!=n # If not a tour, update\n", + " λ .= λ .+ 2.*(2.-D) # Experimenter d'autres règles\n", + " end\n", + " \n", + " end\n", + " \n", + " \n", + "end" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia 1.4.2", + "language": "julia", + "name": "julia-1.4" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.4.2" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}