{"data":{"allMarkdownRemark":{"edges":[{"node":{"frontmatter":{"order":1,"friendlyName":"Current Cost","solverKey":"currentCost","type":"bounding-strategy","defaults":{"evaluatingDetailLevel":2,"maxEvaluatingDetailLevel":2}},"html":"<h1>Current Cost</h1>\n<p>Even more naive than Cheapest Edges, in this strategy, the current lower bound for each node is set to the current cost of the path to\nthat node. This works because if a city were to be appended to the path after this node, the path distance\nafter the addition must be at least as long as after the addition, therefore the current distance to\nthe node can act as a very naive lower bound.</p>"}},{"node":{"frontmatter":{"order":1,"friendlyName":"Cheapest Edges","solverKey":"cheapestEdges","type":"bounding-strategy","defaults":{"evaluatingDetailLevel":2,"maxEvaluatingDetailLevel":2}},"html":"<h1>Cheapest Edges</h1>\n<p>In this naive approach to relaxing the traveling salesman problem, the TSP is relaxed so that the graph resulting from this algorithm does not need to result in a single cycle. Furthermore, the resulting graph does not need to be complete, in other words not all nodes need to be connected to another node. The only requirement is to create a path that has as many edges as there are nodes to be visited n. To find the minimum distance for this path, simply sort the list of all edges by distance, then select the n edges with the lowest distance and calculate the sum of the distance costs of these edges. </p>\n<h2>Implementation</h2>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token function\">calculateLowerBound</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">costToPoint<span class=\"token punctuation\">,</span> pathIncludingPoint<span class=\"token punctuation\">,</span> points<span class=\"token punctuation\">,</span> boundingStrategy<span class=\"token punctuation\">,</span> edges</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>boundingStrategy <span class=\"token operator\">===</span> <span class=\"token string\">\"cheapestEdges\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>pathIncludingPoint<span class=\"token punctuation\">.</span>length <span class=\"token operator\">===</span> points<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> costToPoint<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token comment\">// Add the cheapest edges that are not yet part of the given path, </span>\n    <span class=\"token comment\">// until as many edges have been selected as there are nodes. </span>\n    <span class=\"token keyword\">let</span> cheapestEdgesLowerBound <span class=\"token operator\">=</span> costToPoint<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> edgesToAdd <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>points<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> <span class=\"token punctuation\">(</span>pathIncludingPoint<span class=\"token punctuation\">.</span>length <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> startCheckingHere <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> edgesCopy <span class=\"token operator\">=</span> edges<span class=\"token punctuation\">.</span><span class=\"token function\">copy</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> nextEdge<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>edgesToAdd <span class=\"token operator\">!==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      nextEdge <span class=\"token operator\">=</span> edgesCopy<span class=\"token punctuation\">.</span><span class=\"token function\">pop</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token function\">containsEdge</span><span class=\"token punctuation\">(</span>pathIncludingPoint<span class=\"token punctuation\">,</span> nextEdge<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        cheapestEdgesLowerBound <span class=\"token operator\">+=</span> nextEdge<span class=\"token punctuation\">.</span>cost<span class=\"token punctuation\">;</span> \n        edgesToAdd<span class=\"token operator\">--</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> cheapestEdgesLowerBound<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span></code></pre></div>"}},{"node":{"frontmatter":{"order":1,"friendlyName":"1-Tree (Kruskal)","solverKey":"oneTree","type":"bounding-strategy","defaults":{"evaluatingDetailLevel":2,"maxEvaluatingDetailLevel":2}},"html":"<h1>1-Tree (Kruskal)</h1>\n<p>One approach that does come closer to the optimum solution is to use a 1-tree, formed\nincluding the path to the current node, as the lower bound. This 1-tree is the answer to\na relaxation problem which requires a graph that is complete and includes a single cycle,\nbut does not require that all nodes be visited exactly once, which means that not all nodes\nneed to be part of this single cycle (although they can be) [4].</p>\n<p>One way to begin the process of creating a 1-tree is via Kruskal’s Algorithm, a type of\ngreedy algorithm which outputs a minimum spanning tree. This minimum spanning tree is by definition the combination of those edges which results in a complete graph at\nthe lowest distance. This graph can then be expanded upon to create a 1-tree by simply\nadding a single edge (the next cheapest edge) to create the required cycle.</p>\n<p>The input of Kruskal’s algorithm requires an undirected and weighted graph environment.\nThis is achieved in the TSP with the distance as the weight for each edge and, since the\ncost of each edge is considered in this example to be equal in both directions (Berlin to\nMunich is the same distance as Munich to Berlin), graphs resulting from this problem are\nalso undirected. As stated previously, the resulting output of this algorithm is a minimum\nspanning tree. To achieve a minimum spanning tree with one cycle, the shortest path\nfrom one city to another that is not currently included in the spanning tree is added to\nthe graph</p>\n<p>To calculate the lower bound with Kruskal for a path that already includes more than one\ncity, the start and end points of the path as well as any nodes in the cities to be visited which are\nnot already part of the path are used to construct an MST with Kruskal.</p>\n<h2>Implementation</h2>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token function\">calculateLowerBound</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">costToPoint<span class=\"token punctuation\">,</span> pathIncludingPoint<span class=\"token punctuation\">,</span> points<span class=\"token punctuation\">,</span> boundingStrategy<span class=\"token punctuation\">,</span> edges</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>pathIncludingPoint<span class=\"token punctuation\">.</span>length <span class=\"token operator\">===</span> points<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> costToPoint<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token comment\">// this implementation of Kruskal uses a simplified union/find tactic</span>\n    <span class=\"token keyword\">let</span> oneTreeLowerBound <span class=\"token operator\">=</span> costToPoint<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> edgesToAdd <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>points<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> <span class=\"token punctuation\">(</span>pathIncludingPoint<span class=\"token punctuation\">.</span>length <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> edgesCopy <span class=\"token operator\">=</span> edges<span class=\"token punctuation\">.</span><span class=\"token function\">copy</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> currentEdge <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> pointsToBuildMST <span class=\"token operator\">=</span> <span class=\"token function\">selectMSTPoints</span><span class=\"token punctuation\">(</span>pathIncludingPoint<span class=\"token punctuation\">,</span> points<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> pointToIndexMap <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">// save the values of pointsToBuild in a map, index -> point</span>\n    pointsToBuildMST<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">point<span class=\"token punctuation\">,</span> index</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> pointToIndexMap<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>point<span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">','</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> index<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> groupRepArray <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">// initialize the group representative for each point to be included in the MST. At the start, every point is its own representative</span>\n    pointsToBuildMST<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">point<span class=\"token punctuation\">,</span> index</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> groupRepArray<span class=\"token punctuation\">[</span>index<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> index<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">let</span> counter <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>edgesToAdd <span class=\"token operator\">!==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      counter<span class=\"token operator\">++</span><span class=\"token punctuation\">;</span>\n      currentEdge <span class=\"token operator\">=</span> edgesCopy<span class=\"token punctuation\">.</span><span class=\"token function\">pop</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token function\">edgeIncludesForbiddenPoint</span><span class=\"token punctuation\">(</span>pointsToBuildMST<span class=\"token punctuation\">,</span> currentEdge<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// in this case, the currentEdge contains at least one point on the inner part of the current path, which we don't want to use for the MST.</span>\n        <span class=\"token keyword\">continue</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n      <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>pathIncludingPoint<span class=\"token punctuation\">.</span>length <span class=\"token operator\">===</span> <span class=\"token number\">2</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token function\">containsEdge</span><span class=\"token punctuation\">(</span>pathIncludingPoint<span class=\"token punctuation\">,</span> currentEdge<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// edge case: even though we would normally ignore the portion of the current path between the start and end node by not including these points in the creation of the MST, in the case of the current path containing just two nodes, this edge needs to be manually ignored.</span>\n        <span class=\"token keyword\">continue</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n      <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token function\">nodesAreConnected</span><span class=\"token punctuation\">(</span>currentEdge<span class=\"token punctuation\">,</span> groupRepArray<span class=\"token punctuation\">,</span> pointToIndexMap<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// nodes have the same group rep and are therefore connected through some path already. Adding this edge would create a cycle, which we don't want!</span>\n          <span class=\"token keyword\">continue</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n      <span class=\"token comment\">// updating one of the point's group rep to the point's group rep connects the two groups</span>\n      <span class=\"token function\">updateGroupReps</span><span class=\"token punctuation\">(</span>currentEdge<span class=\"token punctuation\">,</span> groupRepArray<span class=\"token punctuation\">,</span> pointToIndexMap<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token comment\">// add the edge to the mst, but we only need the lower bound, so just calculate this.</span>\n      <span class=\"token comment\">// currentEdge.lowerBound is actually the cost of the edge!</span>\n      oneTreeLowerBound <span class=\"token operator\">+=</span> currentEdge<span class=\"token punctuation\">.</span>lowerBound<span class=\"token punctuation\">;</span>\n      edgesToAdd<span class=\"token operator\">--</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> oneTreeLowerBound<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token comment\">// could add: boundingStrategy === \"oneTreeWithAscent\" </span>\n  <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>"}},{"node":{"frontmatter":{"order":1,"friendlyName":"Nearest Neighbor","solverKey":"nearestNeighbor","type":"initial-solution","defaults":{"evaluatingDetailLevel":1,"maxEvaluatingDetailLevel":1}},"html":"<h1>Nearest Neighbor</h1>\n<p>This is a heuristic, greedy algorithm also known as nearest neighbor. It continually chooses the best looking option from the current state.</p>\n<ol>\n<li>From the starting point</li>\n<li>sort the remaining available points based on cost (distance)</li>\n<li>Choose the closest point and go there</li>\n<li>Chosen point is no longer an \"available point\"</li>\n<li>Continue this way until there are no available points, and then return to the start.</li>\n</ol>\n<h2>Implementation</h2>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">nearestNeighbor</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token parameter\">points</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> path <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>points<span class=\"token punctuation\">.</span><span class=\"token function\">shift</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>points<span class=\"token punctuation\">.</span>length <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// sort remaining points in place by their</span>\n    <span class=\"token comment\">// distance from the last point in the current path</span>\n    points<span class=\"token punctuation\">.</span><span class=\"token function\">sort</span><span class=\"token punctuation\">(</span>\n      <span class=\"token punctuation\">(</span><span class=\"token parameter\">a<span class=\"token punctuation\">,</span> b</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span>\n        <span class=\"token function\">distance</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">[</span>path<span class=\"token punctuation\">.</span>length <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> <span class=\"token function\">distance</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">[</span>path<span class=\"token punctuation\">.</span>length <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> a<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// go to the closest remaining point</span>\n    path<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>points<span class=\"token punctuation\">.</span><span class=\"token function\">pop</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// return to start after visiting all other points</span>\n  path<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> cost <span class=\"token operator\">=</span> <span class=\"token function\">pathCost</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>"}},{"node":{"frontmatter":{"order":1,"friendlyName":"(none)","solverKey":"none","type":"initial-solution","defaults":{"evaluatingDetailLevel":2,"maxEvaluatingDetailLevel":2}},"html":"<h1>No Initial Solution</h1>\n<p>Having this option selected will effectively \"skip\" running any heuristic before running the Branch\nand Bound algorithm. This means that instead of calculating a reasonable upper bound, the upper\nbound will be set to infinity. </p>"}},{"node":{"frontmatter":{"order":1,"friendlyName":"Breadth First Search (FIFO)","solverKey":"fifo","type":"search-strategy","defaults":{"evaluatingDetailLevel":2,"maxEvaluatingDetailLevel":2}},"html":"<h1>Breadth First Search</h1>\n<p>A common counterpart to DFS, Breadth First Search (BFS) chooses the node which was first added to the list as the next node, hence it is also known as first in, first out (FIFO). New nodes are appended to the end of the problem list, and the next node is plucked from the front, creating a tree which grows level-by-level.</p>\n<p>For the branch and bound algorithm, this means that each time a new node should be added to a data structure for storage before it is explored, it is stored in a Queue. A new node can be stored at the end of the Queue as the new tail via the push function and the oldest node in the Queue can be removed from the start, or head, via push. </p>\n<h2>Implementation</h2>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Queue</span> <span class=\"token punctuation\">{</span>\n\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>last <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>size <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">node</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head <span class=\"token operator\">===</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head <span class=\"token operator\">=</span> node<span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>last <span class=\"token operator\">=</span> node<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">let</span> oldLast <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>last<span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>last <span class=\"token operator\">=</span> node<span class=\"token punctuation\">;</span>\n      oldLast<span class=\"token punctuation\">.</span>next <span class=\"token operator\">=</span> node<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> <span class=\"token operator\">++</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>size<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  \n  <span class=\"token function\">pop</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> prevHead <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head<span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">// queue has only one object and will be empty</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head <span class=\"token operator\">===</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>last<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> \n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>last <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head<span class=\"token punctuation\">.</span>next<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>size<span class=\"token operator\">--</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> prevHead<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>"}},{"node":{"frontmatter":{"order":1,"friendlyName":"Depth First Search (LIFO)","solverKey":"lifo","type":"search-strategy","defaults":{"evaluatingDetailLevel":2,"maxEvaluatingDetailLevel":2}},"html":"<h1>Depth First Search</h1>\n<p>When employing Depth-First Search (DFS), also known as last in, first out (LIFO), the node that was last added to the tree is chosen as the next to be explored. This leads to a tree where the depth is explored first.</p>\n<p>For the branch and bound algorithm, this means that each time a new node should be added to a data\nstructure for storage before it is explored, it is stored in a Stack. A new node can be stored at\nthe top of the Stack as the new head via the push function and removed from the Stack via pop. </p>\n<h2>Implementation</h2>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Stack</span> <span class=\"token punctuation\">{</span>\n\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>last <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>size <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">node</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head <span class=\"token operator\">===</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head <span class=\"token operator\">=</span> node<span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>last <span class=\"token operator\">=</span> node<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">let</span> oldHead <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head<span class=\"token punctuation\">;</span> \n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head <span class=\"token operator\">=</span> node<span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head<span class=\"token punctuation\">.</span>next <span class=\"token operator\">=</span> oldHead<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> <span class=\"token operator\">++</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>size<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">pop</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head <span class=\"token operator\">===</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span> \n      <span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> prevHead <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head<span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">// stack has only one object and will be empty</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head <span class=\"token operator\">===</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>last<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>last <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head<span class=\"token punctuation\">.</span>next<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>size<span class=\"token operator\">--</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> prevHead<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>"}},{"node":{"frontmatter":{"order":1,"friendlyName":"Minimum Lower Bound (MLB)","solverKey":"mlb","type":"search-strategy","defaults":{"evaluatingDetailLevel":2,"maxEvaluatingDetailLevel":2}},"html":"<h1>Minimum Lower Bound</h1>\n<p>A variant of Best First Search, in this strategy, the next node to be examined is always the node with the smallest lower bound. This is based on the idea that following the smallest lower bound might allow the algorithm to be more likely to reach the actual optimum more quickly than other search strategies. When using this search strategy, there is a possibility for memory problems when compared to DFS/LIFO, however, the first incumbent solution found is generally close to the final optimum</p>\n<p>In the context of the branch and bound algorithm, this means that each time a new node should be added to a data structure for storage before it is explored, it is stored in a PriorityQueue. A new node can be sorted into the the Priority Queue based on its lower bound value via the push function. The pop function provides the node with the lowest lower bound before removing it from the Priority Queue. </p>\n<h2>Implementation</h2>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">PriorityQueue</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>last <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>size <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">node</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// case: pq is empty</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head <span class=\"token operator\">===</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head <span class=\"token operator\">=</span> node<span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>last <span class=\"token operator\">=</span> node<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token comment\">// case: pq has one entry. Insert node either before or after node and update head/last accordingly</span>\n    <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head <span class=\"token operator\">===</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>last<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head<span class=\"token punctuation\">.</span>lowerBound <span class=\"token operator\">&lt;</span> node<span class=\"token punctuation\">.</span>lowerBound<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head<span class=\"token punctuation\">.</span>next <span class=\"token operator\">=</span> node<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>last <span class=\"token operator\">=</span> node<span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">let</span> prevHead <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head <span class=\"token operator\">=</span> node\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head<span class=\"token punctuation\">.</span>next <span class=\"token operator\">=</span> prevHead\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>last <span class=\"token operator\">=</span> prevHead\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token comment\">// case: pq has more than one entry. find before insertion point. edge cases: insertion point is head/last</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">let</span> beforeInsert <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head<span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">let</span> afterInsert <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head<span class=\"token punctuation\">.</span>next<span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">let</span> headsOrTails <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">while</span><span class=\"token punctuation\">(</span>afterInsert <span class=\"token operator\">!==</span> <span class=\"token keyword\">null</span> <span class=\"token operator\">&amp;&amp;</span> afterInsert<span class=\"token punctuation\">.</span>lowerBound <span class=\"token operator\">&lt;</span> node<span class=\"token punctuation\">.</span>lowerBound<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        beforeInsert <span class=\"token operator\">=</span> beforeInsert<span class=\"token punctuation\">.</span>next<span class=\"token punctuation\">;</span>\n        afterInsert <span class=\"token operator\">=</span> afterInsert<span class=\"token punctuation\">.</span>next<span class=\"token punctuation\">;</span>\n        <span class=\"token operator\">++</span>headsOrTails<span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>headsOrTails <span class=\"token operator\">===</span> <span class=\"token number\">0</span> <span class=\"token operator\">&amp;&amp;</span> beforeInsert<span class=\"token punctuation\">.</span>lowerBound <span class=\"token operator\">></span> node<span class=\"token punctuation\">.</span>lowerBound<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head <span class=\"token operator\">=</span> node<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head<span class=\"token punctuation\">.</span>next <span class=\"token operator\">=</span> beforeInsert<span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>headsOrTails <span class=\"token operator\">===</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>size <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        beforeInsert<span class=\"token punctuation\">.</span>next <span class=\"token operator\">=</span> node<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>last <span class=\"token operator\">=</span> node<span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n        beforeInsert<span class=\"token punctuation\">.</span>next <span class=\"token operator\">=</span> node<span class=\"token punctuation\">;</span>\n        node<span class=\"token punctuation\">.</span>next <span class=\"token operator\">=</span> afterInsert<span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> <span class=\"token operator\">++</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>size<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">pop</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> prevHead <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head <span class=\"token operator\">===</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span>\n      <span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">// priority queue has only one object and will be empty</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head <span class=\"token operator\">===</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>last<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>last <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>  \n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head<span class=\"token punctuation\">.</span>next<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>size<span class=\"token operator\">--</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> prevHead<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">copy</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> priorityQueueCopy <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">PriorityQueue</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> nodeToCopy <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">while</span><span class=\"token punctuation\">(</span>nodeToCopy <span class=\"token operator\">!==</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      priorityQueueCopy<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>nodeToCopy<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      nodeToCopy <span class=\"token operator\">=</span> nodeToCopy<span class=\"token punctuation\">.</span>next<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    priorityQueueCopy<span class=\"token punctuation\">.</span>head <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>head<span class=\"token punctuation\">;</span>\n    priorityQueueCopy<span class=\"token punctuation\">.</span>last <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>last<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> priorityQueueCopy<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>"}},{"node":{"frontmatter":{"order":2,"friendlyName":"Arbitrary Insertion","solverKey":"arbitraryInsertion","type":"initial-solution","defaults":{"evaluatingDetailLevel":1,"maxEvaluatingDetailLevel":1}},"html":"<h1>Arbitrary Insertion</h1>\n<p>This is a heuristic construction algorithm. It select a random point, and then figures out where the best place to put it will be.</p>\n<ol>\n<li>From the starting point</li>\n<li>First, go to the closest point</li>\n<li>Choose a random point to go to</li>\n<li>Find the cheapest place to add it in the path</li>\n<li>Chosen point is no longer an \"available point\"</li>\n<li>Continue from #3 until there are no available points, and then return to the start.</li>\n</ol>\n<h2>Implementation</h2>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">arbitraryInsertion</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token parameter\">points</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// from the starting point</span>\n  <span class=\"token keyword\">const</span> path <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>points<span class=\"token punctuation\">.</span><span class=\"token function\">shift</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">//</span>\n  <span class=\"token comment\">// INITIALIZATION - go to the nearest point</span>\n  <span class=\"token comment\">//</span>\n  points<span class=\"token punctuation\">.</span><span class=\"token function\">sort</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">a<span class=\"token punctuation\">,</span> b</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">distance</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> <span class=\"token function\">distance</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> a<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  path<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>points<span class=\"token punctuation\">.</span><span class=\"token function\">pop</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// randomly sort points - this is the order they will be added</span>\n  <span class=\"token comment\">// to the path</span>\n  points<span class=\"token punctuation\">.</span><span class=\"token function\">sort</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> <span class=\"token number\">0.5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>points<span class=\"token punctuation\">.</span>length <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">//</span>\n    <span class=\"token comment\">// SELECTION - choose a next point randomly</span>\n    <span class=\"token comment\">//</span>\n    <span class=\"token keyword\">const</span> nextPoint <span class=\"token operator\">=</span> points<span class=\"token punctuation\">.</span><span class=\"token function\">pop</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">//</span>\n    <span class=\"token comment\">// INSERTION -find the insertion spot that minimizes distance</span>\n    <span class=\"token comment\">//</span>\n    <span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>bestCost<span class=\"token punctuation\">,</span> bestIdx<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">Infinity</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> path<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">const</span> insertionCost <span class=\"token operator\">=</span> <span class=\"token function\">pathCost</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>path<span class=\"token punctuation\">[</span>i <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> nextPoint<span class=\"token punctuation\">,</span> path<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>insertionCost <span class=\"token operator\">&lt;</span> bestCost<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token punctuation\">[</span>bestCost<span class=\"token punctuation\">,</span> bestIdx<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>insertionCost<span class=\"token punctuation\">,</span> i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n    path<span class=\"token punctuation\">.</span><span class=\"token function\">splice</span><span class=\"token punctuation\">(</span>bestIdx<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> nextPoint<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// return to start after visiting all other points</span>\n  path<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>"}},{"node":{"frontmatter":{"order":3,"friendlyName":"Nearest Insertion","solverKey":"nearestInsertion","type":"initial-solution","defaults":{"evaluatingDetailLevel":1,"maxEvaluatingDetailLevel":1}},"html":"<h1>Nearest Insertion</h1>\n<p>This is a heuristic construction algorithm. It selects the closest point to the path, and then figures out where the best place to put it will be.</p>\n<ol>\n<li>From the starting point</li>\n<li>First, go to the closest point</li>\n<li>Choose the point that is <strong>nearest</strong> to the current path</li>\n<li>Find the cheapest place to add it in the path</li>\n<li>Chosen point is no longer an \"available point\"</li>\n<li>Continue from #3 until there are no available points, and then return to the start.</li>\n</ol>\n<h2>Implementation</h2>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">nearestInsertion</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token parameter\">points</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// from the starting point</span>\n  <span class=\"token keyword\">const</span> path <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>points<span class=\"token punctuation\">.</span><span class=\"token function\">shift</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">//</span>\n  <span class=\"token comment\">// INITIALIZATION - go to the nearest point first</span>\n  <span class=\"token comment\">//</span>\n  points<span class=\"token punctuation\">.</span><span class=\"token function\">sort</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">a<span class=\"token punctuation\">,</span> b</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">distance</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> <span class=\"token function\">distance</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> a<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  path<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>points<span class=\"token punctuation\">.</span><span class=\"token function\">pop</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>points<span class=\"token punctuation\">.</span>length <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">//</span>\n    <span class=\"token comment\">// SELECTION - nearest point to the path</span>\n    <span class=\"token comment\">//</span>\n    <span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>selectedDistance<span class=\"token punctuation\">,</span> selectedIdx<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">Infinity</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>freePointIdx<span class=\"token punctuation\">,</span> freePoint<span class=\"token punctuation\">]</span> <span class=\"token keyword\">of</span> points<span class=\"token punctuation\">.</span><span class=\"token function\">entries</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">const</span> pathPoint <span class=\"token keyword\">of</span> path<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">const</span> dist <span class=\"token operator\">=</span> <span class=\"token function\">distance</span><span class=\"token punctuation\">(</span>freePoint<span class=\"token punctuation\">,</span> pathPoint<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>dist <span class=\"token operator\">&lt;</span> selectedDistance<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token punctuation\">[</span>selectedDistance<span class=\"token punctuation\">,</span> selectedIdx<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>dist<span class=\"token punctuation\">,</span> freePointIdx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// get the next point to add</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>nextPoint<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> points<span class=\"token punctuation\">.</span><span class=\"token function\">splice</span><span class=\"token punctuation\">(</span>selectedIdx<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">//</span>\n    <span class=\"token comment\">// INSERTION - find the insertion spot that minimizes distance</span>\n    <span class=\"token comment\">//</span>\n    <span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>bestCost<span class=\"token punctuation\">,</span> bestIdx<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">Infinity</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> path<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">const</span> insertionCost <span class=\"token operator\">=</span> <span class=\"token function\">pathCost</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>path<span class=\"token punctuation\">[</span>i <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> nextPoint<span class=\"token punctuation\">,</span> path<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>insertionCost <span class=\"token operator\">&lt;</span> bestCost<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token punctuation\">[</span>bestCost<span class=\"token punctuation\">,</span> bestIdx<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>insertionCost<span class=\"token punctuation\">,</span> i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n    path<span class=\"token punctuation\">.</span><span class=\"token function\">splice</span><span class=\"token punctuation\">(</span>bestIdx<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> nextPoint<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// return to start after visiting all other points</span>\n  path<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>"}},{"node":{"frontmatter":{"order":4,"friendlyName":"Farthest Insertion","solverKey":"farthestInsertion","type":"initial-solution","defaults":{"evaluatingDetailLevel":1,"maxEvaluatingDetailLevel":1}},"html":"<h1>Farthest Insertion</h1>\n<p>This is a heuristic construction algorithm. It selects the farthest point from the path, and then figures out where the best place to put it will be.</p>\n<ol>\n<li>From the starting point</li>\n<li>First, go to the closest point</li>\n<li>Choose the point that is farthest from any of the points on the path</li>\n<li>Find the cheapest place to add it in the path</li>\n<li>Chosen point is no longer an \"available point\"</li>\n<li>Continue from #3 until there are no available points, and then return to the start.</li>\n</ol>\n<h2>Implementation</h2>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">farthestInsertion</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token parameter\">points</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// from the starting point</span>\n  <span class=\"token keyword\">const</span> path <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>points<span class=\"token punctuation\">.</span><span class=\"token function\">shift</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">//</span>\n  <span class=\"token comment\">// INITIALIZATION - go to the nearest point first</span>\n  <span class=\"token comment\">//</span>\n  points<span class=\"token punctuation\">.</span><span class=\"token function\">sort</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">a<span class=\"token punctuation\">,</span> b</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">distance</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> <span class=\"token function\">distance</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> a<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  path<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>points<span class=\"token punctuation\">.</span><span class=\"token function\">pop</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>points<span class=\"token punctuation\">.</span>length <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">//</span>\n    <span class=\"token comment\">// SELECTION - farthest point from the path</span>\n    <span class=\"token comment\">//</span>\n    <span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>selectedDistance<span class=\"token punctuation\">,</span> selectedIdx<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>freePointIdx<span class=\"token punctuation\">,</span> freePoint<span class=\"token punctuation\">]</span> <span class=\"token keyword\">of</span> points<span class=\"token punctuation\">.</span><span class=\"token function\">entries</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// find the minimum distance to the path for freePoint</span>\n      <span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>bestCostToPath<span class=\"token punctuation\">,</span> costToPathIdx<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">Infinity</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">const</span> pathPoint <span class=\"token keyword\">of</span> path<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">const</span> dist <span class=\"token operator\">=</span> <span class=\"token function\">distance</span><span class=\"token punctuation\">(</span>freePoint<span class=\"token punctuation\">,</span> pathPoint<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>dist <span class=\"token operator\">&lt;</span> bestCostToPath<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token punctuation\">[</span>bestCostToPath<span class=\"token punctuation\">,</span> costToPathIdx<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>dist<span class=\"token punctuation\">,</span> freePointIdx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">}</span>\n\n      <span class=\"token comment\">// if this point is further from the path than the currently selected</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>bestCostToPath <span class=\"token operator\">></span> selectedDistance<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token punctuation\">[</span>selectedDistance<span class=\"token punctuation\">,</span> selectedIdx<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>bestCostToPath<span class=\"token punctuation\">,</span> costToPathIdx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>nextPoint<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> points<span class=\"token punctuation\">.</span><span class=\"token function\">splice</span><span class=\"token punctuation\">(</span>selectedIdx<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">//</span>\n    <span class=\"token comment\">// INSERTION - find the insertion spot that minimizes distance</span>\n    <span class=\"token comment\">//</span>\n    <span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>bestCost<span class=\"token punctuation\">,</span> bestIdx<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">Infinity</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> path<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">const</span> insertionCost <span class=\"token operator\">=</span> <span class=\"token function\">pathCost</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>path<span class=\"token punctuation\">[</span>i <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> nextPoint<span class=\"token punctuation\">,</span> path<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>insertionCost <span class=\"token operator\">&lt;</span> bestCost<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token punctuation\">[</span>bestCost<span class=\"token punctuation\">,</span> bestIdx<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>insertionCost<span class=\"token punctuation\">,</span> i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n    path<span class=\"token punctuation\">.</span><span class=\"token function\">splice</span><span class=\"token punctuation\">(</span>bestIdx<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> nextPoint<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// return to start after visiting all other points</span>\n  path<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>"}},{"node":{"frontmatter":{"order":5,"friendlyName":"Convex Hull","solverKey":"convexHull","type":"initial-solution","defaults":{"evaluatingDetailLevel":2,"maxEvaluatingDetailLevel":2}},"html":"<h1>Convex Hull</h1>\n<p>This is a heuristic construction algorithm. It starts by building the <a href=\"https://en.wikipedia.org/wiki/Convex_hull\">convex hull</a>, and adding interior points from there. This implmentation uses another heuristic for insertion based on the ratio of the cost of adding the new point to the overall length of the segment, however any insertion algorithm could be applied after building the hull.</p>\n<p>There are a number of algorithms to determine the convex hull. This implementation uses the <a href=\"https://en.wikipedia.org/wiki/Gift_wrapping_algorithm\">gift wrapping algorithm</a>.</p>\n<p>In essence, the steps are:</p>\n<ol>\n<li>Determine the leftmost point</li>\n<li>Continually add the most counterclockwise point until the convex hull is formed</li>\n<li>For each remaining point p, find the segment i => j in the hull that minimizes cost(i -> p) + cost(p -> j) - cost(i -> j)</li>\n<li>Of those, choose p that minimizes cost(i -> p -> j) / cost(i -> j)</li>\n<li>Add p to the path between i and j</li>\n<li>Repeat from #3 until there are no remaining points</li>\n</ol>\n<h2>Implementation</h2>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">convexHull</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token parameter\">points</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> sp <span class=\"token operator\">=</span> points<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// Find the \"left most point\"</span>\n  <span class=\"token keyword\">let</span> leftmost <span class=\"token operator\">=</span> points<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">const</span> p <span class=\"token keyword\">of</span> points<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">&lt;</span> leftmost<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      leftmost <span class=\"token operator\">=</span> p<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">const</span> path <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>leftmost<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> curPoint <span class=\"token operator\">=</span> path<span class=\"token punctuation\">[</span>path<span class=\"token punctuation\">.</span>length <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>selectedIdx<span class=\"token punctuation\">,</span> selectedPoint<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// find the \"most counterclockwise\" point</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>idx<span class=\"token punctuation\">,</span> p<span class=\"token punctuation\">]</span> <span class=\"token keyword\">of</span> points<span class=\"token punctuation\">.</span><span class=\"token function\">entries</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>selectedPoint <span class=\"token operator\">||</span> <span class=\"token function\">orientation</span><span class=\"token punctuation\">(</span>curPoint<span class=\"token punctuation\">,</span> p<span class=\"token punctuation\">,</span> selectedPoint<span class=\"token punctuation\">)</span> <span class=\"token operator\">===</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// this point is counterclockwise with respect to the current hull</span>\n        <span class=\"token comment\">// and selected point (e.g. more counterclockwise)</span>\n        <span class=\"token punctuation\">[</span>selectedIdx<span class=\"token punctuation\">,</span> selectedPoint<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>idx<span class=\"token punctuation\">,</span> p<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// adding this to the hull so it's no longer available</span>\n    points<span class=\"token punctuation\">.</span><span class=\"token function\">splice</span><span class=\"token punctuation\">(</span>selectedIdx<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// back to the furthest left point, formed a cycle, break</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>selectedPoint <span class=\"token operator\">===</span> leftmost<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// add to hull</span>\n    path<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>selectedPoint<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>points<span class=\"token punctuation\">.</span>length <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>bestRatio<span class=\"token punctuation\">,</span> bestPointIdx<span class=\"token punctuation\">,</span> insertIdx<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">Infinity</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>freeIdx<span class=\"token punctuation\">,</span> freePoint<span class=\"token punctuation\">]</span> <span class=\"token keyword\">of</span> points<span class=\"token punctuation\">.</span><span class=\"token function\">entries</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// for every free point, find the point in the current path</span>\n      <span class=\"token comment\">// that minimizes the cost of adding the point minus the cost of</span>\n      <span class=\"token comment\">// the original segment</span>\n      <span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>bestCost<span class=\"token punctuation\">,</span> bestIdx<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">Infinity</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> <span class=\"token punctuation\">[</span>pathIdx<span class=\"token punctuation\">,</span> pathPoint<span class=\"token punctuation\">]</span> <span class=\"token keyword\">of</span> path<span class=\"token punctuation\">.</span><span class=\"token function\">entries</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">const</span> nextPathPoint <span class=\"token operator\">=</span> path<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span>pathIdx <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> path<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// the new cost minus the old cost</span>\n        <span class=\"token keyword\">const</span> evalCost <span class=\"token operator\">=</span>\n          <span class=\"token function\">pathCost</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>pathPoint<span class=\"token punctuation\">,</span> freePoint<span class=\"token punctuation\">,</span> nextPathPoint<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span>\n          <span class=\"token function\">pathCost</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>pathPoint<span class=\"token punctuation\">,</span> nextPathPoint<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>evalCost <span class=\"token operator\">&lt;</span> bestCost<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token punctuation\">[</span>bestCost<span class=\"token punctuation\">,</span> bestIdx<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>evalCost<span class=\"token punctuation\">,</span> pathIdx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">}</span>\n\n      <span class=\"token comment\">// figure out how \"much\" more expensive this is with respect to the</span>\n      <span class=\"token comment\">// overall length of the segment</span>\n      <span class=\"token keyword\">const</span> nextPoint <span class=\"token operator\">=</span> path<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span>bestIdx <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> path<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">const</span> prevCost <span class=\"token operator\">=</span> <span class=\"token function\">pathCost</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>path<span class=\"token punctuation\">[</span>bestIdx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> nextPoint<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">const</span> newCost <span class=\"token operator\">=</span> <span class=\"token function\">pathCost</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>path<span class=\"token punctuation\">[</span>bestIdx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> freePoint<span class=\"token punctuation\">,</span> nextPoint<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">const</span> ratio <span class=\"token operator\">=</span> newCost <span class=\"token operator\">/</span> prevCost<span class=\"token punctuation\">;</span>\n\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>ratio <span class=\"token operator\">&lt;</span> bestRatio<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token punctuation\">[</span>bestRatio<span class=\"token punctuation\">,</span> bestPointIdx<span class=\"token punctuation\">,</span> insertIdx<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>ratio<span class=\"token punctuation\">,</span> freeIdx<span class=\"token punctuation\">,</span> bestIdx <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>nextPoint<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> points<span class=\"token punctuation\">.</span><span class=\"token function\">splice</span><span class=\"token punctuation\">(</span>bestPointIdx<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    path<span class=\"token punctuation\">.</span><span class=\"token function\">splice</span><span class=\"token punctuation\">(</span>insertIdx<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> nextPoint<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// rotate the array so that starting point is back first</span>\n  <span class=\"token keyword\">const</span> startIdx <span class=\"token operator\">=</span> path<span class=\"token punctuation\">.</span><span class=\"token function\">findIndex</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">p</span> <span class=\"token operator\">=></span> p <span class=\"token operator\">===</span> sp<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  path<span class=\"token punctuation\">.</span><span class=\"token function\">unshift</span><span class=\"token punctuation\">(</span><span class=\"token operator\">...</span>path<span class=\"token punctuation\">.</span><span class=\"token function\">splice</span><span class=\"token punctuation\">(</span>startIdx<span class=\"token punctuation\">,</span> path<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// go back home</span>\n  path<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>sp<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>"}},{"node":{"frontmatter":{"order":6,"friendlyName":"Simulated Annealing","solverKey":"simulatedAnnealing","type":"initial-solution","defaults":{"evaluatingDetailLevel":1,"maxEvaluatingDetailLevel":1}},"html":"<h1>Simulated Annealing</h1>\n<p>Simulated annealing (SA) is a probabilistic technique for approximating the global optimum of a given function. Specifically, it is a metaheuristic to approximate global optimization in a large search space for an optimization problem.</p>\n<p>For problems where finding an approximate global optimum is more important than finding a precise local optimum in a fixed amount of time, simulated annealing may be preferable to exact algorithms</p>\n<h2>Implementation</h2>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">simulatedAnnealing</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token parameter\">points</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> sp <span class=\"token operator\">=</span> points<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> path <span class=\"token operator\">=</span> points<span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> tempCoeff <span class=\"token operator\">=</span>\n    path<span class=\"token punctuation\">.</span>length <span class=\"token operator\">&lt;</span> <span class=\"token number\">10</span>\n      <span class=\"token operator\">?</span> <span class=\"token number\">1</span> <span class=\"token operator\">-</span> <span class=\"token number\">1e-4</span>\n      <span class=\"token operator\">:</span> path<span class=\"token punctuation\">.</span>length <span class=\"token operator\">&lt;</span> <span class=\"token number\">15</span>\n      <span class=\"token operator\">?</span> <span class=\"token number\">1</span> <span class=\"token operator\">-</span> <span class=\"token number\">1e-5</span>\n      <span class=\"token operator\">:</span> path<span class=\"token punctuation\">.</span>length <span class=\"token operator\">&lt;</span> <span class=\"token number\">25</span>\n      <span class=\"token operator\">?</span> <span class=\"token number\">1</span> <span class=\"token operator\">-</span> <span class=\"token number\">1e-6</span>\n      <span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token operator\">-</span> <span class=\"token number\">5e-7</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">deltaDistance</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">aIdx<span class=\"token punctuation\">,</span> bIdx</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> aPrev <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>aIdx <span class=\"token operator\">-</span> <span class=\"token number\">1</span> <span class=\"token operator\">+</span> path<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> path<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> aNext <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>aIdx <span class=\"token operator\">+</span> <span class=\"token number\">1</span> <span class=\"token operator\">+</span> path<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> path<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> bPrev <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>bIdx <span class=\"token operator\">-</span> <span class=\"token number\">1</span> <span class=\"token operator\">+</span> path<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> path<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> bNext <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>bIdx <span class=\"token operator\">+</span> <span class=\"token number\">1</span> <span class=\"token operator\">+</span> path<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> path<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> diff <span class=\"token operator\">=</span>\n      <span class=\"token function\">distance</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">[</span>bPrev<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> path<span class=\"token punctuation\">[</span>aIdx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span>\n      <span class=\"token function\">distance</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">[</span>aIdx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> path<span class=\"token punctuation\">[</span>bNext<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span>\n      <span class=\"token function\">distance</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">[</span>aPrev<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> path<span class=\"token punctuation\">[</span>bIdx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span>\n      <span class=\"token function\">distance</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">[</span>bIdx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> path<span class=\"token punctuation\">[</span>aNext<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span>\n      <span class=\"token function\">distance</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">[</span>aPrev<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> path<span class=\"token punctuation\">[</span>aIdx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span>\n      <span class=\"token function\">distance</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">[</span>aIdx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> path<span class=\"token punctuation\">[</span>aNext<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span>\n      <span class=\"token function\">distance</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">[</span>bPrev<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> path<span class=\"token punctuation\">[</span>bIdx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span>\n      <span class=\"token function\">distance</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">[</span>bIdx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> path<span class=\"token punctuation\">[</span>bNext<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>bPrev <span class=\"token operator\">===</span> aIdx <span class=\"token operator\">||</span> bNext <span class=\"token operator\">===</span> aIdx<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      diff <span class=\"token operator\">+=</span> <span class=\"token number\">2</span> <span class=\"token operator\">*</span> <span class=\"token function\">distance</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">[</span>aIdx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> path<span class=\"token punctuation\">[</span>bIdx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> diff<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">changePath</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">temperature</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// 2 random points</span>\n    <span class=\"token keyword\">const</span> a <span class=\"token operator\">=</span> <span class=\"token number\">1</span> <span class=\"token operator\">+</span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">floor</span><span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">.</span>length <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> b <span class=\"token operator\">=</span> <span class=\"token number\">1</span> <span class=\"token operator\">+</span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">floor</span><span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">.</span>length <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">const</span> delta <span class=\"token operator\">=</span> <span class=\"token function\">deltaDistance</span><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>delta <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span> <span class=\"token operator\">||</span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;</span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">exp</span><span class=\"token punctuation\">(</span><span class=\"token operator\">-</span>delta <span class=\"token operator\">/</span> temperature<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// swap points</span>\n      <span class=\"token punctuation\">[</span>path<span class=\"token punctuation\">[</span>a<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> path<span class=\"token punctuation\">[</span>b<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>path<span class=\"token punctuation\">[</span>b<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> path<span class=\"token punctuation\">[</span>a<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> initialTemp <span class=\"token operator\">=</span> <span class=\"token number\">100</span> <span class=\"token operator\">*</span> <span class=\"token function\">distance</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> path<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">let</span> temperature <span class=\"token operator\">=</span> initialTemp<span class=\"token punctuation\">;</span>\n    temperature <span class=\"token operator\">></span> <span class=\"token number\">1e-6</span><span class=\"token punctuation\">;</span>\n    temperature <span class=\"token operator\">*=</span> tempCoeff\n  <span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">changePath</span><span class=\"token punctuation\">(</span>temperature<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>i <span class=\"token operator\">%</span> <span class=\"token number\">10000</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      self<span class=\"token punctuation\">.</span><span class=\"token function\">setEvaluatingPaths</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n        <span class=\"token literal-property property\">paths</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">{</span> path<span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">color</span><span class=\"token operator\">:</span> <span class=\"token constant\">EVALUATING_PATH_COLOR</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n        <span class=\"token literal-property property\">cost</span><span class=\"token operator\">:</span> <span class=\"token function\">pathCost</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">await</span> self<span class=\"token punctuation\">.</span><span class=\"token function\">sleep</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>i <span class=\"token operator\">%</span> <span class=\"token number\">100000</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      path<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>sp<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      self<span class=\"token punctuation\">.</span><span class=\"token function\">setBestPath</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">,</span> <span class=\"token function\">pathCost</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      path<span class=\"token punctuation\">.</span><span class=\"token function\">pop</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    i<span class=\"token operator\">++</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// rotate the array so that starting point is back first</span>\n  <span class=\"token function\">rotateToStartingPoint</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">,</span> sp<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// go back home</span>\n  path<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>sp<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> cost <span class=\"token operator\">=</span> <span class=\"token function\">pathCost</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  self<span class=\"token punctuation\">.</span><span class=\"token function\">setEvaluatingPaths</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">paths</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">{</span> path <span class=\"token punctuation\">}</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    cost\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  self<span class=\"token punctuation\">.</span><span class=\"token function\">setBestPath</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">,</span> cost<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">makeSolver</span><span class=\"token punctuation\">(</span>simulatedAnnealing<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>"}}]}}}