Skip to main content
Log in

The time dependent traveling salesman problem: polyhedra and algorithm

  • Full Length Paper
  • Published:
Mathematical Programming Computation Aims and scope Submit manuscript

Abstract

The time dependent traveling salesman problem (TDTSP) is a generalization of the classical traveling salesman problem (TSP), where arc costs depend on their position in the tour with respect to the source node. While TSP instances with thousands of vertices can be solved routinely, there are very challenging TDTSP instances with less than 100 vertices. In this work, we study the polytope associated to the TDTSP formulation by Picard and Queyranne, which can be viewed as an extended formulation of the TSP. We determine the dimension of the TDTSP polytope and identify several families of facet-defining cuts. We obtain good computational results with a branch-cut-and-price algorithm using the new cuts, solving almost all instances from the TSPLIB with up to 107 vertices.

This is a preview of subscription content, log in via an institution to check access.

Access this article

Price excludes VAT (USA)
Tax calculation will be finalised during checkout.

Instant access to the full article PDF.

Institutional subscriptions

Fig. 1
Fig. 2
Fig. 3
Fig. 4
Fig. 5
Fig. 6
Fig. 7
Fig. 8

Similar content being viewed by others

References

  1. Applegate, D., Bixby, R., Chvátal, V., Cook, W.: On the solution of traveling salesman problems. Documenta Mathematica. Extra Volume ICM 3, 645–646 (1998)

    Google Scholar 

  2. Balas, E., Carr, R., Fischetti, M., Simonetti, N.: New facets of the STS polytope generated from known facets of the ATS polytope. Discrete Optim. 3, 3–19 (2006)

    Article  MathSciNet  MATH  Google Scholar 

  3. Balas, E., Fischetti, M.: Polyhedral theory for the ATSP. In: Gutin, G., Punnen, A. (eds.) The Traveling Salesman Problem and Its Variations, pp. 117–168. Kluwer, Dordrecht (2002)

  4. Bigras, L.-Ph., Gamache, M., Savard, G.: The time-dependent traveling salesman problem and single machine scheduling problems with sequence dependent setup time. Discrete Optim. 5, 685–699 (2008)

    Google Scholar 

  5. Dantzig, G.B., Fulkerson, D.R., Johnson, S.M.: Solution of a large-scale traveling salesman problem. Oper. Res. 2, 393–410 (1954)

    Article  MathSciNet  Google Scholar 

  6. Fischetti, M., Laporte, G., Martello, S.: The delivery man problem and cumulative matroids. Oper. Res. 41, 1055–1064 (1993)

    Article  MathSciNet  MATH  Google Scholar 

  7. Fox, K., Gavish, B., Graves, S.: An n-constraint formulation of the (time dependent) traveling salesman problem. Oper. Res. 28, 101–102 (1980)

    Article  MathSciNet  Google Scholar 

  8. Gale, D.: A theorem of flows in networks. Pacif. J. Math. 7, 1073–1082 (1957)

    Article  MathSciNet  MATH  Google Scholar 

  9. Godinho, M.T., Gouveia, L., Pesneau, P.: Natural and extended formulations for the time- dependent travelling salesman problem, CIO Report8/2010, Lisbon (2010)

  10. Gouveia, L., Voss, S.: A classification of formulations for the (time-dependent) traveling salesman problem. Eur. J. Oper. Res. 83, 69–82 (1995)

    Article  MATH  Google Scholar 

  11. Gouveia, L., Simonetti, L., Uchoa, E.: Modeling hop-constrained and diameter-constrained minimum spanning tree problems as Steiner tree problems over layered graphs. Math. Program. Online first (2009)

  12. Groetschel, M., Padberg, M.: On the symmetric traveling salesman problem II: lifing theorems and facets. Math. Program. 16, 281–302 (1979)

    Article  MATH  Google Scholar 

  13. Groetschel, M., Padberg, M.: Polyhedral theory. In: Lawler, E.L., Lenstra, J.K., Rinnooy Kan, A.H.G. (eds.) The Traveling Salesman Problem, pp. 251–305. Wiley, New York (1985)

  14. Hall, P.: On representatives of subsets. J. Lond. Math. Soc. 10, 26–30 (1935)

    Article  Google Scholar 

  15. Hoffman, A.: Some recent applications of the theory of linear inequalities to extremal combinatorial analysis. Proc. Symp. Appl. Math. 10, 113–128 (1960)

    Article  Google Scholar 

  16. Irnich, S., Villeneuve, D.: The shortest path problem with resource constraints and \(k\)-cycle elimination for \(k\ge 3\). INFORMS J. Comput. 18, 391–406 (2006)

    Article  MathSciNet  MATH  Google Scholar 

  17. Lucena, A.: Time-dependent traveling salesman problem—the deliveryman case. Networks 20, 753–763 (1990)

    Article  MathSciNet  MATH  Google Scholar 

  18. Méndez-Díaz, I., Zabala, P., Lucena, A.: A new formulation for the traveling deliveryman problem. Discrete Appl. Math. 156, 3233–3237 (2008)

    Google Scholar 

  19. Melo, M., Subramanian, A.: Personal communication (2010)

  20. Miranda Bront, J.J., Méndez-Díaz, I., Zabala, P.: An integer programming approach for the time dependent traveling saleman problem. Electron. Notes Discrete Math. 36, 351–358 (2010)

    Article  Google Scholar 

  21. Niskanen, S., Ostergard, P.R.J.: Cliquer users guide. Helsinki University of Technology. Communications Laboratory, Technical report 48 (2003)

  22. Padberg, M.: On the facial structure of set packing polyhedra. Math. Program. 5, 199–215 (1973)

    Article  MathSciNet  MATH  Google Scholar 

  23. Picard, J., Queyranne, M.: The time-dependent traveling salesman problem and its application to the tardiness problem in one-machine scheduling. Oper. Res. 26, 86–110 (1978)

    Article  MathSciNet  MATH  Google Scholar 

  24. Pessoa, A., Poggi de Aragão, M.: Robust branch-cut-and-price algorithms for vehicle routing problems. In: Golden, B., Raghavan, S., Wasil, E. (eds.) The Vehicle Routing Problem: Latest Advances and New Challenges, pp. 297–326. Springer, New York (2008)

    Chapter  Google Scholar 

  25. Pessoa, A., Uchoa, E., Poggi de Aragão, M.: A robust branch-cut-and-price algorithm for the heterogeneous fleet vehicle routing problem. Networks 54, 167–177 (2009)

    Article  MathSciNet  MATH  Google Scholar 

  26. Pessoa, A., Uchoa, E., Freitas, R.: Exact algorithm over an arc-time indexed formulations for parallel machine scheduling problems. Math. Program. Comput. 2, 259–290 (2010)

    Article  MathSciNet  MATH  Google Scholar 

  27. Ralphs, T.K., Ladányi, L.: COIN/BCP User’s Manual. http://www.coin-or.org/Presentations/bcp-man.pdf (2001)

  28. Vajda, S.: Mathematical Programming. Addison-Wesley, New York (1961)

    MATH  Google Scholar 

  29. Vander Wiel, R.J., Sahinidis, N.V.: An exact solution approach for the time-dependent traveling salesman problem. Naval Res. Logist. 43, 797–820 (1996)

    Article  MathSciNet  MATH  Google Scholar 

