diff --git a/tsp_hk.jl b/tsp_hk.jl new file mode 100644 index 0000000000000000000000000000000000000000..2732f9480f85f946be4ff9363d0a4ec04007d67e --- /dev/null +++ b/tsp_hk.jl @@ -0,0 +1,136 @@ +#=using LinearAlgebra +using JuMP +using GLPK +using LightGraphs +using GraphPlot=# +using Combinatorics +#=function algorithm TSP (G, n) is + for k := 2 to n do + C({k}, k) := d1,k + end for + + for s := 2 to n−1 do + for all S ⊆ {2, . . . , n}, |S| = s do + for all k ∈ S do + C(S, k) := minm≠k,m∈S [C(S\{k}, m) + dm,k] + end for + end for + end for + + opt := mink≠1 [C({2, 3, . . . , n}, k) + dk, 1] + return (opt) +end function=# + #C[ ([1],1) ] = 1 + #dico[(array,entier)] = valeur +function dp_held_karp(W,n) + C = Dict{Tuple{Array,Integer},Integer}() + + for k in collect(2:n) + C[(Array([k]),k)]= collect(W[1,k])[1] + end + + for s in 2:(n-1) + for S in collect(combinations(collect(2:n),s)) + #println(S) + for k in S + #println(k) + Sp = [s for s in S if (s!=k)] + #print(Sp) + C[(S,k)] = collect(20000000)[1] + for m in S + if m != k + if C[(S,k)] >= C[(Sp,m)] + W[m,k] + C[(S,k)] = C[(Sp,m)] + W[m,k] + end + end + end + end + #println("")=# + #print(S) + #println("") + end + end + opt = 2000000000 + + for k in 2:n + if opt >= C[(collect(2:n),k)] + W[k,1] + opt = C[(collect(2:n),k)] + W[k,1] + end + end + + return opt +end + +function getPath(W,n,opt) + println("Valeur optimale : ",opt) + S = collect(permutations(collect(1:n),n)) + idgood = Integer[] + Sp = [Integer[]] + M=Array{Integer,2}[]#unique(map(matriceAdj,S)) + #Ss = [] + if (true) + for i in 1:length(S) + if (sommeTour(W,S[i],opt)) + append!(idgood,i) + end + end + + end + for index in idgood + if !(matriceAdj(S[index]) in M) + append!(M,[matriceAdj(S[index])]) + append!(Sp,[S[index]]) + end + end + println("Circuits optimaux : ") + for i in 1:length(Sp) + if length(Sp[i]) != 0 + println(Sp[i]) + end + end + #print(idgood) + return +end + +function sommeTour(W,L,opt) + somme = 0 + n = length(L) + for i in 1:(n-1) + somme+= W[L[i] ,L[i+1]] + end + somme+= W[L[n],L[1]] + return (somme==opt) +end +function matriceAdj(L) + n = length(L) + Madj = zeros(Integer,n,n) + for i in 1:(n-1) + Madj[L[i],L[i+1]] = 1 + Madj[L[i+1],L[i]] = 1 + end + Madj[L[n],L[1]] = 1 + Madj[L[1],L[n]] = 1 + return Madj +end +W = [ + 0 8 4 15 15 3 ; + 8 0 5 15 2 15 ; + 4 5 0 6 15 15 ; + 15 15 6 0 5 3 ; + 15 2 15 5 0 4 ; + 3 15 15 3 4 0 + ] +n1=size(W,1) +W2 = [ + 0 15 0 0 15 15 15 ; + 15 0 1 15 0 15 1 ; + 0 1 0 15 15 15 1 ; + 0 15 15 0 1 1 15 ; + 15 0 15 1 0 1 15 ; + 15 15 15 1 1 0 0 ; + 15 1 1 15 15 0 0 ; + ] +n2 = size(W2,1) + +getPath(W,n1,dp_held_karp(W,n1)) +getPath(W2,n2,dp_held_karp(W2,n2)) \ No newline at end of file