123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- <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>adjacency_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>
|