| <HTML> |
| <!-- |
| Copyright (c) Matyas Egyhazy 2008 |
| |
| Distributed under the Boost Software License, Version 1.0. |
| (See accompanying file LICENSE_1_0.txt or copy at |
| http://www.boost.org/LICENSE_1_0.txt) |
| --> |
| <Head> |
| <Title>Boost Graph Library: Metric Traveling Salesperson Approximation</Title> |
| <BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b" |
| ALINK="#ff0000"> |
| <IMG SRC="../../../boost.png" |
| ALT="C++ Boost" width="277" height="86"> |
| |
| <BR Clear> |
| |
| |
| |
| <H1><A NAME="sec:metric_tsp_approx"></A> |
| <TT>metric_tsp_approx</TT> |
| </H1> |
| |
| <P> |
| <PRE> |
| template <typename VertexListGraph, |
| typename WeightMap, |
| typename VertexIndexMap, |
| typename TSPVertexVisitor> |
| void metric_tsp_approx_from_vertex( |
| const VertexListGraph& g, |
| typename graph_traits<VertexListGraph>::vertex_descriptor start, |
| WeightMap weightmap, |
| VertexIndexMap indexmap, |
| TSPVertexVisitor vis) |
| |
| <i>// Overloads</i> |
| template<typename VertexListGraph, typename OutputIterator> |
| void metric_tsp_approx_tour(VertexListGraph& g, OutputIterator o) |
| |
| template<typename VertexListGraph, typename WeightMap, typename OutputIterator> |
| void metric_tsp_approx_tour(VertexListGraph& g, WeightMap w, |
| OutputIterator o) |
| |
| template<typename VertexListGraph, typename OutputIterator> |
| void metric_tsp_approx_tour_from_vertex(VertexListGraph& g, |
| typename graph_traits<VertexListGraph>::vertex_descriptor start, |
| OutputIterator o) |
| |
| template<typename VertexListGraph, typename WeightMap, |
| typename OutputIterator> |
| void metric_tsp_approx_tour_from_vertex(VertexListGraph& g, |
| typename graph_traits<VertexListGraph>::vertex_descriptor start, |
| WeightMap w, OutputIterator o) |
| |
| <i>// visitor versions</i> |
| template<typename VertexListGraph, typename TSPVertexVisitor> |
| void metric_tsp_approx(VertexListGraph& g, TSPVertexVisitor vis) |
| |
| template<typename VertexListGraph, typename Weightmap, |
| typename VertexIndexMap, typename TSPVertexVisitor> |
| void metric_tsp_approx(VertexListGraph& g, Weightmap w, |
| TSPVertexVisitor vis) |
| |
| template<typename VertexListGraph, typename WeightMap, |
| typename VertexIndexMap, typename TSPVertexVisitor> |
| void metric_tsp_approx(VertexListGraph& g, WeightMap w, VertexIndexMap id, |
| TSPVertexVisitor vis) |
| |
| template<typename VertexListGraph, typename WeightMap, |
| typename TSPVertexVisitor> |
| void metric_tsp_approx_from_vertex(VertexListGraph& g, |
| typename graph_traits<VertexListGraph>::vertex_descriptor start, |
| WeightMap w, TSPVertexVisitor vis) |
| |
| </PRE> |
| |
| <P> |
| This is a traveling salesperson heuristic for generating a tour of vertices |
| for a fully connected undirected graph with weighted edges that obey the triangle inequality. |
| The current implementation is based off of the algorithm presented in <i>Introduction to Algorithms</i> |
| on page 1029. This implementation generates solutions that are twice as long as the optimal tour in the worst case. |
| The pseudo-code is listed below. |
| </p> |
| |
| <table> |
| <tr> |
| <td valign="top"> |
| <pre> |
| TSP-APPROX(<i>G</i>, <i>w</i>) |
| select a vertex <i>r</i> <i>in</i> <i>V[G]</i> |
| compute a minimum spanning tree <i>T</i> for <i>G</i> from root <i>r</i> |
| using PRIM-MST(<i>G</i>, <i>r</i>, <i>w</i>) |
| let <i>L</i> be the list of vertices visited in a preorder traversal of <i>T</i> |
| <b>return</b> (the Hamiltonian cycle <i>H</i> that visites the vertices in the order <i>L</i>) |
| </pre> |
| </td> |
| </tr> |
| </table> |
| |
| |
| <H3>Where Defined</H3> |
| |
| <P> |
| <a href="../../../boost/graph/metric_tsp_approx.hpp"><TT>boost/graph/metric_tsp_approx.hpp</TT></a> |
| |
| <P> |
| |
| <h3>Parameters</h3> |
| |
| IN: <tt>const Graph& g</tt> |
| <blockquote> |
| An undirected graph. The type <tt>Graph</tt> must be a |
| model of <a href="./VertexListGraph.html">Vertex List Graph</a> |
| and <a href="./IncidenceGraph.html">Incidence Graph</a> <a href="#2">[2]</a>.<br> |
| </blockquote> |
| |
| IN: <tt>vertex_descriptor start</tt> |
| <blockquote> |
| The vertex that will be the start (and end) of the tour.<br> |
| <b>Default:</b> <tt>*vertices(g).first</tt> |
| </blockquote> |
| |
| IN: <tt>WeightMap weightmap</tt> |
| <blockquote> |
| The weight of each edge in the graph. |
| The type <tt>WeightMap</tt> must be a model of |
| <a href="../../property_map/doc/ReadablePropertyMap.html">Readable Property Map</a>. The edge descriptor type of |
| the graph needs to be usable as the key type for the weight |
| map.<br> |
| <b>Default:</b> <tt>get(edge_weight, g)</tt><br> |
| </blockquote> |
| |
| IN: <tt>VertexIndexMap indexmap</tt> |
| <blockquote> |
| This maps each vertex to an integer in the range <tt>[0, |
| num_vertices(g))</tt>. This is necessary for efficient updates of the |
| heap data structure when an edge is relaxed. The type |
| <tt>VertexIndexMap</tt> must be a model of |
| <a href="../../property_map/doc/ReadablePropertyMap.html">Readable Property Map</a>. The value type of the map must be an |
| integer type. The vertex descriptor type of the graph needs to be |
| usable as the key type of the map.<br> |
| <b>Default:</b> <tt>get(vertex_index, g)</tt> |
| Note: if you use this default, make sure your graph has |
| an internal <tt>vertex_index</tt> property. For example, |
| <tt>adjacenty_list</tt> with <tt>VertexList=listS</tt> does |
| not have an internal <tt>vertex_index</tt> property. |
| <br> |
| </blockquote> |
| |
| OUT: <tt>OutputIterator o</tt> |
| <blockquote> |
| The OutputIterator holds the vertices of the tour. |
| The type <tt>OutputIterator</tt> must be a model of the |
| OutputIterator concept. |
| </blockquote> |
| |
| OUT: <tt>TSPTourVisitor vis</tt> |
| <blockquote> |
| Use this to specify actions that you would like to happen |
| when the algorithm visits a vertex of the tour. |
| The type <tt>TSPTourVisitor</tt> must be a model of the <a href="./TSPTourVisitor.html">TSP Tour Visitor</a> |
| concept. |
| The visitor object is passed by value <a |
| href="#1">[1]</a>.<br> |
| </blockquote> |
| |
| <H3>Complexity</H3> |
| |
| <P> |
| The time complexity is <i>O(E log V)</i>. |
| |
| <P> |
| |
| <H3>Example</H3> |
| |
| <P> |
| The file <a |
| href="../test/metric_tsp_approx.cpp"><TT>test/metric_tsp_approx.cpp</TT></a> |
| contains an example of using this TSP approximation algorithm. |
| |
| |
| <h3>Notes</h3> |
| |
| <p><a name="1">[1]</a> |
| Since the visitor parameter is passed by value, if your visitor |
| contains state then any changes to the state during the algorithm |
| will be made to a copy of the visitor object, not the visitor object |
| passed in. Therefore you may want the visitor to hold this state by |
| pointer or reference. |
| </p> |
| <p><a name="2">[2]</a> |
| Passing an <tt>adjacency_list</tt> with a vertex <em>not</em> set selected by |
| <tt>vecS</tt> will result in <i>O(n<sup>2</sup>)</i> performance. |
| </p> |
| <HR> |
| <TABLE> |
| <TR valign=top> |
| <TD nowrap>Copyright © 2008</TD><TD> |
| Matyas Egyhazy |
| </TD></TR></TABLE> |
| |
| </BODY> |
| </HTML> |