Download references

Author information

Authors and Affiliations

Authors

Corresponding author

Correspondence to Ricardo Fukasawa.

Additional information

Hernán Abeledo was partially supported by CNPq Pesquisador-Visitante 300034/2007-5 grant. Ricardo Fukasawa was partially supported by an NSERC Discovery grant. Artur Pessoa and Eduardo Uchoa were partially supported by CNPq and Faperj grants.

Appendix

Appendix

1.1 Proof of Theorem 4

Proof that (9) defines a facet of \(\varvec{P(n)}\)

We prove by induction on \(n\) and on \(|S|\) that there are \(n(n-1)(n-2)\) linearly independent (LI) s-paths that satisfy (9) as equality. We first establish that (9) defines a facet of \(P(n)\) for \(|S|=3\) and \(n \ge 6\). We can assume without loss of generality that \(S=\{1,2,3\}\). The induction basis is obtained computationally for \(n = 6\) and \(|S| = 3\).

The induction asserts there are \(n(n-1)(n-2)\) LI s-paths in \(G(n)\) that satisfy (9) as equality. We show below how to construct \((n+1)n(n-1)\) LI paths in \(G(n+1)\) that satisfy (9) as equality. We divide the set of LI paths to be constructed into 5 cases.

  1. 1.

    s-paths contained in \(G(n)\) except for the last arc incident to node \((n+1,n+1)\);

  2. 2.

    s-paths that begin at node \((n+1,1)\) and whose last arc \((i,j,n)\) is not of the form \(i \not \in S\) and \(j \in S\);

  3. 3.

    s-paths that contain node \((n+1,t)\), where \(1 < t \le |S|\), and whose last arc \((i,j,n)\) does not satisfy \(i \not \in S\) and \(j \in S\);

  4. 4.

    s-paths that contain node \((n+1,t)\), where \(|S| < t \le n\), and whose last arc \((i,j,n)\) does not satisfy \(i \not \in S\) and \(j \in S\);

  5. 5.

    s-paths whose last arc \((i,j,n)\) satisfies \(i \not \in S\) and \(j \in S\).

