Analyzing the board game Ticket to Ride as an undirected graph for various problems

View the Project on GitHub

Ticket to Ride - Graph Analysis

Analyzing the board game Ticket to Ride as an undirected graph.

Run via cargo run.


Data is included in the mattgawarecki-ticket-to-ride folder. This data was pulled from https://data.world/mattgawarecki/ticket-to-ride under the terms of the MIT license.

Current Functionality

Determines the most efficient tickets by creating a ratio of the number of trains required to complete the ticket to the number of points earned from completing the ticket. A lower number is better, as less trains are required to earn a point. For example:

While some inconsistencies exist, most tickets have a 1:1 ratio. It may be advantageous to exploit some of these differences, but the difference in points may also be due to factors not currently accounted for in this analysis, such as length of routes used to complete the ticket, routes with more than one path, and the likelihood that a ticket will be closed off, ex. single point of failure vs. tickets with multiple workarounds.

This is the default implementation of the library, and can be run via

cargo run

Individual library demos

View how individual modules work. Args can be combined.

./target/debug/ticket-to-ride --route
./target/debug/ticket-to-ride --ticket
./target/debug/ticket-to-ride --matrix
./target/debug/ticket-to-ride --graph

Future Work

I’m considering this repository done for the most part, as an accurate analysis of the most efficient routes would need to consider various other factors that would require exponentially more work. I’ve accomplished what I set out to do, which was:

Ideas for future expansion are presented below but should not be expected to be implemented.

Most Efficient Routes Improvements

Easiest Routes

Find the routes with the best point value per difficulty.

Rust refactoring

Many complexities of rust memory management have been worked around via the .clone() function. While this may be acceptable, and even preferable, in some of its uses in this project, there are likely opportunities to reduce its usasge and write more performant and idiomatic Rust code while still maintaining functionality.