From a842ee979433bccafa4437b2bc5a3582bf7459a2 Mon Sep 17 00:00:00 2001 From: Jivan <137729176+Jivanjamadar@users.noreply.github.com> Date: Mon, 21 Oct 2024 14:06:21 +0530 Subject: [PATCH 1/2] Add files via upload --- Backtracking/held_karp.js | 47 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 Backtracking/held_karp.js diff --git a/Backtracking/held_karp.js b/Backtracking/held_karp.js new file mode 100644 index 0000000000..ab78277b9c --- /dev/null +++ b/Backtracking/held_karp.js @@ -0,0 +1,47 @@ +/* +Held-karp algorithm (https://en.wikipedia.org/wiki/Held-Karp_algorithm) + +- Held-karp algorithm solve TSP problem using dynamic programming paradigm. +- It computes the minimum cost to visit each city exactly once & return to start point. +considering all subsets of cities & using memoization. +- Comparing it with hamiltonian algo. vs Held-karp algo. ( n! vs ~2^n ) this is more efficient. + +*/ + +function heldKarp(dist) { + const n = dist.length; + const memo = Array.from({ length: n }, () => Array(1 << n).fill(null)); + + // Base case: distance from the starting point to itself is 0 + for (let i = 0; i < n; i++) { + memo[i][1 << i] = dist[i][0]; + } + + // Iterate through all subsets of vertices + for (let mask = 0; mask < (1 << n); mask++) { + for (let u = 0; u < n; u++) { + if (!(mask & (1 << u))) continue; // u must be in the subset + // Iterate through all vertices to find the minimum cost + for (let v = 0; v < n; v++) { + if (mask & (1 << v) || u === v) continue; // v must not be in the subset + const newMask = mask | (1 << v); + const newCost = memo[u][mask] + dist[u][v]; + + if (memo[v][newMask] === null || newCost < memo[v][newMask]) { + memo[v][newMask] = newCost; + } + } + } + } + + // Get the minimum cost to complete the tour + let minCost = Infinity; + for (let u = 1; u < n; u++) { + const cost = memo[u][(1 << n) - 1] + dist[u][0]; + minCost = Math.min(minCost, cost); + } + + return minCost; +} + +module.exports = { heldKarp }; From 36d6f286e79e2c1f5056700d34b080cba9d80bb9 Mon Sep 17 00:00:00 2001 From: Jivan <137729176+Jivanjamadar@users.noreply.github.com> Date: Mon, 21 Oct 2024 14:06:46 +0530 Subject: [PATCH 2/2] Add files via upload --- Backtracking/tests/held_karp.test.js | 62 ++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 Backtracking/tests/held_karp.test.js diff --git a/Backtracking/tests/held_karp.test.js b/Backtracking/tests/held_karp.test.js new file mode 100644 index 0000000000..fcb4fa8e1e --- /dev/null +++ b/Backtracking/tests/held_karp.test.js @@ -0,0 +1,62 @@ + + +const { heldKarp } = require('../held_karp'); + +const distanceMatrix1 = [ + [0, 10, 15, 20], + [10, 0, 35, 25], + [15, 35, 0, 30], + [20, 25, 30, 0] +]; +console.log("Test Case 1 - Minimum cost of visiting all cities:", heldKarp(distanceMatrix1)); + +const distanceMatrix2 = [ + [0, 5, 10], + [5, 0, 15], + [10, 15, 0] +]; +console.log("Test Case 2 - Minimum cost of visiting all cities:", heldKarp(distanceMatrix2)); + +const distanceMatrix3 = [ + [0, 10, 15, 20, 25], + [10, 0, 35, 25, 30], + [15, 35, 0, 30, 20], + [20, 25, 30, 0, 10], + [25, 30, 20, 10, 0] +]; +console.log("Test Case 3 - Minimum cost of visiting all cities:", heldKarp(distanceMatrix3)); + +const distanceMatrix4 = [ + [0] +]; +console.log("Test Case 4 - Minimum cost of visiting all cities:", heldKarp(distanceMatrix4)); + +const distanceMatrix5 = [ + [0, 5], + [5, 0] +]; +console.log("Test Case 5 - Minimum cost of visiting all cities:", heldKarp(distanceMatrix5)); + +const distanceMatrix6 = [ + [0, 1, 1, 1], + [1, 0, 1, 1], + [1, 1, 0, 1], + [1, 1, 1, 0] +]; +console.log("Test Case 6 - Minimum cost of visiting all cities:", heldKarp(distanceMatrix6)); + +const distanceMatrix7 = [ + [0, 10, 20, 30], + [5, 0, 15, 25], + [10, 5, 0, 20], + [20, 15, 10, 0] +]; +console.log("Test Case 7 - Minimum cost of visiting all cities:", heldKarp(distanceMatrix7)); + +const distanceMatrix8 = [ + [0, 1000, 2000, 3000], + [1000, 0, 1500, 2500], + [2000, 1500, 0, 3500], + [3000, 2500, 3500, 0] +]; +console.log("Test Case 8 - Minimum cost of visiting all cities:", heldKarp(distanceMatrix8));