For case 1, we note that the \(n(n-1)(n-2)\) LI s-paths in \(G(n)\) can be extended in the same way as in the proof of Theorem 1. If an s-path in \(G(n)\) ends at an arc \((i,j,n-1)\), with \(j \in S\), then this arc contributes to the left-hand side of (9) for \(G(n)\) but not for \(G(n+1)\). In this case, the arc \((j,n+1,n)\) appended to the s-path replaces \((i,j,n)\) in the left-hand side of (9). On the other hand, if an s-path in \(G(n)\) ends at an arc \((i,j,n-1)\), with \(j \not \in S\), then this arc does not contribute to the left-hand side of (9) for \(G(n)\). In this case, the arc \((j,n+1,n)\) appended to the s-path also does not contribute to the left-hand side of (9). Hence, all these LI paths in \(G(n+1)\) satisfy (9) as equality. As in the proof of Theorem 1, we need to find an additional set of \(3n^2 - 3 n\) LI paths and there are still \(3n^2 - 2 n\) unused new arcs (so we have \(n\) “spare” arcs left).

For case 2, there are \(n^2 - (n - |S|)|S|\) new arcs that can be used. We will construct \(n^2 - (n - |S|)|S| - 1\) s-paths, each one using one arc not used before, thus consuming one “spare” arc. To proceed, we choose \(n^2 - (n - |S|)|S| - 1\) pairs of arcs, each pair containing one arc in layer 1 and one arc in layer \(n\). These arc pairs are chosen in the same way as in the proof of Theorem 1, but leaving out the pairs that contain a forbidden arc \((i,j,n)\) with \(i \not \in S\) and \(j \in S\). Next, for each selected pair of arcs, we build an s-path that contains these two arcs and satisfies (9) with equality. We do as follows: if \(k \not \in S\) and \(i \in S\) (and the arcs \((n+1,k,1)\) and \((i,j,n)\) are used), then complete the s-path in such a way that it enters the set \(S\) only once (either in layer \(n-2\) or \(n-3\) depending whether \(j \in S\) or not). If \(i,j,k \not \in S\), then complete the s-path in such a way that it enters and leaves the set \(S\) only once, between the layers 1 and \(n\). If \(k \in S\) and \(i \in S\), then complete the s-path in such a way that it leaves the set \(S\) in the layer 2 and enters it only once more (either in layer \(n-1\) or \(n-2\) depending whether \(j \in S\) or not). If \(k \in S\) and \(i,j \not \in S\), then complete the s-path in such a way that it leaves the set \(S\) only in the layer 4, after all node indices of \(S\) have been used.

For case 3, for any pair of node indices \(i,j\), with \(i \ne j\), one can always find an s-path that uses the arcs \((i,n+1,t-1)\) and \((n+1,j,t)\) and satisfies (9) with equality as follows. Before the layer \(t\), complete the s-path in any valid way. After the layer \(t\), complete the s-path in such a way that it enters the set \(S\) only once and before the layer \(n\). For that, it must leave the set \(S\) only after all its node indices have already been visited. Then, one can choose the pairs of arcs \((i,n+1,t-1)\) and \((n+1,j,t)\) in the same way as in proof of Theorem 1.

