1057 lines
44 KiB
Plaintext
1057 lines
44 KiB
Plaintext
|
%\documentclass[10pt,a4paper,fleqn]{article}
|
||
|
\documentclass[nojss]{jss}
|
||
|
|
||
|
\usepackage[english]{babel}
|
||
|
|
||
|
%% my packages
|
||
|
%\usepackage{a4wide}
|
||
|
%\usepackage[round,longnamesfirst]{natbib}
|
||
|
%\usepackage{hyperref}
|
||
|
%
|
||
|
\usepackage{amsmath}
|
||
|
\usepackage{amsfonts}
|
||
|
%
|
||
|
%\newcommand{\strong}[1]{{\normalfont\fontseries{b}\selectfont #1}}
|
||
|
\newcommand{\class}[1]{\mbox{\textsf{#1}}}
|
||
|
\newcommand{\func}[1]{\mbox{\texttt{#1()}}}
|
||
|
%\newcommand{\code}[1]{\mbox{\texttt{#1}}}
|
||
|
%\newcommand{\pkg}[1]{\strong{#1}}
|
||
|
\newcommand{\samp}[1]{`\mbox{\texttt{#1}}'}
|
||
|
%\newcommand{\proglang}[1]{\textsf{#1}}
|
||
|
\newcommand{\set}[1]{\mathcal{#1}}
|
||
|
|
||
|
%\usepackage{Sweave}
|
||
|
%% \VignetteIndexEntry{Introduction to TSP}
|
||
|
|
||
|
\author{Michael Hahsler\\Southern Methodist University \And
|
||
|
Kurt Hornik\\Wirtschaftsuniversit\"at Wien}
|
||
|
\title{\pkg{TSP} -- Infrastructure for the Traveling
|
||
|
Salesperson Problem}
|
||
|
|
||
|
%% for pretty printing and a nice hypersummary also set:
|
||
|
\Plainauthor{Michael Hahsler, Kurt Hornik} %% comma-separated
|
||
|
\Plaintitle{TSP -- Infrastructure for the Traveling
|
||
|
Salesperson Problem} %% without formatting
|
||
|
\Shorttitle{Infrastructure for the TSP} %% a short title (if necessary)
|
||
|
|
||
|
%% an abstract and keywords
|
||
|
\Abstract{ The traveling salesperson problem (also known as traveling salesman problem or TSP) is a
|
||
|
well known and important combinatorial optimization problem. The goal
|
||
|
is to find the shortest tour that visits each city in a given list
|
||
|
exactly once and then returns to the starting city. Despite this
|
||
|
simple problem statement, solving the TSP is difficult since it
|
||
|
belongs to the class of NP-complete problems. The importance of the
|
||
|
TSP arises besides from its theoretical appeal from the variety of its
|
||
|
applications. Typical applications in operations research include
|
||
|
vehicle routing, computer wiring, cutting wallpaper and job
|
||
|
sequencing. The main application in statistics is combinatorial data
|
||
|
analysis, e.g., reordering rows and columns of data matrices or
|
||
|
identifying clusters. In this paper we introduce the
|
||
|
\proglang{R}~package \pkg{TSP} which provides a basic infrastructure
|
||
|
for handling and solving the traveling salesperson problem. The
|
||
|
package features S3 classes for specifying a TSP and its (possibly
|
||
|
optimal) solution as well as several heuristics to find good
|
||
|
solutions. In addition, it provides an interface to \emph{Concorde},
|
||
|
one of the best exact TSP solvers currently available. }
|
||
|
\Keywords{combinatorial optimization, traveling salesman problem, \proglang{R}}
|
||
|
\Plainkeywords{combinatorial optimization, traveling salesman problem, R} %% without formatting
|
||
|
%% The address of (at least) one author should be given
|
||
|
%% in the following format:
|
||
|
\Address{
|
||
|
Michael Hahsler\\
|
||
|
Engineering Management, Information, and Systems\\
|
||
|
Lyle School of Engineering\\
|
||
|
Southern Methodist University\\
|
||
|
P.O. Box 750123 \\
|
||
|
Dallas, TX 75275-0123\\
|
||
|
E-mail: \email{mhahsler@lyle.smu.edu}\\
|
||
|
|
||
|
Kurt Hornik\\
|
||
|
Department of Finance, Accounting and Statistics\\
|
||
|
Wirtschaftsuniversit\"at Wien\\
|
||
|
1090 Wien, Austria\\i
|
||
|
E-mail: \email{kurt.hornik@wu-wien.ac.at}\\
|
||
|
URL: \url{http://statmath.wu.ac.at/~hornik/}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
\begin{document}
|
||
|
|
||
|
<<echo=FALSE>>=
|
||
|
options(width = 75, useFancyQuotes=FALSE, prompt="R> ")
|
||
|
### for sampling
|
||
|
set.seed(1234)
|
||
|
@
|
||
|
|
||
|
%\title{Introduction to \pkg{TSP} -- Infrastructure for the Traveling
|
||
|
% Salesperson Problem}
|
||
|
%\author{Michael Hahsler and Kurt Hornik}
|
||
|
\maketitle
|
||
|
\sloppy
|
||
|
|
||
|
%\abstract{
|
||
|
% The traveling salesperson (or, salesman) problem (TSP) is a
|
||
|
% well known and important combinatorial optimization problem. The goal
|
||
|
% is to find the shortest tour that visits each city in a given list
|
||
|
% exactly once and then returns to the starting city. Despite this
|
||
|
% simple problem statement, solving the TSP is difficult since it
|
||
|
% belongs to the class of NP-complete problems. The importance of the
|
||
|
% TSP arises besides from its theoretical appeal from the variety of its
|
||
|
% applications. Typical applications in operations research include
|
||
|
% vehicle routing, computer wiring, cutting wallpaper and job
|
||
|
% sequencing. The main application in statistics is combinatorial data
|
||
|
% analysis, e.g., reordering rows and columns of data matrices or
|
||
|
% identifying clusters. In this paper we introduce the
|
||
|
% \proglang{R}~package \pkg{TSP} which provides a basic infrastructure
|
||
|
% for handling and solving the traveling salesperson problem. The
|
||
|
% package features S3 classes for specifying a TSP and its (possibly
|
||
|
% optimal) solution as well as several heuristics to find good
|
||
|
% solutions. In addition, it provides an interface to \emph{Concorde},
|
||
|
% one of the best exact TSP solvers currently available. }
|
||
|
|
||
|
\section{Introduction}
|
||
|
|
||
|
The traveling salesperson problem~\citep[TSP;][]{Lawler1985, Gutin2002}
|
||
|
is a well known and important combinatorial optimization problem. The
|
||
|
goal is to find the shortest tour that visits each city in a given list
|
||
|
exactly once and then returns to the starting city. Formally, the TSP
|
||
|
can be stated as follows. The distances between $n$ cities are stored
|
||
|
in a distance matrix $\mathbf{D}$ with elements $d_{ij}$ where $i,j =
|
||
|
1\dots n$ and the diagonal elements $d_{ii}$ are zero. A \emph{tour}
|
||
|
can be represented by a cyclic permutation $\pi$ of $\{1, 2,\dots, n\}$
|
||
|
where $\pi(i)$ represents the city that follows city $i$ on the
|
||
|
tour. The traveling salesperson problem is then the optimization problem
|
||
|
to find a permutation $\pi$ that minimizes the \emph{length of the tour}
|
||
|
denoted by
|
||
|
|
||
|
\begin{equation}
|
||
|
\sum_{i=1}^n d_{i\pi(i)}.
|
||
|
\end{equation}
|
||
|
% see Lenstra & Kan 1975: Some simple Applications to the TSP
|
||
|
|
||
|
For this minimization task, the tour length of $(n-1)!$ permutation
|
||
|
vectors have to be compared. This results in a problem which is very
|
||
|
hard to solve and in fact known to be NP-complete~\citep{Johnson1985a}.
|
||
|
However, solving TSPs is an important part of applications in many areas
|
||
|
including vehicle routing, computer wiring, machine sequencing and
|
||
|
scheduling, frequency assignment in communication
|
||
|
networks~\citep{Lenstra1975, Punnen2002}.
|
||
|
%and structuring of
|
||
|
%matrices~\citep{Lenstra1975, Punnen2002}.
|
||
|
Applications in statistical data analysis include ordering and
|
||
|
clustering objects. For example, data analysis applications in
|
||
|
psychology ranging from profile smoothing to finding an order in
|
||
|
developmental data are presented by~\cite{Hubert1978}. Clustering and
|
||
|
ordering using TSP solvers is currently becoming popular in
|
||
|
biostatistics. For example, \cite{Ray2007} describe an application for
|
||
|
ordering genes and \cite{Johnson2006} use a TSP solver for clustering
|
||
|
proteins.
|
||
|
|
||
|
In this paper we give a very brief overview of the TSP and introduce the
|
||
|
\proglang{R}~package \pkg{TSP} which provides an infrastructure for
|
||
|
handling and solving TSPs. The paper is organized as follows. In
|
||
|
Section~\ref{sec:TSP} we briefly present important aspects of the TSP
|
||
|
including different problem formulations and approaches to solve TSPs.
|
||
|
In Section~\ref{sec:infrastructure} we give an overview of the
|
||
|
infrastructure implemented in \pkg{TSP} and the basic usage. In
|
||
|
Section~\ref{sec:examples}, several examples are used to illustrate the
|
||
|
package's capabilities. Section~\ref{sec:conclusion} concludes the
|
||
|
paper.
|
||
|
|
||
|
A previous version of this manuscript was published in the \emph{Journal
|
||
|
of Statistical Software} \citep{TSP:Hahsler+Hornik2007}.
|
||
|
|
||
|
\section{Theory}
|
||
|
\label{sec:TSP}
|
||
|
|
||
|
In this section, we briefly summarize some aspects of the TSP which are
|
||
|
important for the implementation of the \pkg{TSP} package described in
|
||
|
this paper. For a complete treatment of all aspects of the TSP, we
|
||
|
refer the interested reader to the classic book edited by
|
||
|
\cite{Lawler1985} and the more modern book edited by \cite{Gutin2002}.
|
||
|
|
||
|
It has to be noted that in this paper, following the origin of the TSP,
|
||
|
the term \emph{distance} is used. Distance is used here interchangeably
|
||
|
with dissimilarity or cost and, unless explicitly stated, no
|
||
|
restrictions to measures which obey the triangle inequality are made.
|
||
|
An important distinction can be made between the symmetric TSP and the
|
||
|
more general asymmetric TSP. For the symmetric case (normally referred
|
||
|
to as just \emph{TSP}), for all distances in $\mathbf{D}$ the equality
|
||
|
$d_{ij} = d_{ji}$ holds, i.e., it does not matter if we travel from $i$
|
||
|
to $j$ or the other way round, the distance is the same. In the
|
||
|
asymmetric case (called \emph{ATSP}), the distances are not equal for
|
||
|
all pairs of cities. Problems of this kind arise when we do not deal
|
||
|
with spatial distances between cities but, e.g., with the cost or
|
||
|
necessary time associated with traveling between locations, where the
|
||
|
price for the plane ticket between two cities may be different depending
|
||
|
on which way we go.
|
||
|
|
||
|
\subsection{Different formulations of the TSP}
|
||
|
\label{sec:formulations}
|
||
|
|
||
|
Other than the permutation problem in the introduction, the TSP can also
|
||
|
be formulated as a graph theoretic problem. Here the TSP is formulated
|
||
|
by means of a complete graph $G = (V, E)$, where the cities correspond
|
||
|
to the node set $V = \{1,2,\ldots,n\}$ and each edge $e_i \in E$ has an
|
||
|
associated weight $w_i$ representing the distance between the nodes it
|
||
|
connects. If the graph is not complete, the missing edges can be
|
||
|
replaced by edges with very large distances. The goal is to find a
|
||
|
\emph{Hamiltonian cycle}, i.e., a cycle which visits each node in the
|
||
|
graph exactly once, with the least weight in the
|
||
|
graph~\citep{Hoffman1985}. This formulation naturally leads to
|
||
|
procedures involving minimum spanning trees for tour construction or
|
||
|
edge exchanges to improve existing tours.
|
||
|
|
||
|
TSPs can also be represented as integer and linear programming
|
||
|
problems~\citep[see, e.g.,][]{Punnen2002}. The \emph{integer programming (IP)
|
||
|
formulation} is based on the assignment problem with additional
|
||
|
constraint of no sub-tours:
|
||
|
|
||
|
|
||
|
\[
|
||
|
\begin{array}{rl}
|
||
|
\text{Minimize } & \sum_{i=1}^n\sum_{j=1}^n{d_{ij}x_{ij}}
|
||
|
% = \mathrm{trace}(\mathbf{D}^T\mathbf{X})
|
||
|
\\[3mm]
|
||
|
\text{Subject to } & \sum_{i=1}^n{x_{ij}=1}, \quad j=1,\ldots,n, \\
|
||
|
& \sum_{j=1}^n{x_{ij}=1}, \quad i=1,\ldots,n, \\
|
||
|
& x_{ij} = 0 \text{ or } 1 \\
|
||
|
& \text{no sub-tours allowed} \\
|
||
|
\end{array}
|
||
|
\]
|
||
|
|
||
|
The solution matrix $\mathbf{X} = (x_{ij})$ of the assignment problem
|
||
|
represents a tour or a collection of sub-tour (several unconnected cycles) where
|
||
|
only edges which corresponding to elements $x_{ij} = 1$ are on the tour or a
|
||
|
sub-tour. The additional restriction that no sub-tours are allowed (called
|
||
|
\emph{sub-tour elimination constraints}) restrict the solution to only proper
|
||
|
tours. Unfortunately, the number of sub-tour elimination constraints grows
|
||
|
exponentially with the number of cities which leads to an extremely hard
|
||
|
problem.
|
||
|
|
||
|
The \emph{linear programming (LP) formulation} of the TSP is given by:
|
||
|
\[
|
||
|
\begin{array}{rl}
|
||
|
\text{Minimize } & \sum_{i=1}^m{w_ix_i} = \mathbf{w}^T\mathbf{x}\\[3mm]
|
||
|
\text{Subject to } & \mathbf{x} \in \mathcal{S} \\
|
||
|
\end{array}
|
||
|
\]
|
||
|
where $m$ is the number of edges $e_i$ in $G$, $w_i \in \mathbf{w}$ is the
|
||
|
weight of edge $e_i$ and $\mathbf{x}$ is the incidence vector indicating the
|
||
|
presence or absence of each edge in the tour. Again, the constraints given by
|
||
|
$\mathbf{x} \in \mathcal{S}$ are problematic since they have to contain the set
|
||
|
of incidence vectors of all possible Hamiltonian cycles in $G$ which amounts to
|
||
|
a direct search of all $(n-1)!$ possibilities and thus in general is
|
||
|
infeasible. However, relaxed versions of the linear programming problem with
|
||
|
removed integrality and sub-tour elimination constraints are extensively used by
|
||
|
modern TSP solvers where such a partial description of constraints is used and
|
||
|
improved iteratively in a branch-and-bound approach.
|
||
|
|
||
|
\subsection{Useful manipulations of the distance matrix}
|
||
|
\label{sec:manipulations}
|
||
|
|
||
|
Sometimes it is useful to transform the distance matrix $\mathbf{D} = (d_{ij})$
|
||
|
of a TSP into a different matrix $\mathbf{D'} = (d'_{ij})$ which has the same
|
||
|
optimal solution. Such a transformation requires that for any
|
||
|
Hamiltonian cycle $H$ in a graph represented by its distance matrix $\mathbf{D}$
|
||
|
the equality
|
||
|
\begin{equation*}
|
||
|
\sum_{i,j \in H}{d_{ij}} = \alpha \sum_{i,j \in H}{d'_{ij}} + \beta
|
||
|
\end{equation*}
|
||
|
holds for suitable $\alpha > 0$ and $\beta \in \mathbb{R}$. From the
|
||
|
equality we see that additive and multiplicative constants leave the
|
||
|
optimal solution invariant. This property is useful to rescale
|
||
|
distances, e.g., for many solvers, distances in the interval $[0, 1]$
|
||
|
have to be converted into integers from~1 to a maximal value.
|
||
|
|
||
|
A different manipulation is to reformulate an asymmetric TSP as a symmetric TSP.
|
||
|
This is possible by doubling the number of cities~\citep{Jonker1983}. For each
|
||
|
city a dummy city is added. Between each city and its corresponding dummy city
|
||
|
a very small value (e.g., $-\infty$) is used. This makes sure that each
|
||
|
city always occurs in the solution together with its dummy city. The original
|
||
|
distances are used between the cities and the dummy cities, where each city is
|
||
|
responsible for the distance going to the city and the dummy city is
|
||
|
responsible for the distance coming from the city. The distances between all
|
||
|
cities and the distances between all dummy cities are set to a very large
|
||
|
value (e.g., $\infty$) which makes these edges infeasible. An example for
|
||
|
equivalent formulations as an asymmetric TSP (to the left) and
|
||
|
a symmetric TSP (to the right) for
|
||
|
three cities is:
|
||
|
|
||
|
\begin{equation*}
|
||
|
\begin{pmatrix}
|
||
|
0 &d_{12} &d_{13} \\
|
||
|
d_{21} &0 &d_{23} \\
|
||
|
d_{31} &d_{32} &0 \\
|
||
|
\end{pmatrix}
|
||
|
\Longleftrightarrow
|
||
|
\begin{pmatrix}
|
||
|
0 &\infty &\infty & -\infty &d_{21} &d_{31} \\
|
||
|
\infty &0 &\infty & d_{12} &-\infty &d_{31} \\
|
||
|
\infty &\infty &0 & d_{13} &d_{23} &-\infty \\
|
||
|
-\infty &d_{12} &d_{13} & 0 &\infty &\infty \\
|
||
|
d_{21} &-\infty &d_{23} & \infty &0 &\infty \\
|
||
|
d_{31} &d_{32} &-\infty & \infty &\infty &0 \\
|
||
|
\end{pmatrix}
|
||
|
\end{equation*}
|
||
|
|
||
|
Instead of the infinity values suitably large negative and positive values can
|
||
|
be used. The new symmetric TSP can be solved using techniques for symmetric
|
||
|
TSPs which are currently far more advanced than techniques for ATSPs.
|
||
|
Removing the dummy cities from the resulting tour gives the solution for the
|
||
|
original ATSP.
|
||
|
|
||
|
|
||
|
\subsection{Finding exact solutions for the TSP}
|
||
|
\label{sec:exact}
|
||
|
|
||
|
Finding the exact solution to a TSP with $n$ cities requires to check $(n-1)!$
|
||
|
possible tours. To evaluate all possible tours is infeasible for even small TSP
|
||
|
instances. To find the optimal tour
|
||
|
\cite{Held1962} presented the following
|
||
|
\emph{dynamic programming} formulation: Given a subset of city indices
|
||
|
(excluding the first city)
|
||
|
$S \subset \{2, 3, \dots, n\}$ and $l \in S$, let $d^*(S, l)$ denote the length of the
|
||
|
shortest path from city $1$ to city $l$, visiting all cities in $S$ in-between.
|
||
|
For $S = \{l\}$, $d^*(S,l)$ is defined as $d_{1l}$. The shortest path for
|
||
|
larger sets with $|S| > 1$ is
|
||
|
|
||
|
\begin{equation}
|
||
|
d^*(S,l) = \mathrm{min}_{m \in S\setminus\{l\}}\Bigl( d^*(S\setminus\{l\},m) + d_{ml}\Bigl).
|
||
|
%\text{ for } |S| > 1.
|
||
|
\end{equation}
|
||
|
|
||
|
Finally, the minimal tour length for a complete tour which includes returning
|
||
|
to city $1$ is
|
||
|
|
||
|
\begin{equation}
|
||
|
d^{**} = \mathrm{min}_{l \in \{2,3,\dots,n\}}\Bigl( d^*(\{2,3,\dots,n\}, l)
|
||
|
+ d_{l1}\Bigl).
|
||
|
\end{equation}
|
||
|
|
||
|
Using the last two equations, the quantities $d^*(S,l)$ can be computed
|
||
|
recursively and the minimal tour length $d^{**}$ can be found. In a
|
||
|
second step, the optimal permutation $\pi = \{1, i_2, i_3,\dots,i_n\}$
|
||
|
of city indices $1$ through $n$ can be computed in reverse order,
|
||
|
starting with $i_n$ and working successively back to $i_2$. The
|
||
|
procedure exploits the fact that a permutation $\pi$ can only be
|
||
|
optimal, if
|
||
|
|
||
|
\begin{equation}
|
||
|
d^{**} = d^*(\{2,3,\dots,n\}, i_n) + d_{i_n1}
|
||
|
\end{equation}
|
||
|
and, for $2 \le p \le n-1$,
|
||
|
\begin{equation}
|
||
|
d^*(\{i_2, i_3,\dots, i_p, i_{p+1}\}, i_{p+1}) =
|
||
|
d^*(\{i_2,i_3,\dots,i_p\}, i_p) + d_{i_pi_{p+1}}.
|
||
|
\end{equation}
|
||
|
|
||
|
The space complexity of storing the values for all $d^*(S,l)$ is
|
||
|
$(n-1)2^{n-2}$ which severely restricts the dynamic programming
|
||
|
algorithm to TSP problems of small sizes. However, for very small TSP
|
||
|
instances this approach is fast and efficient.
|
||
|
%\marginpar{time complexity if order $n^22^n$. Check!}
|
||
|
|
||
|
A different method, which can deal with larger instances, uses a relaxation of
|
||
|
the linear programming problem presented in Section~\ref{sec:formulations} and
|
||
|
iteratively tightens the relaxation till a solution is found. This general
|
||
|
method for solving linear programming problems with complex and large
|
||
|
inequality systems is called \emph{cutting plane method} and was introduced by
|
||
|
\cite{Dantzig1954}.
|
||
|
|
||
|
Each iteration begins with using instead of the original linear
|
||
|
inequality description $\mathcal{S}$ the relaxation $A\mathbf{x} \le b$,
|
||
|
where the polyhedron $P$ defined by the relaxation contains
|
||
|
$\mathcal{S}$ and is bounded. The optimal solution $\mathbf{x}^*$ of
|
||
|
the relaxed problem can be obtained using standard linear programming
|
||
|
solvers. If the $\mathbf{x}^*$ found belongs to $\mathcal{S}$, the
|
||
|
optimal solution of the original problem is obtained, otherwise, a
|
||
|
linear inequality can be found which is satisfied by all points in
|
||
|
$\mathcal{S}$ but violated by $\mathbf{x}^*$. Such an inequality is
|
||
|
called a cutting plane or cut. A family of such cutting planes can be
|
||
|
added to the inequality system $A\mathbf{x} \le b$ to obtain a tighter
|
||
|
relaxation for the next iteration.
|
||
|
|
||
|
If no further cutting planes can be found or the improvement in the
|
||
|
objective function due to adding cuts gets very small, the problem is
|
||
|
branched into two sub-problems which can be minimized
|
||
|
separately. Branching is done iteratively which leads to a binary tree
|
||
|
of sub-problems. Each sub-problem is either solved without further
|
||
|
branching or is found to be irrelevant because its relaxed version
|
||
|
already produces a longer path than a solution of another sub-problem.
|
||
|
This method is called \emph{branch-and-cut}~\citep{Padberg1990} which is
|
||
|
a variation of the well known \emph{branch-and-bound}~\citep{Land1960}
|
||
|
procedure.
|
||
|
|
||
|
The initial polyhedron $P$ used by \cite{Dantzig1954} contains all
|
||
|
vectors $\mathbf{x}$ for which all $x_e \in \mathbf{x}$ satisfy $0 \le
|
||
|
x_e \le 1$ and in the resulting tour each city is linked to exactly two
|
||
|
other cities. Various separation algorithms for finding subsequent cuts
|
||
|
to prevent sub-tours (\emph{sub-tour elimination inequalities}) and to
|
||
|
ensure an integer solution \citep[\emph{Gomory cuts;}][]{Gomory1963}
|
||
|
were developed over time. The currently most efficient implementation of
|
||
|
this method is \emph{Concorde} described in~\cite{Applegate2000}.
|
||
|
|
||
|
\subsection{Heuristics for the TSP}
|
||
|
\label{sec:heuristics}
|
||
|
|
||
|
The NP-completeness of the TSP already makes it more time efficient for
|
||
|
small-to-medium size TSP instances to rely on heuristics in case a good
|
||
|
but not necessarily optimal solution is sufficient. TSP heuristics
|
||
|
typically fall into two groups, tour construction heuristics which
|
||
|
create tours from scratch and tour improvement heuristics which use
|
||
|
simple local search heuristics to improve existing tours.
|
||
|
|
||
|
In the following we will only discuss heuristics available in \pkg{TSP}, for a
|
||
|
comprehensive overview of the multitude of TSP heuristics including an
|
||
|
experimental comparison, we refer the reader to the book chapter by
|
||
|
\cite{Johnson2002}.
|
||
|
|
||
|
\subsubsection{Tour construction heuristics}
|
||
|
The implemented tour construction heuristics are the nearest neighbor algorithm
|
||
|
and the insertion algorithms.
|
||
|
|
||
|
\paragraph{Nearest neighbor algorithm.}
|
||
|
|
||
|
The nearest neighbor algorithm~\citep{Rosenkrantz1977} follows a very
|
||
|
simple greedy procedure: The algorithm starts with a tour containing a
|
||
|
randomly chosen city and then always adds to the last city in the tour
|
||
|
the nearest not yet visited city. The algorithm stops when all cities
|
||
|
are on the tour.
|
||
|
|
||
|
An extension to this algorithm is to repeat it with each city as the
|
||
|
starting point and then return the best tour found. This heuristic is
|
||
|
called repetitive nearest neighbor.
|
||
|
|
||
|
\paragraph{Insertion algorithms.}
|
||
|
|
||
|
All insertion algorithms~\citep{Rosenkrantz1977} start with a tour
|
||
|
consisting of an arbitrary city and then choose in each step a city $k$
|
||
|
not yet on the tour. This city is inserted into the existing tour
|
||
|
between two consecutive cities $i$ and $j$, such that the insertion cost
|
||
|
(i.e., the increase in the tour's length)
|
||
|
$$d(i,k) + d(k,j) - d(i,j)$$
|
||
|
is minimized. The algorithms stop when all cities are on the tour.
|
||
|
|
||
|
The insertion algorithms differ in the way the city to be inserted next
|
||
|
is chosen. The following variations are implemented:
|
||
|
|
||
|
\begin{description}
|
||
|
\item[Nearest insertion] The city $k$ is chosen in each step as
|
||
|
the city which is nearest to a city on the tour.
|
||
|
|
||
|
\item[Farthest insertion] The city $k$ is chosen in each step as
|
||
|
the city which is farthest from any of the cities on the tour.
|
||
|
|
||
|
\item[Cheapest insertion] The city $k$ is chosen in each step
|
||
|
such that the cost of inserting the new city is minimal.
|
||
|
|
||
|
\item[Arbitrary insertion] The city $k$ is chosen randomly from all cities
|
||
|
not yet on the tour.
|
||
|
|
||
|
\end{description}
|
||
|
|
||
|
|
||
|
The nearest and cheapest insertion algorithms correspond to the minimum
|
||
|
spanning tree algorithm by \cite{Prim1957}. Adding a city to a partial tour
|
||
|
corresponds to adding an edge to a partial spanning tree. For TSPs with
|
||
|
distances obeying the triangular inequality, the equality to minimum spanning
|
||
|
trees provides a theoretical upper bound for the two algorithms of twice the
|
||
|
optimal tour length.
|
||
|
|
||
|
The idea behind the farthest insertion algorithm is to link cities far
|
||
|
outside into the tour first to establish an outline of the whole tour
|
||
|
early. With this change, the algorithm cannot be directly related to
|
||
|
generating a minimum spanning tree and thus the upper bound stated above
|
||
|
cannot be guaranteed. However, it can was shown that the algorithm
|
||
|
generates tours which approach $2/3$ times the optimal tour
|
||
|
length~\citep{Johnson1985}.
|
||
|
|
||
|
\subsubsection{Tour improvement heuristics}
|
||
|
|
||
|
Tour improvement heuristics are simple local search heuristics which try to
|
||
|
improve an initial tour. A comprehensive treatment of the topic
|
||
|
can be found in the book chapter by \cite{Rego2002}.
|
||
|
|
||
|
\paragraph{$k$-Opt heuristics.} The idea is to define a neighborhood structure
|
||
|
on the set of all admissible tours. Typically, a tour $t'$ is a neighbor of
|
||
|
another tour $t$ if $t'$ can be obtained from $t$ by deleting $k$ edges
|
||
|
and replacing them by a set of different feasible edges (a $k$-Opt move). In
|
||
|
such a structure, the tour can iteratively be improved by always moving from
|
||
|
one tour to its best neighbor till no further improvement is possible. The
|
||
|
resulting tour represents a local optimum which is called $k$-optimal.
|
||
|
|
||
|
Typically, $2$-Opt~\citep{Croes1958} and $3$-Opt~\citep{Lin1965} heuristics
|
||
|
are used in practice.
|
||
|
|
||
|
\paragraph{Lin-Kernighan heuristic.}
|
||
|
|
||
|
This heuristic~\citep{Lin1973} does not use a fixed value for $k$ for
|
||
|
its $k$-Opt moves, but tries to find the best choice of $k$ for each
|
||
|
move. The heuristic uses the fact that each $k$-Opt move can be
|
||
|
represented as a sequence of $2$-Opt moves. It builds up a sequence of
|
||
|
$2$-Opt moves, checking after each additional move whether a stopping
|
||
|
rule is met. Then the part of the sequence which gives the best
|
||
|
improvement is used. This is equivalent to a choice of one $k$-Opt move
|
||
|
with variable $k$. Such moves are used till a local optimum is reached.
|
||
|
|
||
|
By using full backtracking, the optimal solution can always be found, but the
|
||
|
running time would be immense. Therefore, only limited backtracking is allowed
|
||
|
in the procedure, which helps to find better local optima or even the optimal
|
||
|
solution. Further improvements to the procedure are described
|
||
|
by \cite{Lin1973}.
|
||
|
|
||
|
|
||
|
\section{Computational infrastructure: the TSP package}
|
||
|
\label{sec:infrastructure}
|
||
|
|
||
|
In package~\pkg{TSP}, a traveling salesperson problem is
|
||
|
defined by an object of class \class{TSP} (symmetric) or \class{ATSP}
|
||
|
(asymmetric). \func{solve\_TSP}
|
||
|
is used to find a solution, which is represented by
|
||
|
an object of class \class{TOUR}. Figure~\ref{fig:overview} gives an overview
|
||
|
of this infrastructure.
|
||
|
|
||
|
\begin{figure}
|
||
|
\centering
|
||
|
\includegraphics[width=14cm]{overview}
|
||
|
\caption{An overview of the classes in \pkg{TSP}.}
|
||
|
\label{fig:overview}
|
||
|
\end{figure}
|
||
|
|
||
|
|
||
|
\class{TSP} objects can be created from a distance matrix (a
|
||
|
\class{dist} object) or a symmetric matrix using the creator function
|
||
|
\func{TSP} or coercion with \func{as.TSP}. Similarly, \class{ATSP}
|
||
|
objects are created by \func{ATSP} or \func{as.ATSP} from square
|
||
|
matrices representing the distances. In the creation process, labels
|
||
|
are taken and stored as city names in the object or can be explicitly
|
||
|
given as arguments to the creator functions. Several methods are
|
||
|
defined for the classes:
|
||
|
\begin{itemize}
|
||
|
\item \func{print} displays basic information about the problem (number
|
||
|
of cities and the distance measure employed).
|
||
|
\item \func{n\_of\_cities} returns the number of cities.
|
||
|
\item \func{labels} returns the city names.
|
||
|
\item \func{image} produces a shaded matrix plot of the distances
|
||
|
between cities. The order of the cities can be specified as the
|
||
|
argument \code{order}.
|
||
|
\end{itemize}
|
||
|
|
||
|
Internally, an object of class \class{TSP} is a \class{dist} object with
|
||
|
an additional class attribute and, therefore, if needed, can be coerced
|
||
|
to \class{dist} or to a matrix. An \class{ATSP} object is represented
|
||
|
as a square matrix. Obviously, asymmetric TSPs are more general than
|
||
|
symmetric TSPs, hence, symmetric TSPs can also be represented as
|
||
|
asymmetric TSPs. To formulate an asymmetric TSP as a symmetric TSP with
|
||
|
double the number of cities (see Section \ref{sec:manipulations}),
|
||
|
\func{reformulate\_ATSP\_as\_TSP} is provided. This function creates
|
||
|
the necessary dummy cities and adapts the distance matrix accordingly.
|
||
|
|
||
|
A popular format to save TSP descriptions to disk which is supported by
|
||
|
most TSP solvers is the format used by \emph{TSPLIB}, a library of
|
||
|
sample instances of the TSP maintained by \cite{Reinelt2004}. The
|
||
|
\pkg{TSP} package provides \func{read\_TSPLIB} and \func{write\_TSPLIB}
|
||
|
to read and save symmetric and asymmetric TSPs in TSPLIB format.
|
||
|
|
||
|
Class \class{TOUR} represents a solution to a TSP by an integer
|
||
|
permutation vector containing the ordered indices and labels of the
|
||
|
cities to visit. In addition, it stores an attribute indicating the
|
||
|
length of the tour. Again, suitable \func{print} and \func{labels}
|
||
|
methods are provided. The raw permutation vector (i.e., the order in
|
||
|
which cities are visited) can be obtained from a tour using
|
||
|
\func{as.integer}. With \func{cut\_tour}, a circular tour can be split
|
||
|
at a specified city resulting in a path represented by a vector of city
|
||
|
indices.
|
||
|
|
||
|
The length of a tour can always be calculated using \func{tour\_length}
|
||
|
and specifying a TSP and a tour. Instead of the tour, an integer
|
||
|
permutation vector calculated outside the \pkg{TSP} package can be used
|
||
|
as long as it has the correct length.
|
||
|
|
||
|
All TSP solvers in \pkg{TSP} can be used with the simple common interface:
|
||
|
|
||
|
\begin{quote}
|
||
|
\code{solve\_TSP(x, method, control)}
|
||
|
\end{quote}
|
||
|
where \code{x} is the TSP to be solved, \code{method} is a character
|
||
|
string indicating the method used to solve the TSP and \code{control}
|
||
|
can contain a list with additional information used by the solver.
|
||
|
The available algorithms are shown in Table~\ref{tab:methods}.
|
||
|
|
||
|
\begin{table}
|
||
|
\caption{Available algorithms in \pkg{TSP}.}
|
||
|
\label{tab:methods}
|
||
|
\centering
|
||
|
\begin{tabular}{llc}
|
||
|
\hline
|
||
|
\textbf{Algorithm} & \textbf{Method argument} & \textbf{Applicable to} \\
|
||
|
\hline
|
||
|
Nearest neighbor algorithm & \code{"nn"} & TSP/ATSP \\
|
||
|
Repetitive nearest neighbor algorithm & \code{"repetitive\_nn"}
|
||
|
& TSP/ATSP \\
|
||
|
Nearest insertion & \code{"nearest\_insertion"} & TSP/ATSP \\
|
||
|
Farthest insertion & \code{"farthest\_insertion"} & TSP/ATSP \\
|
||
|
Cheapest insertion & \code{"cheapest\_insertion"} & TSP/ATSP \\
|
||
|
Arbitrary insertion & \code{"arbitrary\_insertion"} & TSP/ATSP \\
|
||
|
Concorde TSP solver & \code{"concorde"} & TSP \\
|
||
|
2-Opt improvement heuristic & \code{"two\_opt"} & TSP/ATSP \\
|
||
|
Chained Lin-Kernighan & \code{"linkern"} & TSP \\
|
||
|
\hline
|
||
|
\end{tabular}
|
||
|
\end{table}
|
||
|
|
||
|
All algorithms except the Concorde TSP solver and the Chained
|
||
|
Lin-Kernighan heuristic (a Lin-Kernighan variation described in
|
||
|
\cite{Applegate2003}) are included in the package and distributed under
|
||
|
the GNU Public License (GPL). For the Concorde TSP solver and the
|
||
|
Chained Lin-Kernighan heuristic only a simple interface (using
|
||
|
\func{write\_TSPLIB}, calling the executable and reading back the
|
||
|
resulting tour) is included in \pkg{TSP}. The executable itself is part
|
||
|
of the Concorde distribution, has to be installed separately and is
|
||
|
governed by a different license which allows only for academic use. The
|
||
|
interfaces are included since
|
||
|
Concorde~\citep{Applegate2000,Applegate2006} is currently one of the
|
||
|
best implementations for solving symmetric TSPs based on the
|
||
|
branch-and-cut method discussed in section~\ref{sec:exact}. In May
|
||
|
2004, Concorde was used to find the optimal solution for the TSP of
|
||
|
visiting all 24,978 cities in Sweden. The computation was carried out
|
||
|
on a cluster with 96 Xeon 2.8 GHz nodes and took in total almost 100 CPU
|
||
|
years.
|
||
|
|
||
|
\section{Examples}
|
||
|
\label{sec:examples}
|
||
|
|
||
|
In this section we provide some examples for the use of
|
||
|
package~\pkg{TSP}. We start with a simple example of how to use the
|
||
|
interface of the TSP solver to compare different heuristics. Then we
|
||
|
show how to solve related tasks, using the Hamiltonian shortest path
|
||
|
problem as an example. Finally, we give an example of clustering using
|
||
|
the \pkg{TSP} package. An additional application can be found
|
||
|
in package \pkg{seriation}~\citep{TSP:Hahsler+Buchta+Hornik:2006} which uses
|
||
|
the TSP solvers from \pkg{TSP} to order (seriate) objects given a proximity
|
||
|
matrix.
|
||
|
|
||
|
\subsection{Comparing some heuristics}
|
||
|
|
||
|
In the following example, we use several heuristics to find a short path
|
||
|
in the \code{USCA50} data set which contains the distances between the
|
||
|
first 50 cities in the \code{USCA312} data set. The \code{USCA312} data
|
||
|
set contains the distances between 312 cities in the USA and Canada
|
||
|
coded as a symmetric TSP. The smaller data set is used here, since some
|
||
|
of the heuristic solvers employed are rather slow.
|
||
|
|
||
|
<<>>=
|
||
|
library("TSP")
|
||
|
data("USCA50")
|
||
|
USCA50
|
||
|
@
|
||
|
|
||
|
|
||
|
We calculate tours using different heuristics and store the results in
|
||
|
the list \code{tours}. As an example, we show the first tour which
|
||
|
displays the method employed, the number of cities involved and the tour
|
||
|
length. All tour lengths are compared using the dot chart in
|
||
|
Figure~\ref{fig:dotchart}. For the chart, we add a point for the
|
||
|
optimal solution which has a tour length of 14497. The optimal solution
|
||
|
can be found using Concorde (\code{method = "concorde"}). It is omitted
|
||
|
here, since Concorde has to be installed separately.
|
||
|
|
||
|
<<echo=FALSE>>=
|
||
|
set.seed(1234)
|
||
|
@
|
||
|
|
||
|
|
||
|
<<fig=TRUE, include=FALSE, label=dotchart_USCA50, width=7, height=4>>=
|
||
|
methods <- c("nearest_insertion", "farthest_insertion", "cheapest_insertion",
|
||
|
"arbitrary_insertion", "nn", "repetitive_nn", "two_opt")
|
||
|
|
||
|
tours <- sapply(methods, FUN = function(m) solve_TSP(USCA50, method = m),
|
||
|
simplify = FALSE)
|
||
|
## tours$concorde <- solve_TSP(tsp, method = "concorde")
|
||
|
|
||
|
tours[[1]]
|
||
|
|
||
|
dotchart(sort(c(sapply(tours, tour_length), optimal = 14497)),
|
||
|
xlab = "tour length", xlim = c(0, 20000))
|
||
|
@
|
||
|
|
||
|
\begin{figure}
|
||
|
\centering
|
||
|
\includegraphics[width=11cm, trim=0 10 0 0]{TSP-dotchart_USCA50}
|
||
|
\caption{Comparison of the tour lengths for the USCA50 data set.}
|
||
|
\label{fig:dotchart}
|
||
|
\end{figure}
|
||
|
|
||
|
|
||
|
\subsection{Finding the shortest Hamiltonian path}
|
||
|
|
||
|
The problem of finding the shortest Hamiltonian path through a graph
|
||
|
(i.e., a path which visits each node in the graph exactly once) can be
|
||
|
transformed into the TSP with cities and distances representing the
|
||
|
graphs vertices and edge weights, respectively~\citep{Garfinkel1985}.
|
||
|
|
||
|
Finding the shortest Hamiltonian path through all cities disregarding
|
||
|
the endpoints can be achieved by inserting a `dummy city' which has a
|
||
|
distance of zero to all other cities. The position of this city in the
|
||
|
final tour represents the cutting point for the path. In the following
|
||
|
we use a heuristic to find a short path in the \code{USCA312} data set.
|
||
|
Inserting dummy cities is performed in \pkg{TSP} by
|
||
|
\func{insert\_dummy}.
|
||
|
|
||
|
<<echo=FALSE>>=
|
||
|
set.seed(1234)
|
||
|
@
|
||
|
|
||
|
<<>>=
|
||
|
library("TSP")
|
||
|
data("USCA312")
|
||
|
tsp <- insert_dummy(USCA312, label = "cut")
|
||
|
tsp
|
||
|
@
|
||
|
|
||
|
The TSP now contains an additional dummy city and we can try to solve
|
||
|
this TSP.
|
||
|
|
||
|
<<>>=
|
||
|
tour <- solve_TSP(tsp, method="farthest_insertion")
|
||
|
tour
|
||
|
@
|
||
|
|
||
|
Since the dummy city has distance zero to all other cities, the path length is
|
||
|
equal to the tour length reported above. The path starts with the first city in
|
||
|
the list after the `dummy' city and ends with the city right before it.
|
||
|
We use \func{cut\_tour} to create a path and show the
|
||
|
first and last 6 cities on it.
|
||
|
|
||
|
<<>>=
|
||
|
path <- cut_tour(tour, "cut")
|
||
|
head(labels(path))
|
||
|
tail(labels(path))
|
||
|
@
|
||
|
|
||
|
The tour found in the example results in a path from Lihue on Hawaii to
|
||
|
Prince Rupert in British Columbia. Such a tour can also be visualized
|
||
|
using a scatter plot with a map from package \pkg{maps}. Note that the \code{if} statement and the \code{plot} in the \code{else} part in the following is not needed and only checks if the map package is installed when building this document.
|
||
|
|
||
|
<<fig=TRUE, include=FALSE, label=map1, width=8, height=8>>=
|
||
|
if(require(maps)) {
|
||
|
library("maps")
|
||
|
|
||
|
data("USCA312_GPS")
|
||
|
|
||
|
plot_path <- function(path) {
|
||
|
plot((USCA312_GPS[, c("long", "lat")]), cex = .3, col = "red")
|
||
|
map("world", col = "gray", add = TRUE)
|
||
|
lines(USCA312_GPS[, c("long", "lat")][path,], col = "black")
|
||
|
points(USCA312_GPS[c(head(path, 1), tail(path, 1)), c("long", "lat")], pch = 19, col = "black")
|
||
|
}
|
||
|
|
||
|
plot_path(path)
|
||
|
|
||
|
} else {
|
||
|
plot(NA, xlim= c(0,1), ylim = c(0,1))
|
||
|
text(.5, .5, "Suggested packages not available")
|
||
|
}
|
||
|
@
|
||
|
|
||
|
\begin{figure}
|
||
|
\centering
|
||
|
\includegraphics[width=10cm, trim=0 30 0 0]{TSP-map1}
|
||
|
\caption{A ``short'' Hamiltonian path for the USCA312 dataset.}
|
||
|
\label{fig:map1}
|
||
|
\end{figure}
|
||
|
|
||
|
The map containing the path is presented in Figure~\ref{fig:map1}. It
|
||
|
has to be mentioned that the path found by the used heuristic is
|
||
|
considerable longer than the optimal path found by Concorde with a
|
||
|
length of $34928$, illustrating the power of modern TSP algorithms.
|
||
|
|
||
|
For the following two examples, we indicate how the distance matrix
|
||
|
between cities can be modified to solve related shortest Hamiltonian
|
||
|
path problems. These examples serve as illustrations of how
|
||
|
modifications can be made to transform different problems into a TSP.
|
||
|
|
||
|
The first problem is to find the shortest Hamiltonian path starting with
|
||
|
a given city. In this case, all distances to the selected city are set
|
||
|
to zero, forcing the evaluation of all possible paths starting with this
|
||
|
city and disregarding the way back from the final city in the tour. By
|
||
|
modifying the distances the symmetric TSP is changed into an asymmetric
|
||
|
TSP (ATSP) since the distances between the starting city and all other
|
||
|
cities are no longer symmetric.
|
||
|
|
||
|
As an example, we choose New York as the starting city. We transform
|
||
|
the data set into an ATSP and set the column corresponding to New York
|
||
|
to zero before solving it. Thus, the distance to return from the last
|
||
|
city in the path to New York does not contribute to the path length. We
|
||
|
use the nearest neighbor heuristic to calculate an initial tour which is
|
||
|
then improved using $2$-Opt moves and cut at New York to create a path.
|
||
|
|
||
|
|
||
|
<<echo=FALSE>>=
|
||
|
set.seed(1234)
|
||
|
@
|
||
|
|
||
|
<<>>=
|
||
|
atsp <- as.ATSP(USCA312)
|
||
|
ny <- which(labels(USCA312) == "New York, NY")
|
||
|
atsp[, ny] <- 0
|
||
|
initial_tour <- solve_TSP(atsp, method="nn")
|
||
|
initial_tour
|
||
|
tour <- solve_TSP(atsp, method ="two_opt", control = list(tour = initial_tour))
|
||
|
tour
|
||
|
path <- cut_tour(tour, ny, exclude_cut = FALSE)
|
||
|
|
||
|
head(labels(path))
|
||
|
tail(labels(path))
|
||
|
@
|
||
|
<<fig=TRUE, include=FALSE, label=map2, width=8, height=8>>=
|
||
|
plot_path(path)
|
||
|
@
|
||
|
|
||
|
\begin{figure}
|
||
|
\centering
|
||
|
\includegraphics[width=10cm, trim=0 30 0 0]{TSP-map2}
|
||
|
\caption{A Hamiltonian path for the USCA312 dataset starting in New York.}
|
||
|
\label{fig:map2}
|
||
|
\end{figure}
|
||
|
|
||
|
The found path is presented in Figure~\ref{fig:map2}. It begins with New
|
||
|
York and cities in New Jersey and ends in a city in Manitoba, Canada.
|
||
|
%The path shows the typical behavior
|
||
|
%of the nearest neighbor heuristic with first connecting the cities close by and
|
||
|
%then making rather big ``jumps'' for the final cities.
|
||
|
|
||
|
Concorde and many advanced TSP solvers can only solve symmetric TSPs. To
|
||
|
use these solvers, we can formulate the ATSP as a TSP using
|
||
|
\func{reformulate\_ATSP\_as\_TSP} which introduces a dummy city for each
|
||
|
city (see Section~\ref{sec:manipulations}).
|
||
|
|
||
|
<<>>=
|
||
|
tsp <- reformulate_ATSP_as_TSP(atsp)
|
||
|
tsp
|
||
|
@
|
||
|
|
||
|
After finding a tour for the TSP, the dummy cities are removed again giving the
|
||
|
tour for the original ATSP.
|
||
|
Note that the tour needs to be reversed if the
|
||
|
dummy cities appear before and not after the original cities in the solution of
|
||
|
the TSP. The following code is not executed here, since it takes several
|
||
|
minutes to execute and Concorde has to be installed separately. Concorde finds
|
||
|
the optimal solution with a length of $36091$.
|
||
|
|
||
|
|
||
|
<<eval=FALSE>>=
|
||
|
tour <- solve_TSP(tsp, method = "concorde")
|
||
|
tour <- as.TOUR(tour[tour <= n_of_cities(atsp)])
|
||
|
@
|
||
|
|
||
|
|
||
|
Finding the shortest Hamiltonian path which ends in a given city can be
|
||
|
achieved likewise by setting the row in the distance matrix which
|
||
|
corresponds to this city to zero.
|
||
|
|
||
|
For finding the shortest Hamiltonian path we can also restrict both end
|
||
|
points. This problem can be transformed to a TSP by replacing the two
|
||
|
cities by a single city which contains the distances from the start
|
||
|
point in the columns and the distances to the end point in the
|
||
|
rows. Obviously this is again an asymmetric TSP.
|
||
|
|
||
|
For the following example, we are only interested in paths starting in
|
||
|
New York and ending in Los Angeles. Therefore, we remove the two cities
|
||
|
from the distance matrix, create an asymmetric TSP and insert a dummy
|
||
|
city called \code{"LA/NY"}. The distances from this dummy city are
|
||
|
replaced by the distances from New York and the distances towards are
|
||
|
replaced by the distances towards Los Angeles.
|
||
|
|
||
|
|
||
|
<<echo=FALSE>>=
|
||
|
set.seed(1234)
|
||
|
@
|
||
|
|
||
|
<<>>=
|
||
|
m <- as.matrix(USCA312)
|
||
|
ny <- which(labels(USCA312) == "New York, NY")
|
||
|
la <- which(labels(USCA312) == "Los Angeles, CA")
|
||
|
|
||
|
atsp <- ATSP(m[-c(ny,la), -c(ny,la)])
|
||
|
atsp <- insert_dummy(atsp, label = "LA/NY")
|
||
|
|
||
|
la_ny <- which(labels(atsp) == "LA/NY")
|
||
|
atsp[la_ny, ] <- c(m[-c(ny,la), ny], 0)
|
||
|
atsp[, la_ny] <- c(m[la, -c(ny,la)], 0)
|
||
|
@
|
||
|
|
||
|
|
||
|
We use the nearest insertion heuristic.
|
||
|
<<>>=
|
||
|
tour <- solve_TSP(atsp, method ="nearest_insertion")
|
||
|
tour
|
||
|
|
||
|
path_labels <- c("New York, NY",
|
||
|
labels(cut_tour(tour, la_ny)), "Los Angeles, CA")
|
||
|
path_ids <- match(path_labels, labels(USCA312))
|
||
|
|
||
|
head(path_labels)
|
||
|
tail(path_labels)
|
||
|
@
|
||
|
<<fig=TRUE, include=FALSE, label=map3, width=8, height=8>>=
|
||
|
plot_path(path_ids)
|
||
|
@
|
||
|
|
||
|
|
||
|
The path jumps from New York to cities in Ontario and it passes through
|
||
|
cities in California and Nevada before ending in Los Angeles. The path
|
||
|
displayed in Figure~\ref{fig:map3} contains multiple crossings which
|
||
|
indicate that the solution is suboptimal. The optimal solution generated
|
||
|
by reformulating the problem as a TSP and using Concorde has only a tour
|
||
|
length of $38489$.
|
||
|
|
||
|
\begin{figure}
|
||
|
\centering
|
||
|
\includegraphics[width=10cm, trim=0 30 0 0]{TSP-map3}
|
||
|
\caption{A Hamiltonian path for the USCA312 dataset starting in New York
|
||
|
and ending in Los Angles.}
|
||
|
\label{fig:map3}
|
||
|
\end{figure}
|
||
|
|
||
|
|
||
|
\subsection{Rearrangement clustering}
|
||
|
Solving a TSP to obtain a clustering was suggested several times in the
|
||
|
literature \citep[see, e.g.,][]{Lenstra1974, Alpert1997, Johnson2004}. The idea
|
||
|
is that objects in clusters are visited in consecutive order and from one
|
||
|
cluster to the next larger ``jumps'' are necessary. \cite{Climer2006} call
|
||
|
this type of clustering \emph{rearrangement clustering} and suggest to
|
||
|
automatically find the cluster boundaries of $k$ clusters by adding $k$
|
||
|
\emph{dummy cities} which have constant distance $c$ to all other cities and
|
||
|
are infinitely far from each other. In the optimal
|
||
|
solution of the TSP, the dummy cities must separate the most distant cities and
|
||
|
thus represent optimal boundaries for $k$ clusters.
|
||
|
|
||
|
For the following example, we use the well known iris data set. Since we
|
||
|
know that the dataset contains three classes denoted by the variable
|
||
|
\code{Species}, we insert three dummy cities into the TSP for the iris
|
||
|
data set and perform rearrangement clustering using the default method
|
||
|
(nearest insertion algorithm). Note that this algorithm does not find
|
||
|
the optimal solution and it is not guaranteed that the dummy cities will
|
||
|
present the best cluster boundaries.
|
||
|
%\marginpar{FIXME: Was sagt Concorde dazu?}
|
||
|
|
||
|
<<echo=FALSE>>=
|
||
|
set.seed(4444)
|
||
|
@
|
||
|
<<>>=
|
||
|
data("iris")
|
||
|
tsp <- TSP(dist(iris[-5]), labels = iris[, "Species"])
|
||
|
tsp_dummy <- insert_dummy(tsp, n = 3, label = "boundary")
|
||
|
tour <- solve_TSP(tsp_dummy)
|
||
|
@
|
||
|
|
||
|
Next, we plot the TSP's permuted distance matrix using shading to
|
||
|
represent distances. The result is displayed as
|
||
|
Figure~\ref{fig:clustering}. Lighter areas represent larger
|
||
|
distances. The additional red lines represent the positions of the dummy
|
||
|
cities in the tour, which mark the cluster boundaries obtained.
|
||
|
|
||
|
|
||
|
<<fig=TRUE, include=FALSE, label=clustering>>=
|
||
|
## plot the distance matrix
|
||
|
image(tsp_dummy, tour, xlab = "objects", ylab ="objects")
|
||
|
|
||
|
## draw lines where the dummy cities are located
|
||
|
abline(h = which(labels(tour)=="boundary"), col = "red")
|
||
|
abline(v = which(labels(tour)=="boundary"), col = "red")
|
||
|
@
|
||
|
|
||
|
|
||
|
\begin{figure}
|
||
|
\centering
|
||
|
\includegraphics[width=9cm, height=9cm, trim=0 20 0 0]{TSP-clustering}
|
||
|
\caption{Result of rearrangement clustering using three dummy cities and the
|
||
|
nearest insertion algorithm on the iris data set.}
|
||
|
\label{fig:clustering}
|
||
|
\end{figure}
|
||
|
|
||
|
|
||
|
One pair of red horizontal and vertical lines exactly separates the
|
||
|
darker from lighter areas. The second pair occurs inside the larger
|
||
|
dark block. We can look at how well the partitioning obtained fits the
|
||
|
structure in the data given by the species field in the data set. Since
|
||
|
we used the species as the city labels in the TSP, the labels in the
|
||
|
tour represent the partitioning with the dummy cities named `boundary'
|
||
|
separating groups. The result can be summarized based on the run length
|
||
|
encoding of the obtained tour labels:
|
||
|
|
||
|
<<>>=
|
||
|
out <- rle(labels(tour))
|
||
|
data.frame(Species = out$values,
|
||
|
Lenghts = out$lengths,
|
||
|
Pos = cumsum(out$lengths))
|
||
|
@
|
||
|
|
||
|
|
||
|
One boundary perfectly splits the iris data set into a group containing
|
||
|
only examples of species `Setosa' and a second group containing examples
|
||
|
for `Virginica' and `Versicolor'. However, the second boundary only
|
||
|
separates several examples of species `Virginica' from other examples of
|
||
|
the same species. Even in the optimal tour found by Concorde, this
|
||
|
problem occurs. The reason why the rearrangement clustering fails to
|
||
|
split the data into three groups is the closeness between the groups
|
||
|
`Virginica' and `Versicolor'. To inspect this problem further, we can
|
||
|
project the data points on the first two principal components of the
|
||
|
data set and add the path segments which resulted from solving the TSP.
|
||
|
|
||
|
<<fig=TRUE, include=FALSE, label=clustering2>>=
|
||
|
prc <- prcomp(iris[1:4])
|
||
|
plot(prc$x, pch = as.numeric(iris[,5]), col = as.numeric(iris[,5]))
|
||
|
|
||
|
paths <- cut_tour(tour, cut = "boundary")
|
||
|
for(p in paths) lines(prc$x[p, ])
|
||
|
@
|
||
|
|
||
|
\begin{figure}
|
||
|
\centering
|
||
|
\includegraphics[width=10cm, trim=0 20 0 0]{TSP-clustering2}
|
||
|
\caption{The 3 path segments representing a rearrangement clustering of the
|
||
|
iris data set. The data points are projected on the set's first two principal
|
||
|
components. The three species are represented by different markers and
|
||
|
colors.}
|
||
|
\label{fig:clustering2}
|
||
|
\end{figure}
|
||
|
|
||
|
The result in shown in Figure~\ref{fig:clustering2}. The three species
|
||
|
are identified by different markers and all points connected by a single
|
||
|
path represent a cluster found. Clearly, the two groups to the right
|
||
|
side of the plot are too close to be separated correctly by using just
|
||
|
the distances between individual points. This problem is similar to the
|
||
|
\emph{chaining effect} known from hierarchical clustering using the
|
||
|
single-linkage method.
|
||
|
|
||
|
\section{Conclusion}
|
||
|
\label{sec:conclusion}
|
||
|
|
||
|
In this paper we presented the R extension package \pkg{TSP} which
|
||
|
implements an infrastructure to handle and solve TSPs. The package
|
||
|
introduces classes for problem descriptions (\class{TSP} and
|
||
|
\class{ATSP}) and for the solution (\class{TOUR}). Together with a
|
||
|
simple interface for solving TSPs, it allows for an easy and transparent
|
||
|
usage of the package.
|
||
|
|
||
|
With the interface to Concorde, \pkg{TSP} also can use a state of the
|
||
|
art implementation which efficiently computes exact solutions using
|
||
|
branch-and-cut.
|
||
|
|
||
|
\section*{Acknowledgments}
|
||
|
|
||
|
The authors of this paper want to thank Roger Bivand for providing the
|
||
|
code to correctly draw tours and paths on a projected map.
|
||
|
|
||
|
|
||
|
%
|
||
|
%\bibliographystyle{abbrvnat}
|
||
|
\bibliography{TSP}
|
||
|
%
|
||
|
\end{document}
|
||
|
|