## My “Worst” Layovers

Flying out of a smaller city like Dayton, I’m used to having flight layovers on the way to nearly everywhere I travel. While any layover is going to lengthen a trip, one of the most common complaints I hear from traveling companions is when a layover forces them to fly east to go west, or vice versa.

[All maps in this post are generated by Paul Bogard using the Great Circle Mapper – copyright © Karl L. Swartz]

I started thinking about a way to quantify how bad a layover was, and ultimately decided that it would be best to compare the sum of the (great circle) distances for each of the flights flown compared to the (great circle) distance of a direct flight from the origin to the destination:

${ratio}_{layover} = \dfrac{distance_1+distance_2+\ldots+distance_n}{distance_\text{direct}}$

This would give me a ratio of how much further I flew than I needed to, where a higher ratio would mean a worse layover. A ratio of 2 would mean I flew twice as far as I needed to, a ratio of 3 would mean three times as far, and so on. A ratio of 1 would mean a layover didn’t add any extra distance at all.

## 2018 Year in Travel

In 2018, I visited Australia and New Zealand, each for the first time. Other than that, my travel was largely similar in nature and quantity to 2017 – frequent routine business trips, with a few weekend vacations thrown in.

## Hotels

I stayed in hotels a record 124 nights this year. Business travel was down slightly, but my three-week Australia and New Zealand vacation added a lot of personal hotel nights.

## Flights

I ended up flying 109 flights this year, totaling 87,306 miles (140,505 km).

Maps generated by Paul Bogard using the Great Circle Mapper – copyright © Karl L. Swartz

### New Airports

I visited eight airports for the first time this year:

• #79 – SYD (Sydney, New South Wales, Australia)
• #80 – PER (Perth, Western Australia, Australia)
• #81 – MEL (Melbourne, Victoria, Australia)
• #82 – CHC (Christchurch, New Zealand)
• #83 – DUD (Dunedin, New Zealand)
• #84 – AKL (Auckland, New Zealand)
• #85 – LBB (Lubbock, Texas, United States)
• #86 – PVD (Providence, Rhode Island, United States)

With 86 airports visited to date, I have only 14 to go to reach my goal of visiting 100 airports.

### New Airlines

I flew on two airlines for the first time this year:

### New Aircraft

I flew on three aircraft families for the first time this year; all three were from my Australia and New Zealand vacation.

Aircraft illustrations created by Norebbo

### Superlatives

My longest flight was 8,580 miles (13,808 km) from Dallas to Sydney. This 17–hour flight was the longest I’ve ever been on. I also flew my second-longest flight ever this year: 6,516 miles (10,486 km) from Auckland to Los Angeles.

My shortest flight was 139 miles (223 km) from Dallas to Lawton.

Map generated by Paul Bogard using the Great Circle Mapper – copyright © Karl L. Swartz

## Driving

I drove approximately 22,587 miles (36,350 km) this year – 11,616 miles (18,694 km) in my own car, and 10,971 miles (17,656 km) in rental cars.

Map tiles by CartoDB, under CC BY 3.0. map data © OpenStreetMap contributors under ODbL

## Frequent Traveler Status

This year, I maintained Platinum status with American Airlines and Diamond status with Hilton. I did not earn any other status this year.

## State Abbreviations Graph

In a recent chat that I participated in, we were discussing US two-letter state abbreviations that were one letter off of each other (e.g., NY and NJ).

After that discussion, I was curious about whether it would be possible to step from any state abbreviation to any other by changing one letter at a time, using only valid states along the way. My first step was to determine if there were any state abbreviations which didn’t share a first or last letter with any other states, so I wrote a simple Ruby script to test that.

state_codes = %w(AL AK AZ AR CA CO CT DE FL GA HI ID IL IN IA KS KY LA ME MD MA MI MN MS MO MT NE NV NH NJ NM NY NC ND OH OK OR PA RI SC SD TN TX UT VT VA WA WV WI WY)
state_codes.sort!
one_letter_changes = Hash.new()
state_codes.each do |sc|
one_letter_changes[sc] = state_codes.select{|s| sc != s && (sc[0] == s[0] || sc[1] == s[1])}
puts "#{sc}: #{one_letter_changes[sc].join(", ")}"
end

So every state had at least one other state it could go to. Texas (TX) had the fewest, with only Tennessee (TN); Massachusetts (MA) had the most, as quite a few state codes start with M or end with A.

