ALTO

Methods

ALTO assigns Alaska Airlines' daily aircraft turns at Seattle‑Tacoma to gates, prices what a disruption costs, and measures how much of that cost re-optimizing recovers. This page is the full account: the formulation, the data, the mistakes found along the way, the validation, and the things it cannot tell you.

1 · The data 2 · Building turns 3 · The towing rule 4 · The model 5 · Validation 6 · The cost model 7 · Disruption 8 · What this cannot tell you

1 · The data

Every flight comes from the U.S. Bureau of Transportation Statistics Airline On-Time Performance dataset for 2023, filtered to carrier code AS with either origin or destination SEA. That is 139,000 flight records, of which 155,246 leg-records survive after removing cancellations and diversions.

BTS is used because it is the only public source with actual wheels-down and pushback times, not just scheduled ones. Gate occupancy depends on when aircraft really arrived.

All times are converted to absolute minutes since 1 January 00:00. BTS stores clock times as HHMM integers, where comparing 1438 on the 15th against 0410 on the 16th gives the wrong order and every overnight turn becomes a special case. One integer per moment removes that entire class of bug.

Arrivals crossing midnight are corrected: BTS stamps a flight with its departure date, so a red-eye landing at 04:10 records that time against the previous day. Detected by an arrival clock time earlier than its departure clock time.

2 · Building turns, and the bug that broke the first attempt

A turn is one aircraft's ground visit: it lands, sits at a gate, and departs. The first version of this project built turns with a pandas merge on tail number and date. That is a cartesian join, and it is wrong.

One aircraft, one day

Tail N434AS, 15 July 2023, came through Seattle twice:

TimeEvent
14:38arrives from JFK
15:51departs for SFO
21:47arrives from SFO
23:28departs for JFK

Two visits. The merge produced four pairings, and the follow-up filter caught only one of the bad ones:

PairingGround timeVerdict
14:38 → 15:5173 minreal
14:38 → 23:28530 mininvented, and kept
21:47 → 15:51removed by the time filter
21:47 → 23:28101 minreal
Why this mattered

The model believed N434AS blocked a gate from mid-afternoon until nearly midnight, while the aircraft was in fact in San Francisco. Across the dataset that inflated 2023 from 75,347 turns to 79,052, pushed the 75th-percentile turn from 106 minutes to 305, and drove peak simultaneous gate demand on 15 July from 29 to 76.

Alaska has 57 gates. Peak demand of 76 makes the assignment problem infeasible — not slow, infeasible. No valid answer exists, and the solver correctly refused to produce one.

The fix is to stop treating a day as a bag of arrivals and a bag of departures, and instead walk each aircraft's timeline in order: pair every arrival with the next unclaimed departure by the same tail, removing each departure from the pool once used. The phantom turn is never constructed rather than filtered out afterwards.

It was found by sanity-checking the turn-time distribution against how long a 737 actually sits at a gate. A 75th percentile of five hours is not a turnaround.

What gets discarded

RuleReasonCount
Ground time under 20 minutesPhysically impossible for a 737; a bad time in the source5
Gap over 36 hoursToo long to be one visit — the aircraft left on a flight not in our data2,071
No matching departureFlew in and never flew out within the data103

The 36-hour cutoff is supported by the tariff: the Port of Seattle charges $200 per 12-hour period for overnight parking and $5,000 per 12-hour period beyond 24 hours. Aircraft do not sit.

3 · The towing rule

An aircraft parked at a gate blocks a revenue-generating asset. When a plane arrives at 2pm and does not leave until 9pm, no airline leaves it there — a tug moves it to a remote hardstand and brings it back for boarding.

ALTO therefore distinguishes a turn (a ground visit) from a gate block (time that actually requires a gate). A turn longer than the threshold becomes two blocks: an hour on arrival for deplaning and servicing, an hour before departure for boarding, with the aircraft off-gate in between.

The threshold is derived from published prices, not chosen:

gate time value = $552.89 per narrowbody turn ÷ 90 min median = $6.14 / minute
towing frees = ground_minutes − 120
towing pays when = (ground_minutes − 120) × $6.14 > $100 hardstand fee
break-even = 136 minutes