For case 4, we choose arc pairs \((i,n+1,t-1)\) and \((n+1,j,t)\) in a similar way as in proof of Theorem 1. We first fix the incoming arc \((n,n+1,t-1)\). This arc can be combined with an outgoing arc of the form \((n+1, j, t)\) for \(j=1, \dots , n-1\) to be part of an s-path of \(G(n+1)\). Similarly, outgoing arc \((n+1,n-1,t)\) can be combined with incoming arcs of the form \((i,n+1,t-1)\) for \(i=1,\dots ,n-2\) to produce \(n-2\) s-paths. Pairing arc \((1,n+1,t-1)\) with \((n+1,n,t)\) yields one more path. Finally, we combine arcs \((n-1,n+1,t-1)\) and \((n+1,1,t)\) to obtain the last s-path. Note that we never combine a pair of arcs where both endpoints \(i,j \in S\). For each chosen pair of arcs, we build an LI s-path that use both arcs \((i,n+1,t-1)\) and \((n+1,j,t)\) and satisfy (9) with equality as follows. If \(j \not \in S\) and either \(i \in S\) or \(t = n\), then complete the s-path before the layer \(t\) in such a way that all node indices of \(S\) are visited. Then, after the layer \(t\), complete the s-path in any valid way (e.g. without entering \(S\) again). If \(j \in S\) or both \(i \not \in S\) and \(t < n\), then complete the s-path before the layer \(t\) in such a way that exactly \(|S|-1\) node indices of \(S\) are visited in the layers \(1,\ldots ,|S|-1\). In this case, leave the set \(S\) in the layer \(|S|-1\) and enter it only after visiting the node \((n+1,t)\), to visit the only remaining node index in \(S\).

For case 5, we build the remaining \((n - |S|)|S|\) LI s-paths by visiting exactly \(|S|-1\) node indices of \(S\) in the layers \(1,\ldots ,|S|-1\), leaving the set \(S\) in the layer \(|S|-1\), and entering it only in the arc layer \(n\), through each chosen arc \((i,j,n+1)\), to visit the only remaining node index in \(S\).

Having established that (9) defines a facet for \(|S| = 3\) and \(n \ge 6\), we now prove by induction that the result also holds for \(|S| \ge 3\). Assume without loss of generality that \(S=\{n-|S|+1,\ldots ,n\}\). Now, by Lemma 5 it is equivalent to consider instead constraint (8).

Let \(n \ge 6\) and \(|S| \ge 3\). By induction, there are \(n(n-1)(n-2)\) LI s-paths in \(G(n)\) that satisfy (8) as equality. We show how to construct \((n+1)n(n-1)\) LI paths in \(G(n+1)\) that satisfy (8) as equality, where \(S\) is replaced by \(S^{\prime } = S \cup \{n+1\}\).

We divide the set of LI paths we construct into 4 cases.

  1. 1.

    s-paths contained in \(G(n)\) except for the last arc incident to node \((n+1,n+1)\);

  2. 2.

    s-paths that begin at node \((n+1,1)\);

  3. 3.

    s-paths that contain node \((n+1,t)\), where \(1 < t \le n-|S|\);

  4. 4.

    s-paths that contain node \((n+1,t)\), where \(n-|S| < t \le n\).

For case 1, we note that the \(n(n-1)(n-2)\) LI s-paths in \(G(n)\) can be extended in the same way as in proof of Theorem 1. This is true because the coefficients of all arcs of \(G(n)\) in (8) do not change when extending the graph to \(G(n+1)\) and replacing the set \(S\) by \(S^{\prime }\). Moreover, all arcs incident to node \((n+1,n+1)\) have null coefficients in (8).

For case 2, we note that for each pair of arcs \((n+1,j,1)\) and \((k,l,n)\), we can always find an s-path that does not enter the set \(S\) before the arc layer \(n-1\). For that, one must complete the s-path that starts with the arc \((n+1,j,1)\) by visiting all the vertices in \(S\) (except \(k\) and \(l\)) before leaving this set. Such s-path satisfies (8) as equality. Hence, the pairs of arcs can be chosen as in proof of Theorem 1. This generates \(n^2 -1\) s-paths.