Now I needed to find out if all the states would connect to each other, or if there would be several distinct “neighborhoods” of states. I decided to do this visually by creating a graph, using the output of my script to draw the connections:

Based on this graph, it is possible for any state abbreviation to change to any other state abbreviation!

I was also curious about the number of steps needed to go between any pair of state abbreviations, so I wrote a path distance algorithm based on Dijkstra’s algorithm (but with each path having equal weight) to find the shortest number of hops between any pair:

state_codes = %w(AL AK AZ AR CA CO CT DE FL GA HI ID IL IN IA KS KY LA ME MD MA MI MN MS MO MT NE NV NH NJ NM NY NC ND OH OK OR PA RI SC SD TN TX UT VT VA WA WV WI WY)
state_codes.sort!
one_letter_changes = Hash.new()
state_codes.each do |sc|
one_letter_changes[sc] = state_codes.select{|s| sc != s && (sc[0] == s[0] || sc[1] == s[1])}
end

def path_distance(graph, source)
vertexes = graph.keys
return nil unless vertexes.include?(source)

distance = Hash.new()
previous_vertex = Hash.new()
arbitrarily_large_distance = vertexes.length
unvisited_vertices = Array.new

vertexes.each do |v|
distance[v] = arbitrarily_large_distance
previous_vertex[v] = nil
unvisited_vertices.push(v)
end
distance = 0;

while(unvisited_vertices.any?)
min_distance_vertex = unvisited_vertices.min_by{|v| distance[v]}

graph[min_distance_vertex].each do |neighbor|
alt = distance[min_distance_vertex] + 1
if alt < distance[neighbor]
distance[neighbor] = alt
previous_vertex[neighbor] = min_distance_vertex
end
end
unvisited_vertices -= [min_distance_vertex]
end

return distance

end

state_codes.each do |code|
values = path_distance(one_letter_changes, code).sort_by{|k,v| k}.reject{|k,v| k > code}.map{|d| d[1]}
puts "#{code}  #{values.join("  ")}"
end
puts "   #{state_codes.join(" ")}"

Based on the results, the highest number of hops is 6 – so every state abbreviation can be changed into any other state abbreviation in at most six steps!

## Flights

With 113 total flights, this was a record flying year for me – the first year I’ve ever exceeded 100 flights. My work flights alone this year exceeded my total flights last year.

## Hotels

My hotel nights were pretty consistent with the prior three years; I ended the year with 109 total nights.

## New Airports

I only visited five new airports this year, which puts me at a total of 78 airports visited so far.

Jacksonville, NC (OAJ)
Destin/Fort Walton Beach (VPS)
Bakersfield (BFL)
Tampa (TPA)
Peoria (PIA)

Peoria wasn’t a planned visit – we ended up diverting there and deplaning due to weather in Chicago.

## Elite Status

I maintained American Platinum and Hilton Diamond this year, and earned Silver status for both United and Marriott.

So, for the first time, I have legitimate Marriott status – my previous Marriott Gold was a reward for having Gold status on United.

## Counting Visits to Airports: The Significance of Trip Sections

My Flight Historian is by no means the only personal flight tracking website. I could have easily tracked my flights on an existing site:

So why did I go to the trouble of writing my own flight tracking application rather than just use an existing one? My primary reason was to gain experience in a new programming language, but the reason I decided to write a flight tracker rather than any other project was that I disagreed with the way the available flight trackers count airports.

## 2015 Year in Travel

2015 was a relatively strong year for me for business travel, with the first and last thirds of the year being particularly busy. Due to that, my total flights and hotel nights just edged above 2014’s numbers, for another record year.

## 2015 Flights

I had 89 flights this year – 79 for work and 12 personal.

I didn’t take as many personal flights this year, but travel for my job more than made up for the difference.

## 2015 Hotel Nights

That’s not to say that I didn’t do a lot of personal travel, but a lot of those personal trips were by car. I came out with 30 personal hotel nights and 79 business nights, for a total of 109 nights.

## New Airports

I’ve visited six new airports this year:

I ended the year with 60 total airports visited, and am well on my way to my goal of visiting 100 airports.

## Elite Status

My flights were much more spread out among airlines this year, so I ended up getting the lowest tier status on two airlines (Gold on American Airlines and Silver on United) rather than last year’s mid-tier status on one airline. For hotels, I was easily able to pick up the 60 nights required for Diamond status with Hilton, and I even managed to pick up enough Marriott nights to get Silver. (Last year, my United Gold status gave me Marriott Gold status as well, even though I barely stayed with them.)