ALTO uses 180 minutes, deliberately conservative — it leaves room for costs the tariff does not price: tug crews, ramp congestion, and the risk of not getting the aircraft back in time to board.

This single rule decides whether the model works
Gate blocksMedian daily peakWorst dayDays over 57 gates
Towing off75,347497363 of 365
Tow after 180 min97,37727340

Without remote parking, Alaska's mainline operation would have exceeded its gate count on 63 days of 2023. Remote parking is what makes 57 gates sufficient.

4 · The model

Two solvers run the same problem. One is fast enough to sit behind a slider; the other is the literal statement of the problem and is used to prove the first one right.

The integer program — the honest statement

Variables
  x[b,g] = 1 if block b is parked at gate g, else 0
  y[g]   = 1 if gate g is used at all that day, else 0

Minimize   M · Σg y[g] + Σb,g walk[g] · x[b,g]

Subject to
  Σg x[b,g] = 1             ∀ b    every block gets exactly one gate
  Σb∈Q x[b,g] ≤ y[g]    ∀ Q, g  blocks on the ground together cannot share a gate
  y[g] ≥ y[g+1]           ∀ g    symmetry breaking

M is set above the largest walking cost the day could possibly incur, so no amount of walking can ever justify an extra gate. That makes it a lexicographic objective — rank the goals rather than blending them — expressed as a single sum.

Two things make it tractable. Q ranges over maximal groups of mutually overlapping blocks rather than over pairs: gate occupancy forms an interval graph, so every group of overlapping blocks is already fully present when one of them starts. On 15 July that is 125 group constraints instead of 4,398 pairwise ones, and each is a tighter statement. And symmetry breaking stops the solver proving that thousands of gate relabellings are equally good.

The network flow — the fast one

Forget gates and think about chains. A gate holds one aircraft, then another, then another. So "the fewest gates" is the same question as "the fewest chains covering every block" — a minimum-cost path cover, which is a network flow, which solves in milliseconds.

each block becomes two nodes, a front door and a back door

SOURCE → in[i]    open a gate for block i    cost: high
out[i] → in[j]    j follows i on the same gate cost: idle minutes
out[i] → SINK     i is last on its gate       cost: 0
SINK → SOURCE     the return pipe — its flow IS the number of gates

Each block requires exactly one unit into its front door and one out of its back door, which forces the result to be a set of clean, non-overlapping chains. Chains are then paired with named gates by the Hungarian algorithm.

A 10-minute buffer between consecutive aircraft at a gate is applied identically in the conflict test, the flow network, and the peak-demand count. If the three used different buffers, comparing them would prove nothing.

5 · Validation

A millisecond answer is only acceptable if it is also the right answer. Three independent methods run on the same days:

Result

16 of 16 days agree on the number of gates — spread across quiet February weekdays, July 4th, Thanksgiving, Christmas Eve, and the busiest day in the dataset. Network flow averages 0.3 seconds against the integer program's 12, a speedup of 24× to 60×.

Where the fast solver is worse, and why we say so

Gate count is optimal in both. Walking cost is 9.3% worse in the network flow model, on all 16 days.

The cause is structural. Flow treats every gate as interchangeable, so it builds chains first and assigns gate names afterwards. The integer program chooses chains and names together and reaches arrangements flow cannot. The chain-to-gate pairing is already provably optimal given the chains — the gap lives in the chain structure, which per-gate costs cannot influence. It cannot be closed inside the flow model.

Rather than quietly serving the worse answer, the model page offers a Solve exactly control that runs the integer program and shows the difference.

6 · The cost model

Every figure is published and sourced. Anything derived says so.

ParameterValueSource
Delay cost$98.41 / minA4A 2025 direct aircraft operating cost per block minute
Common-use gate, narrowbody$552.89 / turnPort of Seattle tariff, 1 Jan 2025, signatory rate
Remote hardstand$100 / usePort of Seattle tariff
Gate idle time$6.14 / minDerived — $552.89 ÷ 90-minute median turn
Delay propagation0.75Assumption — no published figure exists