For cases 3 and 4, we note that for each pair of arcs \((i,n+1,t-1)\) and \((n+1,j,t)\), we can always find an s-path that satisfies (8) as equality. For case 3, the s-path can visit as many vertices out of \(S\) as possible before the node layer \(t\). After the node layer \(t\), it must leave \(S\) as soon as possible, and enter \(S\) again, if necessary, only after the arc layer \(n-|S|\). For case 4, we have two subcases: \(i \in S\) and \(i \notin S\). In both subcases, the s-path can leave the set \(S\), after the node layer \(t\) as soon as possible. Before the node layer \(t\), If \(i \in S\), the s-path can enter the set \(S\) only once, exactly \(|S|\) arc layers before it leaves this set. If \(i \notin S\), the s-path can visit in the first layers all vertices of \(S\) not visited after the node layer \(t\). Then, it can leave the set \(S\) and enter it again exactly in the arc layer \(t-1\). In both cases 3 and 4, The pairs of arcs are chosen as in proof of Theorem 1, which generates \(2n - 1\) s-paths for each \(t\).

This gives the necessary \((n+1)n(n-1)\) LI s-paths, completing this proof. \(\square \)

Proof that the facets defined by (8) and (9) are different

We start by showing that each facet defined by (8) is different. Let \(S\ne S^{\prime }\). Assume without loss of generality that \(|S^{\prime }|\le |S|\). Notice that this implies that \(S\not \subseteq S^{\prime }\).

If \(|S^{\prime }\cap S| \ge 2\) then, pick an s-path that goes through vertex \((i,1)\) for \(i\in S^{\prime }\cap S\) then goes to vertex \((j,2)\) for \(j\in S{\setminus } S^{\prime }\) and then goes to vertex \((k,3)\) for \(k\in (S^{\prime }\cap S) {\setminus }\{i\}\) and finally goes through all the remaining vertices in \(S\) at positions \(4,\ldots ,|S|\). Such an s-path satisfies (8) for \(S\) at equality. Moreover it enters \(S^{\prime }\) once at position 1 and once at position 3. Since \(|S^{\prime }|\le n-3\), then \(n-|S^{\prime }|\ge 3\) and so this s-path does not satisfy (8) for \(S^{\prime }\) at equality.

So we may assume that \(|S^{\prime }\cap S| \le 1\). Then consider an s-path that goes through vertex \((k,1)\) for \(k\in S^{\prime }\) (if there is a vertex in \(S^{\prime }\cap S\), then let \(k\) be that vertex), then goes to vertex \((j,2)\) for \(j\in S {\setminus } S^{\prime }\) and then goes through all vertices in \(S^{\prime }{\setminus }\{k\}\) from positions 3 to \(3+|S^{\prime }|-|S\cap S^{\prime }|-1\). Notice that at this point we have visited \(|S^{\prime }\cap S|+1\) vertices in \(S\) and \(|S^{\prime }|-|S\cap S^{\prime }|\) vertices outside \(S\). Therefore there are \(n-|S^{\prime }|-1\) vertices remaining to be visited, with \(|S|-(|S\cap S^{\prime }|+1)\) of them in \(S\). So then let the s-path go through all remaining vertices in \(N{\setminus } S\). Note that there are a total of \(t^{\prime }=n-|S^{\prime }|-1-(|S|-(|S\cap S^{\prime }|+1))= n-|S^{\prime }|-|S| + |S\cap S^{\prime }|\) vertices not visited in \(N{\setminus } S\). Therefore, these vertices will be visited from positions \(3+|S^{\prime }|-|S\cap S^{\prime }|\) to \(3+|S^{\prime }|-|S\cap S^{\prime }|+t^{\prime }-1=3+|S^{\prime }|-|S\cap S^{\prime }|+ n-|S^{\prime }|-|S|+|S\cap S^{\prime }|-1 = n-|S|+2\). Finally, the s-path will visit all remaining vertices in \(S\).

Notice that this s-path enters \(S^{\prime }\) at least twice before position 3, and since \(|S^{\prime }|\le n-3\), we have \(n-|S^{\prime }| \ge 3\) so (8) is not satisfied at equality for \(S^{\prime }\). Also, this s-path enters \(S\) exactly once from position 1 until position \(n-|S|+2\). Therefore, the next time it enters \(S\) it does so by using an arc in a layer \(t>n-|S|\). So this s-path satisfies (8) at equality.

The fact that each constraint (9) defines a distinct facet of \(P(n)\) follows trivially. Now all that is left is to prove that (8) and (9) define distinct facets.

Consider (8) for a set \(S\) and (9) for a set \(S^{\prime }\).