The $98.41 breaks down as crew $37.01, fuel $29.34, maintenance $18.35, aircraft ownership $9.76, other $3.95. It is the airline's own cost only. A4A separately values passenger time at roughly $47 per hour, which ALTO does not include — so every disruption figure here is conservative.

No public source prices an idle gate minute. The derivation above uses the only published price for a single use of a single gate, which is the most defensible construction available. The propagation factor has no source at all and is exposed as a slider for exactly that reason.

7 · What a disruption costs

Multiplying injected delay by cost per minute would miss where the money actually goes. A late arrival takes a gate that was promised to someone else; that aircraft holds, departs late, arrives late down-line, and is late back at Seattle that evening. One late arrival becomes six late departures.

So the damage figure is a simulation. The day is run forward with the gate plan held fixed, under two forces that feed each other:

Because each makes the other worse, this iterates rather than running once, following the delay one leg further each pass, capped at four legs. Beyond four the effect is smaller than the error in the estimate of it.

Doing nothing is not literally nothing

For a gate closure, the displaced aircraft has to go somewhere. An earlier version dropped them from the plan, and since a dropped aircraft incurs no cost, closing six gates appeared to save $26,207.

The honest comparison is not optimize versus nothing but optimize versus what a gate controller does under pressure: take the displaced aircraft in time order and put each at the first free gate, no lookahead. If nothing is free it joins the shortest queue and holds, and the simulation prices that hold as gate contention.

Minimum-disruption recovery

A recovery plan that saves marginally more but reshuffles two hundred aircraft is not one operations can execute. Two mechanisms keep the answer actionable: the chain-to-gate pairing minimizes how many aircraft leave their original gate, and links used in the previous plan get a small discount inside the flow itself, so that among equally optimal arrangements the solver returns the one closest to the plan already in place.

On a three-aircraft delay this took the number of aircraft moved from 265 to 56, at a cost of 2.3 percentage points of recovered share. That trade was taken deliberately.

8 · What this cannot tell you

The big one — and it cannot be fixed from this data

Horizon Air and SkyWest fly Embraer E175s in Alaska livery and use Alaska's gates. Neither can be included, for two different reasons.

Horizon Air does not file BTS On-Time Performance at all. The 2023 files contain exactly fifteen carriers — 9E, AA, AS, B6, DL, F9, G4, HA, MQ, NK, OH, OO, UA, WN, YX. Horizon is not among them. Its aircraft are invisible in this dataset and nothing can recover them.

SkyWest is present but cannot be attributed. 3,170 SkyWest flights touched SEA in January 2023, against Alaska mainline's 11,605 — but SkyWest flies for Alaska, Delta, United and American at once, and this table records only the operating carrier. Three attribution attempts failed: there is no marketing-carrier or codeshare field; flight-number blocks do not separate partners, since both the 3000- and 4000-series serve Pacific Northwest routes from SEA; and aircraft do not segregate either — 103 of the 104 SkyWest tails that touched SEA in January also touched another mainline's hub.

Attributing them by route heuristic would produce a plausible-looking number with no defensible basis. A stated gap beats an unsourced guess.

So: every utilization figure here is a floor for Alaska mainline, not an estimate of the Alaska brand's total gate demand. Closing it properly means BTS's separate Marketing Carrier table, which carries both operating and marketing carrier — and even that would not include Horizon.

No public dataset contains gate assignments. Not BTS, not anything. Which gate a flight actually used is unknowable from public data. ALTO produces an optimal assignment, not a reconstruction of the real one, and there is no ground truth to validate against. The solvers are validated against each other and against theory — which is what section 5 does — but not against reality.

The gate roster is a modeling assumption. Seattle‑Tacoma has 67 preferential-use gates under its current airline agreement, and Concourse C and the North Satellite are Alaska's. The exact roster, and the walking-cost weights attached to each gate, are constructed from the published terminal layout rather than measured.

2023 flights are priced at 2025 rates. The tariff and agreement figures are current; the flights are two years older. Fine for relative comparisons, worth stating.

Delay costs exclude passenger time, which A4A values at about $47 per hour. Including it would raise every disruption figure substantially.

Sources