Assume without loss of generality that \(\{1,2,3\}\subseteq S\). We may also assume that \(4 \notin S\).

But then, consider an s-path that goes through node (1,1), (4,2), (2,3) and then through all remaining nodes in \(S^{\prime }{\setminus }\{1,2,4\}\) at positions 4 to \(3+|S^{\prime }{\setminus }\{1,2,4\}|\). This s-path does not satisfy (8) at equality. However, it leaves \(S^{\prime }\) only once at positions \(t\ge |S^{\prime }|\) since \(3+|S^{\prime }{\setminus }\{1,2,4\}| \ge 3 + |S^{\prime }|-3 = |S^{\prime }|\) and hence satisfies (9) at equality. \(\square \)

1.2 Proof of Lemma 7

Case \(|\{i,j\} \cap S | \le 1\). We can assume without loss of generality that \(s < t\), thus either \(t=s + 1\) or \(s=1\) and \(t = n-1\). Since \(n \ge 7\) there are at least 3 layers of \(G(n)\) with arcs in \(\mathcal I (S,p)\). Thus, at least one of these layers has an index \(r\) satisfying \(|r - s| > 1\) and \(|r - t| > 1\). Choose \(c = (q_1, q_2, r) \in \mathcal I (S,p)\) such that \(q_1,q_2 \in S {\setminus } \{i,j\}\). Note that one can find an s-path containing arcs \(a\), \(b\) and \(c\).

Case \(i,j \in S\). Note that in this case it must be that \(s=1\) and \(t = n-1\), since otherwise either \(k \in S\) or \(l \in S\), contradicting the hypothesis of this lemma. If \(a \in \mathcal I (S,p)\), we are done. Alternatively, \(a \not \in \mathcal I (S,p)\), which implies that \(p=1\), and hence \(\mathcal I (S,p)\) does not contain arcs from layer 1. Then, since \(\mathcal I (S,p)\) is an alternating independent set, it must contain the set of arcs \(A(S,2)\) from layer 2. Let \(k\) be the unique element in \(S {\setminus } \{i,j\}\) and let \(c = (j, k, 2) \in \mathcal I (S,p)\). Again, one can find an s-path containing arcs \(a\), \(b\) and \(c\). \(\square \)

1.3 Proof of Theorem 5

We need to find \(n(n-1)(n-2)\) linearly independent s-paths that satisfy (10) as equality. Without loss of generality, we may assume \(S= \{4,5,6\}\). Our proof follows by induction and follows closely the proof of Theorem 1. For \(n =7\), the two types of alternating independent sets to consider are cases 1 and 2, which by symmetry are equivalent. To establish the basis for the induction, one can prove computationally that inequality (10) for case 1 defines a facet by generating the incidence vectors of all s-paths that satisfy it as equation and using Gaussian elimination to verify that 210 LI paths can be chosen from this set.

Let \(n \ge 7\). By induction, there are \(n(n-1)(n-2)\) LI s-paths in \(G(n)\) that satisfy (10) as equality. We show how to construct \((n+1)n(n-1)\) LI paths in \(G(n+1)\) that satisfy (10) as equality. We divide the set of LI paths to be generated into 3 cases.

  1. 1.

    s-paths contained in \(G(n)\) except for the last arc incident to node \((n+1,n+1)\);

  2. 2.

    s-paths that begin at node \((n+1,1)\);

  3. 3.

    s-paths that contain node \((n+1,t)\), for \(2 \le t \le n\).

Case 1. These paths are obtained by extending the \(n(n-1)(n-2)\) paths in \(G(n)\) that satisfy (10) as equality by appending an arc incident to node \((n+1,n+1)\). Cases 2 and 3 are constructed in the same fashion as in Theorem 1. By Lemma 7, these s-paths can be constructed to satisfy (10) as equality. \(\square \)

Rights and permissions

Reprints and permissions

About this article

Cite this article

Abeledo, H., Fukasawa, R., Pessoa, A. et al. The time dependent traveling salesman problem: polyhedra and algorithm. Math. Prog. Comp. 5, 27–55 (2013). https://doi.org/10.1007/s12532-012-0047-y

Download citation

  • Received:

  • Accepted:

  • Published:

  • Issue Date:

  • DOI: https://doi.org/10.1007/s12532-012-0047-y

Keywords

Mathematics Subject Classification (2000)

Navigation