<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>Analyst&#39;s diary</title>
<link>https://www.analystsdiary.com/aviation.html</link>
<atom:link href="https://www.analystsdiary.com/aviation.xml" rel="self" type="application/rss+xml"/>
<description>An independent analytical platform for data, insights and meaningful observations.</description>
<generator>quarto-1.6.40</generator>
<lastBuildDate>Mon, 24 Aug 2026 00:00:00 GMT</lastBuildDate>
<item>
  <title>What if the fastest way to board a plane is one airlines barely use?</title>
  <link>https://www.analystsdiary.com/posts/aviation/boarding-fastest-method.html</link>
  <description><![CDATA[ 




<style>
.quarto-title-block { display: none; }

.boarding-story { max-width: 100%; }
.boarding-story h1, .boarding-story h2, .boarding-story h3,
.boarding-story h4, .boarding-story h5 {
    font-family: Inter, Arial, Helvetica, sans-serif;
    letter-spacing: normal;
}
.boarding-story a { text-decoration: none; }
#quarto-content > * { padding-top: 0; }
.boarding-story .hero { border-radius: 4px; overflow: hidden; }

.boarding-story {

    --wine: #8C1D40;
    --wine-dark: #64142E;
    --gold: #D6A84B;

    --ink: #191919;
    --muted: #6A6A6A;

    --soft: #F6F3F4;
    --line: #E6E1E3;

    --white: #FFFFFF;
}

.boarding-story * {

    box-sizing:
        border-box;
}

html {

    scroll-behavior:
        smooth;
}

.boarding-story {

    margin: 0;

    background:
        var(--white);

    color:
        var(--ink);

    font-family:
        Inter,
        Arial,
        Helvetica,
        sans-serif;

    line-height:
        1.6;
}

.boarding-story .site-header {

    position:
        fixed;

    top: 0;
    left: 0;
    right: 0;

    height:
        64px;

    display:
        flex;

    align-items:
        center;

    justify-content:
        space-between;

    padding:
        0 4vw;

    background:
        rgba(
            255,
            255,
            255,
            .94
        );

    backdrop-filter:
        blur(10px);

    border-bottom:
        1px solid
        rgba(
            0,
            0,
            0,
            .05
        );

    z-index:
        1000;
}

.boarding-story .site-logo {

    width:
        120px;
}

.boarding-story .nav {

    display:
        flex;

    gap:
        22px;

    font-size:
        13px;
}

.boarding-story .nav a {

    color:
        var(--ink);

    text-decoration:
        none;
}

.boarding-story .nav a:hover {

    color:
        var(--wine);
}

.boarding-story .hero {

    min-height:
        92vh;

    position:
        relative;

    display:
        flex;

    align-items:
        flex-end;

    background-image:

        linear-gradient(
            180deg,
            rgba(0,0,0,.04),
            rgba(0,0,0,.76)
        ),

        url(
            "/assets/boarding/PLANE.jpg"
        );

    background-size:
        cover;

    background-position:
        center;

    color:
        white;
}

.boarding-story .hero-inner {

    width:
        min(
            1100px,
            92vw
        );

    margin:
        0 auto;

    padding:
        150px 0
        76px;
}

.boarding-story .eyebrow {

    display:
        inline-block;

    padding:
        6px 10px;

    margin-bottom:
        20px;

    border:
        1px solid
        rgba(
            255,
            255,
            255,
            .45
        );

    border-radius:
        100px;

    font-size:
        12px;

    letter-spacing:
        .08em;

    text-transform:
        uppercase;
}

.boarding-story .hero h1 {

    max-width:
        930px;

    margin:
        0;

    font-size:
        clamp(
            44px,
            7vw,
            86px
        );

    line-height:
        .99;

    letter-spacing:
        -.045em;
}

.boarding-story .hero-sub {

    max-width:
        760px;

    margin-top:
        28px;

    font-size:
        clamp(
            18px,
            2vw,
            24px
        );

    color:
        rgba(
            255,
            255,
            255,
            .88
        );
}

.boarding-story .byline {

    margin-top:
        28px;

    font-size:
        13px;

    color:
        rgba(
            255,
            255,
            255,
            .72
        );
}

.boarding-story .section {

    width:
        min(
            1080px,
            92vw
        );

    margin:
        0 auto;

    padding:
        95px 0;
}

.boarding-story .section.narrow {

    width:
        min(
            770px,
            90vw
        );
}

.boarding-story .section-label {

    color:
        var(--wine);

    font-size:
        12px;

    font-weight:
        800;

    letter-spacing:
        .10em;

    text-transform:
        uppercase;
}

.boarding-story h2 {

    max-width:
        900px;

    margin:
        10px 0
        24px;

    font-size:
        clamp(
            32px,
            5vw,
            56px
        );

    line-height:
        1.05;

    letter-spacing:
        -.035em;
}

.boarding-story h3 {

    margin-top:
        0;

    font-size:
        28px;

    line-height:
        1.15;
}

.boarding-story .lead {

    max-width:
        800px;

    font-size:
        20px;

    color:
        #454545;
}

.boarding-story .divider {

    height:
        1px;

    background:
        var(--line);
}

.boarding-story .context-box {

    margin-top:
        38px;

    padding:
        30px 34px;

    background:
        var(--soft);

    border-radius:
        18px;

    border-left:
        5px solid
        var(--wine);
}

.boarding-story .context-box strong {

    color:
        var(--wine);
}

.boarding-story .stats-grid {

    display:
        grid;

    grid-template-columns:
        repeat(
            3,
            1fr
        );

    gap:
        18px;

    margin-top:
        48px;
}

.boarding-story .stat-card {

    padding:
        28px;

    background:
        var(--soft);

    border-radius:
        15px;
}

.boarding-story .stat-label {

    color:
        var(--muted);

    font-size:
        12px;

    text-transform:
        uppercase;

    letter-spacing:
        .08em;
}

.boarding-story .stat-value {

    margin-top:
        8px;

    font-size:
        32px;

    font-weight:
        800;
}

.boarding-story .strategy-grid {

    display:
        grid;

    grid-template-columns:
        repeat(
            2,
            1fr
        );

    gap:
        18px;

    margin-top:
        42px;
}

.boarding-story .strategy-card {

    position:
        relative;

    padding:
        28px;

    border:
        1px solid
        var(--line);

    border-top:
        5px solid
        var(--strategy-color);

    border-radius:
        14px;

    background:
        white;
}

.boarding-story .strategy-name {

    font-size:
        21px;

    font-weight:
        850;
}

.boarding-story .strategy-short {

    margin-top:
        8px;

    font-weight:
        700;

    color:
        var(--strategy-color);
}

.boarding-story .strategy-text {

    margin-top:
        17px;

    color:
        #4A4A4A;

    font-size:
        14px;
}

.boarding-story .explorer-shell {

    margin-top:
        38px;

    padding:
        28px;

    background:
        #FAFAFA;

    border:
        1px solid
        var(--line);

    border-radius:
        20px;
}

.boarding-story .controls {

    display:
        grid;

    grid-template-columns:
        1.2fr
        1.4fr
        auto
        auto
        .7fr;

    gap:
        12px;

    align-items:
        end;

    margin-bottom:
        22px;
}

.boarding-story .control {

    display:
        flex;

    flex-direction:
        column;

    gap:
        5px;
}

.boarding-story .control label {

    font-size:
        11px;

    font-weight:
        800;

    color:
        var(--muted);

    text-transform:
        uppercase;
}

.boarding-story select, .boarding-story input, .boarding-story button {

    font:
        inherit;
}

.boarding-story select, .boarding-story input[type="number"] {

    width:
        100%;

    padding:
        10px 12px;

    background:
        white;

    border:
        1px solid
        #CFCFCF;

    border-radius:
        7px;
}

.boarding-story button {

    padding:
        10px 18px;

    border:
        1px solid
        #D0D0D0;

    border-radius:
        7px;

    background:
        white;

    cursor:
        pointer;
}

.boarding-story button.primary {

    border-color:
        var(--wine);

    background:
        var(--wine);

    color:
        white;
}

.boarding-story .explorer-metrics {

    display:
        grid;

    grid-template-columns:
        repeat(
            5,
            1fr
        );

    gap:
        10px;

    margin-bottom:
        22px;
}

.boarding-story .metric {

    padding:
        14px;

    background:
        white;

    border-radius:
        9px;

    border-top:
        3px solid
        var(--wine);
}

.boarding-story .metric-title {

    font-size:
        10px;

    color:
        var(--muted);

    text-transform:
        uppercase;
}

.boarding-story .metric-value {

    margin-top:
        3px;

    font-size:
        20px;

    font-weight:
        800;
}

.boarding-story .aircraft-wrapper {

    overflow-x:
        auto;

    padding:
        10px 0;
}

.boarding-story .aircraft {

    display:
        grid;

    grid-template-columns:
        35px
        35px 35px 35px
        64px
        35px 35px 35px;

    gap:
        4px;

    width:
        max-content;

    margin:
        auto;

    padding:
        24px 28px;

    background:
        white;

    border:
        1px solid
        #DEDEDE;

    border-radius:
        70px 70px
        24px 24px;
}

.boarding-story .row-label {

    display:
        flex;

    align-items:
        center;

    justify-content:
        flex-end;

    padding-right:
        4px;

    font-size:
        9px;

    color:
        #777;
}

.boarding-story .seat {

    width:
        35px;

    height:
        27px;

    display:
        flex;

    align-items:
        center;

    justify-content:
        center;

    background:
        white;

    border:
        1px solid
        #BDBDBD;

    border-radius:
        4px;
}

.boarding-story .aisle {

    width:
        64px;

    height:
        27px;

    display:
        flex;

    align-items:
        center;

    justify-content:
        center;

    background:
        #F0F0F0;

    border-radius:
        3px;
}

.boarding-story .person {

    width:
        15px;

    height:
        15px;

    border-radius:
        50%;
}

.boarding-story .walking {
    background: #3D7EA6;
}

.boarding-story .stowing {
    background: #D99A2B;
}

.boarding-story .seating {
    background: #986FC7;
}

.boarding-story .seated {
    background: #528458;
}

.boarding-story .legend {

    display:
        flex;

    justify-content:
        center;

    gap:
        18px;

    flex-wrap:
        wrap;

    margin:
        18px 0;

    font-size:
        12px;
}

.boarding-story .legend-dot {

    display:
        inline-block;

    width:
        10px;

    height:
        10px;

    margin-right:
        5px;

    border-radius:
        50%;
}

.boarding-story .timeline {

    width:
        100%;
}

.boarding-story .explanation {

    margin-top:
        18px;

    padding:
        17px;

    background:
        white;

    border-radius:
        10px;

    color:
        #444;
}

.boarding-story .scenario-tabs {

    display:
        flex;

    gap:
        8px;

    flex-wrap:
        wrap;

    margin:
        30px 0;
}

.boarding-story .scenario-tab.active {

    background:
        var(--wine);

    color:
        white;
}

.boarding-story .result-row {

    display:
        grid;

    grid-template-columns:
        210px
        1fr
        125px;

    gap:
        15px;

    align-items:
        center;

    padding:
        12px 0;
}

.boarding-story .result-name {

    font-weight:
        700;

    font-size:
        14px;
}

.boarding-story .bar-track {

    height:
        28px;

    background:
        #F1F1F1;

    border-radius:
        5px;
}

.boarding-story .bar-fill {

    height:
        100%;

    border-radius:
        5px;
}

.boarding-story .result-time {

    text-align:
        right;

    font-weight:
        800;

    font-size:
        14px;
}

.boarding-story .figures-grid {

    margin-top:
        45px;
}

.boarding-story .story-figure {

    margin:
        65px 0;
}

.boarding-story .story-figure img {

    display:
        block;

    width:
        100%;

    max-width:
        1000px;

    margin:
        18px auto;

    background:
        white;
}

.boarding-story .figure-caption {

    max-width:
        820px;

    color:
        var(--muted);

    font-size:
        13px;
}

.boarding-story .story-grid {

    display:
        grid;

    grid-template-columns:
        1fr 1fr;

    gap:
        22px;

    margin-top:
        40px;
}

.boarding-story .callout {

    padding:
        30px;

    background:
        var(--soft);

    border-radius:
        18px;
}

.boarding-story .callout-title {

    font-size:
        25px;

    font-weight:
        800;

    line-height:
        1.15;
}

.boarding-story .calculator {

    margin-top:
        38px;

    padding:
        32px;

    background:
        #191919;

    color:
        white;

    border-radius:
        20px;
}

.boarding-story .calc-grid {

    display:
        grid;

    grid-template-columns:
        repeat(
            5,
            1fr
        );

    gap:
        14px;
}

.boarding-story .calculator select, .boarding-story .calculator input {

    border:
        1px solid
        #555;

    background:
        #292929;

    color:
        white;
}

.boarding-story .calc-output {

    display:
        grid;

    grid-template-columns:
        repeat(
            3,
            1fr
        );

    gap:
        12px;

    margin-top:
        28px;
}

.boarding-story .calc-card {

    padding:
        22px;

    background:
        #262626;

    border-radius:
        10px;
}

.boarding-story .calc-number {

    margin-top:
        6px;

    font-size:
        clamp(
            24px,
            4vw,
            38px
        );

    font-weight:
        800;

    color:
        #F0C36A;
}

.boarding-story .calc-note {

    margin-top:
        18px;

    color:
        #AAA;

    font-size:
        12px;
}

.boarding-story details {

    margin:
        15px 0;

    padding:
        18px 20px;

    border:
        1px solid
        var(--line);

    border-radius:
        10px;
}

.boarding-story summary {

    cursor:
        pointer;

    font-weight:
        800;
}

.boarding-story .cta {

    padding:
        85px 0;

    background:
        var(--wine);

    color:
        white;
}

.boarding-story .cta-inner {

    width:
        min(
            850px,
            90vw
        );

    margin:
        auto;
}

.boarding-story .cta a {

    display:
        inline-block;

    margin-top:
        24px;

    padding:
        12px 18px;

    background:
        white;

    color:
        var(--wine);

    border-radius:
        7px;

    text-decoration:
        none;

    font-weight:
        800;
}

.boarding-story footer {

    padding:
        30px 4vw;

    display:
        flex;

    justify-content:
        space-between;

    color:
        var(--muted);

    font-size:
        12px;
}

@media (
    max-width: 850px
) {

.boarding-story .nav {

        display:
            none;
    }

.boarding-story .strategy-grid, .boarding-story .stats-grid, .boarding-story .story-grid, .boarding-story .calc-output {

        grid-template-columns:
            1fr;
    }

.boarding-story .controls {

        grid-template-columns:
            1fr 1fr;
    }

.boarding-story .explorer-metrics {

        grid-template-columns:
            repeat(
                2,
                1fr
            );
    }

.boarding-story .calc-grid {

        grid-template-columns:
            1fr 1fr;
    }

.boarding-story .result-row {

        grid-template-columns:
            120px
            1fr
            105px;
    }


}



</style>

<div class="boarding-story">
<!-- =======================================================
     HERO
     ======================================================= -->

<section class="hero">

<div class="hero-inner">

<div class="eyebrow">
66,000 final boarding simulations
</div>

<h1>
What if the fastest way to board a plane is one airlines barely use?
</h1>

<div class="hero-sub">

Eleven boarding strategies.
Three operating environments.
And one surprisingly complicated queue inside a very narrow tube.

</div>

<div class="byline">

Antonin Kremenak ·
Analysts Diary ·
24 August 2026

</div>

</div>

</section>


<!-- =======================================================
     WHY BOARDING MATTERS
     ======================================================= -->

<section class="section narrow" id="why">

<div class="section-label">
Why study boarding?
</div>

<h2>
An aircraft earns money by flying — not by waiting at the gate.
</h2>


<p class="lead">

Every commercial aircraft spends part of its day on the ground.
Passengers need to leave, the cabin must be prepared and the next
group has to board before the aircraft can depart again. Airlines
therefore try to keep turnaround times predictable and as short as
operationally possible.

</p>


<p>

A few minutes may not sound important on a single flight, but airlines
repeat the same process hundreds or thousands of times across their
networks. Time saved during boarding can contribute to faster
turnarounds, better aircraft utilisation and more resilient schedules.
Conversely, slow or unpredictable boarding can consume part of the
available turnaround buffer before the aircraft has even pushed back.

</p>


<div class="context-box">

<strong>
The important point:
</strong>

boarding is not only a passenger-experience problem.
It is also an operations problem.

The faster and more predictably an aircraft can be prepared for
departure, the sooner it can return to the activity that generates
revenue: flying.

</div>


<div class="stats-grid">

<div class="stat-card">

<div class="stat-label">
Final simulations
</div>

<div class="stat-value">
66,000
</div>

</div>


<div class="stat-card">

<div class="stat-label">
Boarding strategies
</div>

<div class="stat-value">
11
</div>

</div>


<div class="stat-card">

<div class="stat-label">
Operating scenarios
</div>

<div class="stat-value">
3
</div>

</div>

</div>

</section>


<div class="divider"></div>


<!-- =======================================================
     SCENARIO CARDS
     ======================================================= -->

<section class="section narrow" id="scenarios">

<div class="section-label">
Three operating environments
</div>

<h2>
The same aircraft, tested under three different conditions.
</h2>

<div class="story-grid">

<div class="callout">
<div class="callout-title">Single door</div>
<p><strong>One front entrance, full aircraft, baseline luggage.</strong></p>
<p>Passengers follow the assigned boarding order perfectly and no travel
groups disrupt the sequence. This is the clean baseline for seeing what a
strategy can do with one conventional front door.</p>
</div>

<div class="callout">
<div class="callout-title">Dual door</div>
<p><strong>Front and rear entrances, full aircraft, baseline luggage.</strong></p>
<p>The passengers are split between two real streams entering from opposite
ends of the same aisle. Compliance remains perfect and there are no travel
groups. The second door changes the geometry - and can change the winner.</p>
</div>

<div class="callout">
<div class="callout-title">Operational stress</div>
<p><strong>One front entrance, more luggage, 75% compliance and travel groups.</strong></p>
<p>This scenario adds the everyday friction that a neat boarding plan cannot
fully control. One quarter of passengers travel in groups and only 75% keep
their prescribed position in the boarding order.</p>
</div>

</div>

</section>


<div class="divider"></div>


<!-- =======================================================
     STRATEGIES
     ======================================================= -->

<section class="section" id="methods">

<div class="section-label">
Meet the contenders
</div>

<h2>
Eleven ways to fill the same aircraft.
</h2>


<p class="lead">

Some methods are beautifully simple.
Others look almost absurd when written as a boarding queue.
But each one is trying to solve the same problem:
how do you stop passengers from getting in one another's way?

</p>


<div class="strategy-grid">



<div class="strategy-card" style="--strategy-color:#8C1D40">

<div class="strategy-name">
CRBF — Column Rotated Back-to-Front
</div>

<div class="strategy-short">
Board one seat column at a time, from the rear of the aircraft toward the front.
</div>

<div class="strategy-text">
CRBF stands for Column Rotated Back-to-Front. Instead of sending an entire rear section of passengers into the cabin at once, the aircraft is boarded column by column. In the 3-3 cabin used here, window, middle and aisle columns are called separately and each column proceeds from the rear toward the front.<br><br>The idea is to reduce seat interference while spreading passengers along the aisle. That allows several passengers to store luggage at the same time rather than creating one large queue around the same few rows.
</div>

</div>




<div class="strategy-card" style="--strategy-color:#315A7D">

<div class="strategy-name">
Steffen method
</div>

<div class="strategy-short">
Deliberately space passengers several rows apart so they can stow luggage in parallel.
</div>

<div class="strategy-text">
The Steffen method uses a highly structured passenger sequence. Consecutive passengers in the boarding line are usually seated several rows apart, and window-seat passengers are handled before passengers closer to the aisle.<br><br>The unusual order has one main purpose: parallelism. Instead of one passenger blocking everyone behind while storing a bag, multiple passengers should be able to use different overhead bins simultaneously.
</div>

</div>




<div class="strategy-card" style="--strategy-color:#5D88B3">

<div class="strategy-name">
Steffen-Lug
</div>

<div class="strategy-short">
Steffen boarding, but passengers with more luggage move earlier inside each boarding wave.
</div>

<div class="strategy-text">
Steffen-Lug keeps the spatial logic of the Steffen method but adds information about carry-on luggage. Inside each Steffen boarding wave, passengers carrying more bags are placed earlier in the sequence.<br><br>The goal is to let luggage-heavy passengers use relatively empty overhead bins before those bins become crowded. In the simulation this modification became especially interesting when two aircraft doors were available.
</div>

</div>




<div class="strategy-card" style="--strategy-color:#588157">

<div class="strategy-name">
WilMA — Window, Middle, Aisle
</div>

<div class="strategy-short">
Window passengers first, middle seats second and aisle passengers last.
</div>

<div class="strategy-text">
WilMA stands for Window, Middle and Aisle. Its logic is easy to understand: board passengers sitting next to the windows first, then passengers in middle seats, and finally passengers sitting beside the aisle.<br><br>This largely removes one common source of delay: a window passenger arriving after the middle and aisle passengers are already seated and forcing them to stand up again.
</div>

</div>




<div class="strategy-card" style="--strategy-color:#76639A">

<div class="strategy-name">
Reverse Pyramid
</div>

<div class="strategy-short">
Combine seat position and distance from the door into diagonal boarding zones.
</div>

<div class="strategy-text">
Reverse Pyramid does not simply divide the aircraft into front and rear blocks. Instead, boarding zones combine seat type and row position. Rear window passengers tend to board earlier, followed by overlapping combinations of windows, middle seats and eventually aisle seats.<br><br>The original published cabin configuration differs from the 26-row all-economy aircraft used in this project, so the zone boundaries were proportionally adapted. That is why the strategy is labelled Reverse Pyramid (adapted).
</div>

</div>




<div class="strategy-card" style="--strategy-color:#929292">

<div class="strategy-name">
Random boarding
</div>

<div class="strategy-short">
No spatial boarding logic — passengers enter in random order.
</div>

<div class="strategy-text">
Random boarding simply shuffles the passenger order. It does not deliberately prioritise rows or seat positions.<br><br>That sounds inefficient, but randomisation naturally spreads people around the cabin. It is therefore a useful benchmark and can sometimes outperform boarding methods that create very concentrated congestion.
</div>

</div>




<div class="strategy-card" style="--strategy-color:#3F3F3F">

<div class="strategy-name">
Back-to-Front
</div>

<div class="strategy-short">
Call passengers in rear zones first and gradually move toward the front.
</div>

<div class="strategy-text">
Back-to-Front is probably the most intuitive boarding method. Passengers in the rear section are called first, followed by successively more forward zones.<br><br>The problem is that passengers from the same boarding group often need the same part of the aisle at the same time. The queue may look organised at the gate while producing a dense moving bottleneck inside the aircraft.
</div>

</div>




<div class="strategy-card" style="--strategy-color:#C99A35">

<div class="strategy-name">
Lufthansa-like
</div>

<div class="strategy-short">
Priority boarding combined with more explicit seat-position logic.
</div>

<div class="strategy-text">
The Lufthansa-like method first handles selected priority groups and then applies seat-position logic to the remaining economy passengers, with window passengers preceding middle and aisle passengers.<br><br>Among the simplified airline-style approaches, this creates more spatial organisation inside the cabin than a pure priority-first system.
</div>

</div>




<div class="strategy-card" style="--strategy-color:#D8AF45">

<div class="strategy-name">
Ryanair-like
</div>

<div class="strategy-short">
A simplified priority-first boarding structure inspired by low-cost airline operations.
</div>

<div class="strategy-text">
The Ryanair-like model separates priority passengers from the standard boarding population. Priority passengers enter first and the remaining passengers follow.<br><br>It is intentionally a simplified structural approximation. It is not intended to reproduce every detail of Ryanair's actual gate procedures, airport infrastructure or commercial priority product.
</div>

</div>




<div class="strategy-card" style="--strategy-color:#E48B48">

<div class="strategy-name">
easyJet-like
</div>

<div class="strategy-short">
Families and priority passengers board ahead of the remaining passengers.
</div>

<div class="strategy-text">
The easyJet-like structure gives early boarding access to families and priority passengers before the standard passenger population enters.<br><br>Again, the purpose is not to recreate an airline's full real operation. It provides a simplified priority-based comparator for the strongly spatial academic strategies.
</div>

</div>




<div class="strategy-card" style="--strategy-color:#B8863B">

<div class="strategy-name">
US Network-like
</div>

<div class="strategy-short">
Several successive priority groups followed by standard boarding groups.
</div>

<div class="strategy-text">
The US Network-like model represents the multi-group boarding structure common in large network-airline environments. Families and higher-priority passengers are processed before several standard boarding groups.<br><br>The model deliberately simplifies the much more complicated real systems involving cabin class, loyalty status, credit cards, accessibility and ticket products.
</div>

</div>



</div>

</section>


<div class="divider"></div>


<!-- =======================================================
     INTERACTIVE AIRCRAFT
     ======================================================= -->

<section class="section" id="watch">

<div class="section-label">
See the difference
</div>

<h2>
Watch the cabin fill.
</h2>


<p class="lead">

Choose a boarding strategy and operating scenario.
The animation shows one representative run from the same simulation
engine used for the final experiment.

</p>


<div class="explorer-shell">


<div class="controls">


<div class="control">

<label>
Scenario
</label>

<select id="airScenario">
</select>

</div>


<div class="control">

<label>
Boarding strategy
</label>

<select id="airPolicy">
</select>

</div>


<button id="airPlay" class="primary">
▶ Play
</button>


<button id="airRestart">
↺ Restart
</button>


<div class="control">

<label>
Speed
</label>

<select id="airSpeed">

<option value="1">
1×
</option>

<option value="2">
2×
</option>

<option value="5" selected="">
5×
</option>

<option value="10">
10×
</option>

</select>

</div>

</div>


<div class="explorer-metrics">

<div class="metric">

<div class="metric-title">
Elapsed
</div>

<div class="metric-value" id="airElapsed">
0 min 00 sec
</div>

</div>


<div class="metric">

<div class="metric-title">
Seated
</div>

<div class="metric-value" id="airSeated">
0 / 156
</div>

</div>


<div class="metric">

<div class="metric-title">
Walking
</div>

<div class="metric-value" id="airWalking">
0
</div>

</div>


<div class="metric">

<div class="metric-title">
Stowing bags
</div>

<div class="metric-value" id="airStowing">
0
</div>

</div>


<div class="metric">

<div class="metric-title">
Representative run
</div>

<div class="metric-value" id="airFinal">
—
</div>

</div>

</div>


<div class="aircraft-wrapper">

<div class="aircraft" id="aircraft">
</div>

</div>


<div class="legend">

<span>
<i class="legend-dot walking"></i>
Walking
</span>

<span>
<i class="legend-dot stowing"></i>
Stowing
</span>

<span>
<i class="legend-dot seating"></i>
Taking seat
</span>

<span>
<i class="legend-dot seated"></i>
Seated
</span>

</div>


<input class="timeline" type="range" id="airSlider" min="0" value="0" step="1">


<div class="explanation" id="airExplanation">
</div>


</div>

</section>


<div class="divider"></div>


<!-- =======================================================
     INTERACTIVE RESULTS
     ======================================================= -->

<section class="section" id="results">

<div class="section-label">
The scoreboard
</div>

<h2>
There was no universal winner.
</h2>


<p class="lead">

The fastest method depends on the environment.
Change the door configuration or passenger behaviour and the ranking
can change dramatically.

</p>


<div class="scenario-tabs" id="resultTabs">
</div>


<div id="resultDescription" class="explanation">
</div>


<div id="resultsBars">
</div>

</section>


<!-- =======================================================
     TECHNICAL GRAPHS
     ======================================================= -->

<section class="section">

<div class="section-label">
The bigger picture
</div>

<h2>
What 66,000 final simulations revealed.
</h2>


<p class="lead">

The interactive ranking above shows the headline result.
The charts below come from the technical version of the study and show
how the pattern changes across scenarios — and why.

</p>


<div class="figures-grid">



<div class="story-figure">

<h3>
Single-door boarding
</h3>

<img src="https://www.analystsdiary.com/assets/boarding/figures/fig01_single_door_rankings.png" alt="Single-door boarding" loading="lazy">

<p class="figure-caption">
Mean boarding times from 2,000 Monte Carlo runs per strategy. Lower is better.
</p>

</div>



<div class="story-figure">

<h3>
Opening the rear door changes the ranking
</h3>

<img src="https://www.analystsdiary.com/assets/boarding/figures/fig02_dual_door_rankings.png" alt="Opening the rear door changes the ranking" loading="lazy">

<p class="figure-caption">
The fastest single-door strategy does not remain the fastest when the aircraft is boarded from both ends.
</p>

</div>



<div class="story-figure">

<h3>
What happens when operations get messy?
</h3>

<img src="https://www.analystsdiary.com/assets/boarding/figures/fig03_stress_rankings.png" alt="What happens when operations get messy?" loading="lazy">

<p class="figure-caption">
Higher luggage volume, imperfect compliance and travel groups slow every method, but not by the same amount.
</p>

</div>



<div class="story-figure">

<h3>
The winner depends on the scenario
</h3>

<img src="https://www.analystsdiary.com/assets/boarding/figures/fig08_scenario_sensitivity.png" alt="The winner depends on the scenario" loading="lazy">

<p class="figure-caption">
The same boarding strategy can move substantially up or down the ranking when infrastructure and passenger behaviour change.
</p>

</div>



<div class="story-figure">

<h3>
Why aisle blocking matters
</h3>

<img src="https://www.analystsdiary.com/assets/boarding/figures/fig07_blocking_vs_boarding.png" alt="Why aisle blocking matters" loading="lazy">

<p class="figure-caption">
Strategies that create more blocking also tend to produce longer total boarding times.
</p>

</div>



<div class="story-figure">

<h3>
Academic optimisation vs airline-like boarding
</h3>

<img src="https://www.analystsdiary.com/assets/boarding/figures/fig10_airline_vs_academic.png" alt="Academic optimisation vs airline-like boarding" loading="lazy">

<p class="figure-caption">
The comparison isolates boarding-flow efficiency. Real airlines must optimise many other commercial and operational objectives.
</p>

</div>



</div>

</section>


<section class="section narrow">

<div class="section-label">
How the model evolved
</div>

<h2>
This was an iterative model, not a one-script result.
</h2>

<p class="lead">
The audit found <strong>18 unique executable versions</strong>
across <strong>19 named simulation files</strong>. The two V3.0
filenames are byte-identical aliases, so they count as one version.
</p>

<div class="stats-grid">
<div class="stat-card"><div class="stat-label">Unique versions</div><div class="stat-value">18</div></div>
<div class="stat-card"><div class="stat-label">Simulation rows across development</div><div class="stat-value">523,460</div></div>
<div class="stat-card"><div class="stat-label">Final experiment</div><div class="stat-value">66,000</div></div>
</div>

<p>
The model moved from baseline aisle mechanics to experimental replication,
movement and luggage sensitivity, behavioural compliance, travel groups,
dual-door infrastructure and finally the 11-policy comparison. The total is
based on the actual <code>All Runs</code> rows saved in the result workbooks,
including the final V3.1.2 smoke test.
</p>

</section>


<div class="divider"></div>


<!-- =======================================================
     SIMPLE INTERPRETATION
     ======================================================= -->

<section class="section">

<div class="section-label">
Why?
</div>

<h2>
The cabin rewards parallel work.
</h2>


<div class="story-grid">


<div class="callout">

<div class="callout-title">
One door: spread passengers out.
</div>

<p>

With a single front entrance, CRBF performs extremely well because
passengers are distributed through the cabin and several people can
store luggage at the same time.

</p>

</div>


<div class="callout">

<div class="callout-title">
Two doors change the geometry.
</div>

<p>

When half the cabin enters from the rear, the flow pattern changes.
Steffen-Lug becomes the fastest method in the final simulation.

</p>

</div>


<div class="callout">

<div class="callout-title">
Luggage is not a small detail.
</div>

<p>

A passenger placing a bag in an overhead bin may temporarily become
a moving roadblock. Spread those passengers apart and the cabin can
process several bags simultaneously.

</p>

</div>


<div class="callout">

<div class="callout-title">
Back-to-Front has an intuitive trap.
</div>

<p>

It organises passengers neatly outside the aircraft but then sends
many of them into the same cabin area. The result can be a long,
slow-moving bottleneck.

</p>

</div>


</div>

</section>


<div class="divider"></div>


<!-- =======================================================
     SAVINGS
     ======================================================= -->

<section class="section" id="money">

<div class="section-label">
Turn minutes into money
</div>

<h2>
What could faster boarding be worth?
</h2>


<p class="lead">

Change the assumptions yourself.
Choose any Strategy A and any Strategy B, the number of daily flights
and an illustrative value for one minute of gate time. All 11 × 11
directed combinations are available, including A = B.

</p>


<div class="calculator">


<div class="calc-grid">


<div class="control">

<label>
Scenario
</label>

<select id="calcScenario">
</select>

</div>


<div class="control">

<label>
Strategy A
</label>

<select id="calcPolicy">
</select>

</div>


<div class="control">

<label>
Strategy B
</label>

<select id="calcReference"></select>

</div>


<div class="control">

<label>
Flights per day
</label>

<input id="calcFlights" type="number" min="1" value="100">

</div>


<div class="control">

<label>
Gate-time value ($/min)
</label>

<input id="calcCost" type="number" min="1" step="1" value="35">

</div>


</div>


<div class="calc-output">


<div class="calc-card">

<div class="metric-title">
Time saved by Strategy A per flight
</div>

<div class="calc-number" id="calcTime">
—
</div>

</div>


<div class="calc-card">

<div class="metric-title">
Illustrative value per flight
</div>

<div class="calc-number" id="calcFlight">
—
</div>

</div>


<div class="calc-card">

<div class="metric-title">
Illustrative annual value
</div>

<div class="calc-number" id="calcAnnual">
—
</div>

</div>


</div>


<div class="calc-note">

<strong>Illustrative operating value, not profit.</strong>
This is a gate-time extrapolation, not a prediction of real airline profit.
It does not include schedule redesign, crew costs,
network recovery, missed connections, commercial boarding products or
aircraft utilisation effects outside the boarding model.

</div>

</div>

</section>


<div class="divider"></div>


<!-- =======================================================
     AIRLINES VS THEORY
     ======================================================= -->

<section class="section narrow">

<div class="section-label">
A fair question
</div>

<h2>
If these methods are faster, why don't airlines just use them?
</h2>


<p class="lead">

Because airlines are solving a much bigger problem than this simulation.

</p>


<p>

A mathematically efficient boarding sequence may require exact
passenger ordering, stronger gate control or separating people who
want to board together. Airlines also need to accommodate families,
premium products, accessibility, loyalty status and passenger
expectations.

</p>


<p>

So the simulation should not be read as
<strong>
“airlines are doing boarding wrong.”
</strong>

It asks a narrower question:

<strong>
if we isolate passenger flow inside the cabin, what boarding structures
reduce congestion most effectively?
</strong>

</p>

</section>


<div class="divider"></div>


<!-- =======================================================
     METHODOLOGY FAQ
     ======================================================= -->

<section class="section narrow">

<div class="section-label">
Behind the dots
</div>

<h2>
A little more detail, if you want it.
</h2>


<details>

<summary>
What aircraft was simulated?
</summary>

<p>

A 26-row narrow-body aircraft with a 3-3 seating configuration:
156 passengers at full load.

</p>

</details>


<details>

<summary>
How many times was each method tested?
</summary>

<p>

Every strategy was simulated 2,000 times in each of three operating
scenarios.

11 strategies × 3 scenarios × 2,000 trials =
<strong>66,000 final simulations.</strong>

</p>

</details>


<details>

<summary>
Why simulate the same thing thousands of times?
</summary>

<p>

Because passengers are not identical. Walking speeds, luggage and
other stochastic elements vary. Monte Carlo simulation lets the study
measure not only the average result but also how reliable each method is.

</p>

</details>


<details>

<summary>
Is the aircraft animation one of the 2,000-trial averages?
</summary>

<p>

No. An average cannot literally walk down an aisle.
The animation shows one representative deterministic run so the
mechanism is visible. The numbers reported in the charts come from the
full Monte Carlo experiment.

</p>

</details>


<details>

<summary>
Are Ryanair-like and Lufthansa-like exact airline procedures?
</summary>

<p>

No. They are simplified structural approximations used for comparison.
Real airline boarding procedures contain many additional operational
and commercial rules.

</p>

</details>


<details>

<summary>
Where are the statistical tests and validation?
</summary>

<p>

They are deliberately kept out of this general-audience story.
The technical study contains paired comparisons, confidence intervals,
effect sizes, P95 analysis, validation and detailed assumptions.

</p>

</details>

</section>


<!-- =======================================================
     LIMITATIONS
     ======================================================= -->

<section class="section narrow">

<div class="section-label">
One important caveat
</div>

<h2>
This is a model, not a departure board.
</h2>


<p>

The simulation isolates passenger boarding inside a representative
narrow-body cabin. It does not model every part of airport operations,
the complete turnaround process or an airline network.

</p>


<p>

The results are therefore best understood as a controlled comparison
of boarding mechanisms rather than a prediction that every real flight
would achieve exactly the same time.

</p>

</section>


<div class="divider"></div>


<section class="section narrow" id="learn-more">

<div class="section-label">
Learn more
</div>

<h2>
The research behind the model.
</h2>

<p>
These are selected sources from the supplied literature folder. They cover
the Steffen method, experimental tests, Reverse Pyramid, robustness,
luggage handling and recent Airbus A320 simulation work.
</p>

<div class="context-box">
<p><a href="https://doi.org/10.1016/j.jairtraman.2008.03.003" target="_blank" rel="noopener">Steffen (2008) — Optimal boarding method for airline passengers</a></p>
<p><a href="https://doi.org/10.1016/j.jairtraman.2011.10.003" target="_blank" rel="noopener">Steffen &amp; Hotchkiss (2012) — Experimental test of airplane boarding methods</a></p>
<p><a href="https://doi.org/10.1287/inte.1050.0135" target="_blank" rel="noopener">van den Briel et al. (2005) — America West Airlines develops efficient boarding strategies</a></p>
<p><a href="https://doi.org/10.3141/1915-06" target="_blank" rel="noopener">Ferrari &amp; Nagel (2005) — Robustness of efficient passenger boarding strategies</a></p>
<p><a href="https://doi.org/10.3390/sym9100222" target="_blank" rel="noopener">Qiang, Jia &amp; Huang (2017) — Surrogate experimental test</a></p>
<p><a href="https://doi.org/10.15394/ijaaa.2018.1200" target="_blank" rel="noopener">Coppens et al. (2018) — Review, field study and luggage-stowing experiment</a></p>
<p><a href="https://doi.org/10.3390/su152316476" target="_blank" rel="noopener">Moreira et al. (2023) — Airbus A320 discrete-event simulation</a></p>
</div>

</section>


<!-- =======================================================
     TECHNICAL CTA
     ======================================================= -->

<section class="cta">

<div class="cta-inner">

<div class="section-label" style="color:#F1D89A">
Want the technical version?
</div>

<h2>
The methodology, validation and statistics are all there.
</h2>


<p>

The professional study contains the full simulation development,
assumptions, paired statistical analysis, confidence intervals,
P95 results, economic methodology and limitations.

</p>


<a href="../../files/boarding-study/Aircraft_Boarding_Professional_Study.html">
Read the technical study →
</a>

</div>

</section>


<footer>

<div>
© 2026 Antonin Kremenak
</div>

<div>
Analysts Diary
</div>

</footer>
</div>

<script>

const RESULTS = {"Single door": {"description": "A full aircraft with baseline luggage, perfect compliance with the assigned boarding order and one front door.", "policies": {"CRBF": {"rank": 1, "mean_minutes": 13.9234125, "mean_formatted": "13 min 55 sec", "p95_minutes": 14.86708333333334, "p95_formatted": "14 min 52 sec", "blocked_sec": 5.908355769230769, "saving_vs_random": 13.3009375, "saving_vs_btf": 25.46423333333334, "color": "#8C1D40", "explanation": "Board one seat column at a time, from the rear of the aircraft toward the front."}, "Steffen": {"rank": 2, "mean_minutes": 17.81454583333333, "mean_formatted": "17 min 49 sec", "p95_minutes": 19.075, "p95_formatted": "19 min 04 sec", "blocked_sec": 9.59548717948718, "saving_vs_random": 9.409804166666664, "saving_vs_btf": 21.5731, "color": "#315A7D", "explanation": "Deliberately space passengers several rows apart so they can stow luggage in parallel."}, "Steffen-Lug": {"rank": 3, "mean_minutes": 22.311925, "mean_formatted": "22 min 19 sec", "p95_minutes": 24.425, "p95_formatted": "24 min 26 sec", "blocked_sec": 25.80848397435897, "saving_vs_random": 4.912424999999999, "saving_vs_btf": 17.07572083333334, "color": "#5D88B3", "explanation": "Steffen boarding, but passengers with more luggage move earlier inside each boarding wave."}, "Reverse Pyramid (adapted)": {"rank": 4, "mean_minutes": 24.47439166666667, "mean_formatted": "24 min 28 sec", "p95_minutes": 26.95874999999999, "p95_formatted": "26 min 58 sec", "blocked_sec": 54.47084455128205, "saving_vs_random": 2.749958333333332, "saving_vs_btf": 14.91325416666667, "color": "#76639A", "explanation": "Combine seat position and distance from the door into diagonal boarding zones."}, "WilMA": {"rank": 5, "mean_minutes": 25.54832083333333, "mean_formatted": "25 min 33 sec", "p95_minutes": 28.02541666666666, "p95_formatted": "28 min 02 sec", "blocked_sec": 41.45546955128206, "saving_vs_random": 1.676029166666666, "saving_vs_btf": 13.83932500000001, "color": "#588157", "explanation": "Window passengers first, middle seats second and aisle passengers last."}, "Lufthansa-like": {"rank": 6, "mean_minutes": 26.51368333333333, "mean_formatted": "26 min 31 sec", "p95_minutes": 29.28333333333333, "p95_formatted": "29 min 17 sec", "blocked_sec": 45.06608173076923, "saving_vs_random": 0.7106666666666648, "saving_vs_btf": 12.8739625, "color": "#C99A35", "explanation": "Priority boarding combined with more explicit seat-position logic."}, "easyJet-like": {"rank": 7, "mean_minutes": 27.21382916666667, "mean_formatted": "27 min 13 sec", "p95_minutes": 29.94166666666667, "p95_formatted": "29 min 57 sec", "blocked_sec": 47.71442788461538, "saving_vs_random": 0.01052083333333087, "saving_vs_btf": 12.17381666666667, "color": "#E48B48", "explanation": "Families and priority passengers board ahead of the remaining passengers."}, "Random": {"rank": 8, "mean_minutes": 27.22435, "mean_formatted": "27 min 13 sec", "p95_minutes": 29.99208333333334, "p95_formatted": "30 min 00 sec", "blocked_sec": 47.51086858974359, "saving_vs_random": 0.0, "saving_vs_btf": 12.16329583333334, "color": "#929292", "explanation": "No spatial boarding logic \u2014 passengers enter in random order."}, "Ryanair-like": {"rank": 9, "mean_minutes": 27.22603333333333, "mean_formatted": "27 min 14 sec", "p95_minutes": 29.96708333333333, "p95_formatted": "29 min 58 sec", "blocked_sec": 47.51201923076923, "saving_vs_random": -0.001683333333335923, "saving_vs_btf": 12.1616125, "color": "#D8AF45", "explanation": "A simplified priority-first boarding structure inspired by low-cost airline operations."}, "US Network-like": {"rank": 10, "mean_minutes": 27.23925833333333, "mean_formatted": "27 min 14 sec", "p95_minutes": 29.84375, "p95_formatted": "29 min 51 sec", "blocked_sec": 47.87156570512821, "saving_vs_random": -0.01490833333333441, "saving_vs_btf": 12.14838750000001, "color": "#B8863B", "explanation": "Several successive priority groups followed by standard boarding groups."}, "Back-to-Front": {"rank": 11, "mean_minutes": 39.38764583333334, "mean_formatted": "39 min 23 sec", "p95_minutes": 42.69208333333334, "p95_formatted": "42 min 42 sec", "blocked_sec": 137.5018894230769, "saving_vs_random": -12.16329583333334, "saving_vs_btf": 0.0, "color": "#3F3F3F", "explanation": "Call passengers in rear zones first and gradually move toward the front."}}}, "Dual door": {"description": "The same full aircraft, but passengers are divided between the front and rear doors.", "policies": {"Steffen-Lug": {"rank": 1, "mean_minutes": 16.0863625, "mean_formatted": "16 min 05 sec", "p95_minutes": 17.73333333333333, "p95_formatted": "17 min 44 sec", "blocked_sec": 24.71025320512821, "saving_vs_random": 1.581170833333331, "saving_vs_btf": 9.1733875, "color": "#5D88B3", "explanation": "Steffen boarding, but passengers with more luggage move earlier inside each boarding wave."}, "WilMA": {"rank": 2, "mean_minutes": 16.55265833333333, "mean_formatted": "16 min 33 sec", "p95_minutes": 18.425, "p95_formatted": "18 min 26 sec", "blocked_sec": 28.68870032051282, "saving_vs_random": 1.114874999999998, "saving_vs_btf": 8.707091666666667, "color": "#588157", "explanation": "Window passengers first, middle seats second and aisle passengers last."}, "Steffen": {"rank": 3, "mean_minutes": 17.05590416666667, "mean_formatted": "17 min 03 sec", "p95_minutes": 18.875, "p95_formatted": "18 min 52 sec", "blocked_sec": 22.59648397435897, "saving_vs_random": 0.6116291666666633, "saving_vs_btf": 8.203845833333332, "color": "#315A7D", "explanation": "Deliberately space passengers several rows apart so they can stow luggage in parallel."}, "Lufthansa-like": {"rank": 4, "mean_minutes": 17.2126125, "mean_formatted": "17 min 13 sec", "p95_minutes": 19.13333333333333, "p95_formatted": "19 min 08 sec", "blocked_sec": 31.33328044871795, "saving_vs_random": 0.454920833333329, "saving_vs_btf": 8.047137499999998, "color": "#C99A35", "explanation": "Priority boarding combined with more explicit seat-position logic."}, "Random": {"rank": 5, "mean_minutes": 17.66753333333333, "mean_formatted": "17 min 40 sec", "p95_minutes": 19.65833333333333, "p95_formatted": "19 min 40 sec", "blocked_sec": 33.11660256410256, "saving_vs_random": 0.0, "saving_vs_btf": 7.592216666666669, "color": "#929292", "explanation": "No spatial boarding logic \u2014 passengers enter in random order."}, "US Network-like": {"rank": 6, "mean_minutes": 17.69554583333333, "mean_formatted": "17 min 42 sec", "p95_minutes": 19.85875, "p95_formatted": "19 min 52 sec", "blocked_sec": 33.23141185897436, "saving_vs_random": -0.02801250000000266, "saving_vs_btf": 7.564204166666666, "color": "#B8863B", "explanation": "Several successive priority groups followed by standard boarding groups."}, "Ryanair-like": {"rank": 7, "mean_minutes": 17.70456666666666, "mean_formatted": "17 min 42 sec", "p95_minutes": 19.78333333333333, "p95_formatted": "19 min 47 sec", "blocked_sec": 33.21999519230769, "saving_vs_random": -0.03703333333333347, "saving_vs_btf": 7.555183333333336, "color": "#D8AF45", "explanation": "A simplified priority-first boarding structure inspired by low-cost airline operations."}, "easyJet-like": {"rank": 8, "mean_minutes": 17.70820833333333, "mean_formatted": "17 min 42 sec", "p95_minutes": 19.71708333333333, "p95_formatted": "19 min 43 sec", "blocked_sec": 33.2449967948718, "saving_vs_random": -0.04067500000000024, "saving_vs_btf": 7.551541666666669, "color": "#E48B48", "explanation": "Families and priority passengers board ahead of the remaining passengers."}, "Reverse Pyramid (adapted)": {"rank": 9, "mean_minutes": 17.76660833333333, "mean_formatted": "17 min 46 sec", "p95_minutes": 19.6925, "p95_formatted": "19 min 42 sec", "blocked_sec": 32.88248397435898, "saving_vs_random": -0.09907500000000269, "saving_vs_btf": 7.493141666666666, "color": "#76639A", "explanation": "Combine seat position and distance from the door into diagonal boarding zones."}, "CRBF": {"rank": 10, "mean_minutes": 21.68560833333333, "mean_formatted": "21 min 41 sec", "p95_minutes": 23.94208333333334, "p95_formatted": "23 min 57 sec", "blocked_sec": 29.69971153846154, "saving_vs_random": -4.018075000000003, "saving_vs_btf": 3.574141666666666, "color": "#8C1D40", "explanation": "Board one seat column at a time, from the rear of the aircraft toward the front."}, "Back-to-Front": {"rank": 11, "mean_minutes": 25.25975, "mean_formatted": "25 min 16 sec", "p95_minutes": 27.9425, "p95_formatted": "27 min 57 sec", "blocked_sec": 67.91609294871793, "saving_vs_random": -7.592216666666669, "saving_vs_btf": 0.0, "color": "#3F3F3F", "explanation": "Call passengers in rear zones first and gradually move toward the front."}}}, "Operational stress": {"description": "A more difficult operating environment with more luggage, 75% boarding-order compliance and travel groups.", "policies": {"CRBF": {"rank": 1, "mean_minutes": 29.71283333333334, "mean_formatted": "29 min 43 sec", "p95_minutes": 33.00041666666667, "p95_formatted": "33 min 00 sec", "blocked_sec": 54.7378125, "saving_vs_random": 7.092370833333327, "saving_vs_btf": 16.15731249999999, "color": "#8C1D40", "explanation": "Board one seat column at a time, from the rear of the aircraft toward the front."}, "Steffen": {"rank": 2, "mean_minutes": 30.4579125, "mean_formatted": "30 min 27 sec", "p95_minutes": 33.84208333333333, "p95_formatted": "33 min 51 sec", "blocked_sec": 50.86504166666667, "saving_vs_random": 6.347291666666663, "saving_vs_btf": 15.41223333333333, "color": "#315A7D", "explanation": "Deliberately space passengers several rows apart so they can stow luggage in parallel."}, "Steffen-Lug": {"rank": 3, "mean_minutes": 32.94379166666667, "mean_formatted": "32 min 57 sec", "p95_minutes": 36.2175, "p95_formatted": "36 min 13 sec", "blocked_sec": 60.09545512820512, "saving_vs_random": 3.861412499999993, "saving_vs_btf": 12.92635416666666, "color": "#5D88B3", "explanation": "Steffen boarding, but passengers with more luggage move earlier inside each boarding wave."}, "Reverse Pyramid (adapted)": {"rank": 4, "mean_minutes": 34.2118, "mean_formatted": "34 min 13 sec", "p95_minutes": 37.70833333333334, "p95_formatted": "37 min 43 sec", "blocked_sec": 78.88680128205128, "saving_vs_random": 2.593404166666659, "saving_vs_btf": 11.65834583333332, "color": "#76639A", "explanation": "Combine seat position and distance from the door into diagonal boarding zones."}, "WilMA": {"rank": 5, "mean_minutes": 35.1850625, "mean_formatted": "35 min 11 sec", "p95_minutes": 38.77541666666666, "p95_formatted": "38 min 47 sec", "blocked_sec": 70.75482371794872, "saving_vs_random": 1.620141666666662, "saving_vs_btf": 10.68508333333332, "color": "#588157", "explanation": "Window passengers first, middle seats second and aisle passengers last."}, "Lufthansa-like": {"rank": 6, "mean_minutes": 35.73619583333333, "mean_formatted": "35 min 44 sec", "p95_minutes": 39.66708333333332, "p95_formatted": "39 min 40 sec", "blocked_sec": 72.95104487179488, "saving_vs_random": 1.069008333333329, "saving_vs_btf": 10.13394999999999, "color": "#C99A35", "explanation": "Priority boarding combined with more explicit seat-position logic."}, "Ryanair-like": {"rank": 7, "mean_minutes": 36.01948333333334, "mean_formatted": "36 min 01 sec", "p95_minutes": 39.77541666666666, "p95_formatted": "39 min 47 sec", "blocked_sec": 73.69030128205128, "saving_vs_random": 0.7857208333333219, "saving_vs_btf": 9.850662499999984, "color": "#D8AF45", "explanation": "A simplified priority-first boarding structure inspired by low-cost airline operations."}, "easyJet-like": {"rank": 8, "mean_minutes": 36.06260833333334, "mean_formatted": "36 min 04 sec", "p95_minutes": 40.00833333333333, "p95_formatted": "40 min 00 sec", "blocked_sec": 73.93308974358975, "saving_vs_random": 0.7425958333333256, "saving_vs_btf": 9.807537499999988, "color": "#E48B48", "explanation": "Families and priority passengers board ahead of the remaining passengers."}, "US Network-like": {"rank": 9, "mean_minutes": 36.10131666666667, "mean_formatted": "36 min 06 sec", "p95_minutes": 40.05083333333333, "p95_formatted": "40 min 03 sec", "blocked_sec": 74.04846474358975, "saving_vs_random": 0.7038874999999933, "saving_vs_btf": 9.768829166666656, "color": "#B8863B", "explanation": "Several successive priority groups followed by standard boarding groups."}, "Random": {"rank": 10, "mean_minutes": 36.80520416666666, "mean_formatted": "36 min 48 sec", "p95_minutes": 40.74166666666667, "p95_formatted": "40 min 44 sec", "blocked_sec": 78.76632051282051, "saving_vs_random": 0.0, "saving_vs_btf": 9.064941666666662, "color": "#929292", "explanation": "No spatial boarding logic \u2014 passengers enter in random order."}, "Back-to-Front": {"rank": 11, "mean_minutes": 45.87014583333332, "mean_formatted": "45 min 52 sec", "p95_minutes": 50.535, "p95_formatted": "50 min 32 sec", "blocked_sec": 149.3638221153846, "saving_vs_random": -9.064941666666662, "saving_vs_btf": 0.0, "color": "#3F3F3F", "explanation": "Call passengers in rear zones first and gradually move toward the front."}}}};

const AD_STATES = ["waiting","walking","stowing","seating","seated"];
let ANIMATION = {};
let _runCache = null, _runKey = null;

function decodeRun(c) {
    const n = c.r.length;
    const snapshots = new Array(c.S.length);
    for (let f = 0; f < c.S.length; f++) {
        const S = c.S[f], C = c.C[f];
        const passengers = new Array(n);
        let seated = 0, walking = 0, stowing = 0, seating = 0;
        for (let i = 0; i < n; i++) {
            const state = AD_STATES[S.charCodeAt(i) - 48];
            if (state === "seated") seated++;
            else if (state === "walking") walking++;
            else if (state === "stowing") stowing++;
            else if (state === "seating") seating++;
            passengers[i] = {
                row: c.r[i], seat: c.s[i], state: state,
                current_row: parseInt(C[i], 36) - 1
            };
        }
        snapshots[f] = { time: c.T[f], seated, walking, stowing, seating, passengers };
    }
    return { time: c.t, formatted: c.f, snapshots };
}

function buildAnimation(compact) {
    Object.keys(compact).forEach(scenario => {
        ANIMATION[scenario] = {};
        Object.keys(compact[scenario]).forEach(policy => {
            Object.defineProperty(ANIMATION[scenario], policy, {
                enumerable: true,
                get() {
                    const key = scenario + "|" + policy;
                    if (_runKey !== key) {
                        _runCache = decodeRun(compact[scenario][policy]);
                        _runKey = key;
                    }
                    return _runCache;
                }
            });
        });
    });
}

function boardingStoryInit() {



/* =========================================================
   HELPERS
   ========================================================= */

function formatSeconds(
    seconds
) {

    let rounded =
        Math.round(
            seconds
        );


    const mins =
        Math.floor(
            rounded / 60
        );


    const secs =
        rounded % 60;


    return (
        mins
        + " min "
        + String(
            secs
        ).padStart(
            2,
            "0"
        )
        + " sec"
    );
}


function formatMinutes(
    minutes
) {

    return formatSeconds(
        minutes * 60
    );
}


function money(
    value
) {

    const negative =
        value < 0;


    const absolute =
        Math.abs(
            value
        );


    let formatted;


    if (
        absolute >= 1000000
    ) {

        formatted =
            "$"
            + (
                absolute
                / 1000000
            ).toFixed(
                2
            )
            + "M";

    } else if (
        absolute >= 1000
    ) {

        formatted =
            "$"
            + (
                absolute
                / 1000
            ).toFixed(
                1
            )
            + "k";

    } else {

        formatted =
            "$"
            + Math.round(
                absolute
            ).toLocaleString();
    }


    return (
        negative
        ? "−" + formatted
        : formatted
    );
}


/* =========================================================
   AIRCRAFT
   ========================================================= */

const airScenario =
    document.getElementById(
        "airScenario"
    );

const airPolicy =
    document.getElementById(
        "airPolicy"
    );

const aircraft =
    document.getElementById(
        "aircraft"
    );

const airSlider =
    document.getElementById(
        "airSlider"
    );


let airIndex = 0;
let airTimer = null;
let airPlaying = false;


function buildAircraft() {

    aircraft.innerHTML =
        "";


    const blank =
        document.createElement(
            "div"
        );


    aircraft.appendChild(
        blank
    );


    [
        "A",
        "B",
        "C",
        "",
        "D",
        "E",
        "F"

    ].forEach(
        label => {

            const element =
                document.createElement(
                    "div"
                );


            element.className =
                "row-label";


            element.style.textAlign =
                "center";


            element.textContent =
                label;


            aircraft.appendChild(
                element
            );
        }
    );


    for (
        let row = 1;
        row <= 26;
        row++
    ) {

        const rowLabel =
            document.createElement(
                "div"
            );


        rowLabel.className =
            "row-label";


        rowLabel.textContent =
            row;


        aircraft.appendChild(
            rowLabel
        );


        [
            "A",
            "B",
            "C"

        ].forEach(
            seat => {

                const element =
                    document.createElement(
                        "div"
                    );


                element.className =
                    "seat";


                element.id =
                    `seat-${row}-${seat}`;


                aircraft.appendChild(
                    element
                );
            }
        );


        const aisle =
            document.createElement(
                "div"
            );


        aisle.className =
            "aisle";


        aisle.id =
            `aisle-${row}`;


        aircraft.appendChild(
            aisle
        );


        [
            "D",
            "E",
            "F"

        ].forEach(
            seat => {

                const element =
                    document.createElement(
                        "div"
                    );


                element.className =
                    "seat";


                element.id =
                    `seat-${row}-${seat}`;


                aircraft.appendChild(
                    element
                );
            }
        );
    }
}


function currentAnimation() {

    return (

        ANIMATION[
            airScenario.value
        ][
            airPolicy.value
        ]
    );
}


function clearCabin() {

    document
    .querySelectorAll(
        ".seat, .aisle"
    )
    .forEach(
        element => {

            element.innerHTML =
                "";
        }
    );
}


function renderAircraft() {

    const run =
        currentAnimation();


    const snapshot =
        run.snapshots[
            airIndex
        ];


    clearCabin();


    snapshot.passengers
    .forEach(
        passenger => {

            if (
                passenger.state
                === "seated"
            ) {

                const seat =
                    document.getElementById(

                        `seat-${passenger.row}-${passenger.seat}`
                    );


                if (seat) {

                    const person =
                        document.createElement(
                            "div"
                        );


                    person.className =
                        "person seated";


                    seat.appendChild(
                        person
                    );
                }
            }

            else if (
                passenger.current_row
                > 0
            ) {

                const aisle =
                    document.getElementById(

                        `aisle-${passenger.current_row}`
                    );


                if (aisle) {

                    const person =
                        document.createElement(
                            "div"
                        );


                    person.className =
                        `person ${passenger.state}`;


                    aisle.appendChild(
                        person
                    );
                }
            }
        }
    );


    document.getElementById(
        "airElapsed"
    ).textContent =

        formatSeconds(
            snapshot.time
        );


    document.getElementById(
        "airSeated"
    ).textContent =

        snapshot.seated
        + " / 156";


    document.getElementById(
        "airWalking"
    ).textContent =

        snapshot.walking;


    document.getElementById(
        "airStowing"
    ).textContent =

        snapshot.stowing;


    document.getElementById(
        "airFinal"
    ).textContent =

        run.formatted;


    airSlider.value =
        airIndex;


    const policyInfo =

        RESULTS[
            airScenario.value
        ]
        .policies[
            airPolicy.value
        ];


    document.getElementById(
        "airExplanation"
    ).innerHTML =

        "<strong>"
        + airPolicy.value
        + "</strong><br>"
        + policyInfo.explanation
        + "<br><br>"
        + "Average across 2,000 trials: "
        + "<strong>"
        + policyInfo.mean_formatted
        + "</strong>.";
}


function stopAircraft() {

    airPlaying =
        false;


    document.getElementById(
        "airPlay"
    ).textContent =
        "▶ Play";


    if (airTimer) {

        clearInterval(
            airTimer
        );
    }


    airTimer =
        null;
}


function playAircraft() {

    if (airPlaying) {

        stopAircraft();

        return;
    }


    airPlaying =
        true;


    document.getElementById(
        "airPlay"
    ).textContent =
        "❚❚ Pause";


    const speed =
        Number(

            document.getElementById(
                "airSpeed"
            ).value
        );


    airTimer =
        setInterval(
            () => {

                const run =
                    currentAnimation();


                airIndex++;


                if (
                    airIndex
                    >= run.snapshots.length
                ) {

                    airIndex =
                        run.snapshots.length
                        - 1;


                    renderAircraft();

                    stopAircraft();

                    return;
                }


                renderAircraft();

            },

            400 / speed
        );
}


function updateAircraftPolicies() {

    const scenario =
        airScenario.value;


    airPolicy.innerHTML =
        "";


    Object.keys(
        ANIMATION[
            scenario
        ]
    )
    .forEach(
        policy => {

            const option =
                document.createElement(
                    "option"
                );


            option.value =
                policy;


            option.textContent =
                policy;


            airPolicy.appendChild(
                option
            );
        }
    );


    airIndex =
        0;


    airSlider.max =
        currentAnimation()
        .snapshots.length
        - 1;


    renderAircraft();
}


Object.keys(
    ANIMATION
)
.forEach(
    scenario => {

        const option =
            document.createElement(
                "option"
            );


        option.value =
            scenario;


        option.textContent =
            scenario;


        airScenario.appendChild(
            option
        );
    }
);


airScenario.addEventListener(

    "change",

    () => {

        stopAircraft();

        updateAircraftPolicies();
    }
);


airPolicy.addEventListener(

    "change",

    () => {

        stopAircraft();

        airIndex =
            0;


        airSlider.max =
            currentAnimation()
            .snapshots.length
            - 1;


        renderAircraft();
    }
);


airSlider.addEventListener(

    "input",

    () => {

        stopAircraft();


        airIndex =
            Number(
                airSlider.value
            );


        renderAircraft();
    }
);


document.getElementById(
    "airPlay"
)
.addEventListener(
    "click",
    playAircraft
);


document.getElementById(
    "airRestart"
)
.addEventListener(

    "click",

    () => {

        stopAircraft();

        airIndex =
            0;

        renderAircraft();
    }
);


buildAircraft();


airScenario.value =
    Object.keys(
        ANIMATION
    )[0];


updateAircraftPolicies();


/* =========================================================
   INTERACTIVE RESULT BARS
   ========================================================= */

const resultTabs =
    document.getElementById(
        "resultTabs"
    );


const resultsBars =
    document.getElementById(
        "resultsBars"
    );


let activeResultScenario =
    Object.keys(
        RESULTS
    )[0];


function renderResults() {

    resultTabs.innerHTML =
        "";


    Object.keys(
        RESULTS
    )
    .forEach(
        scenario => {

            const button =
                document.createElement(
                    "button"
                );


            button.textContent =
                scenario;


            button.className =

                "scenario-tab"
                + (
                    scenario
                    === activeResultScenario

                    ? " active"

                    : ""
                );


            button.onclick =
                () => {

                    activeResultScenario =
                        scenario;

                    renderResults();
                };


            resultTabs.appendChild(
                button
            );
        }
    );


    document.getElementById(
        "resultDescription"
    ).textContent =

        RESULTS[
            activeResultScenario
        ]
        .description;


    const policies =

        Object.entries(

            RESULTS[
                activeResultScenario
            ]
            .policies
        )
        .sort(
            (a,b) =>
                a[1].rank
                - b[1].rank
        );


    const maxTime =

        Math.max(

            ...policies.map(
                item =>
                    item[1]
                    .mean_minutes
            )
        );


    resultsBars.innerHTML =
        "";


    policies.forEach(
        ([name, info]) => {

            const row =
                document.createElement(
                    "div"
                );


            row.className =
                "result-row";


            const nameDiv =
                document.createElement(
                    "div"
                );


            nameDiv.className =
                "result-name";


            nameDiv.textContent =

                info.rank
                + ". "
                + name;


            const track =
                document.createElement(
                    "div"
                );


            track.className =
                "bar-track";


            const fill =
                document.createElement(
                    "div"
                );


            fill.className =
                "bar-fill";


            fill.style.width =

                (
                    info.mean_minutes
                    / maxTime
                    * 100
                )
                + "%";


            fill.style.background =
                info.color;


            track.appendChild(
                fill
            );


            const value =
                document.createElement(
                    "div"
                );


            value.className =
                "result-time";


            value.textContent =
                info.mean_formatted;


            row.appendChild(
                nameDiv
            );


            row.appendChild(
                track
            );


            row.appendChild(
                value
            );


            resultsBars.appendChild(
                row
            );
        }
    );
}


renderResults();


/* =========================================================
   SAVINGS CALCULATOR
   ========================================================= */

const calcScenario =
    document.getElementById(
        "calcScenario"
    );


const calcPolicy =
    document.getElementById(
        "calcPolicy"
    );


const calcReference =
    document.getElementById(
        "calcReference"
    );


Object.keys(
    RESULTS
)
.forEach(
    scenario => {

        const option =
            document.createElement(
                "option"
            );


        option.value =
            scenario;


        option.textContent =
            scenario;


        calcScenario.appendChild(
            option
        );
    }
);


function updateCalcPolicies() {

    const scenario =
        calcScenario.value;


    const previousPolicy =
        calcPolicy.value;


    const previousReference =
        calcReference.value;


    calcPolicy.innerHTML =
        "";


    calcReference.innerHTML =
        "";


    Object.entries(

        RESULTS[
            scenario
        ]
        .policies
    )
    .sort(
        (a,b) =>
            a[1].rank
            - b[1].rank
    )
    .forEach(
        ([policy, info]) => {

            const option =
                document.createElement(
                    "option"
                );


            option.value =
                policy;


            option.textContent =
                policy;


            calcPolicy.appendChild(
                option
            );


            calcReference.appendChild(
                option.cloneNode(true)
            );
        }
    );


    const policies =
        Object.keys(
            RESULTS[scenario].policies
        );


    calcPolicy.value =
        policies.includes(previousPolicy)
        ? previousPolicy
        : (policies.includes("CRBF") ? "CRBF" : policies[0]);


    calcReference.value =
        policies.includes(previousReference)
        ? previousReference
        : (
            policies.includes("Back-to-Front")
            ? "Back-to-Front"
            : policies[policies.length - 1]
        );


    updateCalculator();
}


function updateCalculator() {

    if (
        !calcScenario.value
        ||
        !calcPolicy.value
    ) {

        return;
    }


    const scenario =
        calcScenario.value;


    const policy =
        calcPolicy.value;


    const reference =

        calcReference.value;


    const flights =

        Number(

            document.getElementById(
                "calcFlights"
            ).value
        );


    const cost =

        Number(

            document.getElementById(
                "calcCost"
            ).value
        );


    const policyData =

        RESULTS[
            scenario
        ]
        .policies[
            policy
        ];


    const referenceData =

        RESULTS[
            scenario
        ]
        .policies[
            reference
        ];


    const saved =

        referenceData.mean_minutes
        - policyData.mean_minutes;


    const perFlight =
        saved
        * cost;


    const annual =
        perFlight
        * flights
        * 365;


    document.getElementById(
        "calcTime"
    ).textContent =

        saved >= 0

        ? formatMinutes(
            saved
        )

        : "−"
          + formatMinutes(
              Math.abs(
                  saved
              )
          );


    document.getElementById(
        "calcFlight"
    ).textContent =

        money(
            perFlight
        );


    document.getElementById(
        "calcAnnual"
    ).textContent =

        money(
            annual
        );
}


calcScenario.addEventListener(

    "change",

    updateCalcPolicies
);


calcPolicy.addEventListener(

    "change",

    updateCalculator
);


[
    "calcReference",
    "calcFlights",
    "calcCost"

].forEach(
    id => {

        const element =
            document.getElementById(
                id
            );


        element.addEventListener(

            "input",

            updateCalculator
        );


        element.addEventListener(

            "change",

            updateCalculator
        );
    }
);


calcScenario.value =
    Object.keys(
        RESULTS
    )[0];


updateCalcPolicies();


}

fetch("/assets/boarding/anim.json")
    .then(response => response.json())
    .then(compact => {
        buildAnimation(compact);
        boardingStoryInit();
    })
    .catch(() => {
        const box = document.getElementById("aircraft");
        if (box) box.innerHTML =
            "<p style='padding:2rem'>The boarding animation could not be loaded.</p>";
    });

</script>



 ]]></description>
  <category>Aviation</category>
  <guid>https://www.analystsdiary.com/posts/aviation/boarding-fastest-method.html</guid>
  <pubDate>Mon, 24 Aug 2026 00:00:00 GMT</pubDate>
  <media:content url="https://www.analystsdiary.com/assets/icons/aviation.svg" medium="image" type="image/svg+xml"/>
</item>
<item>
  <title>Why aviation belongs in an analyst’s diary</title>
  <link>https://www.analystsdiary.com/posts/aviation/why-aviation.html</link>
  <description><![CDATA[ 




<p>Few industries record as much of themselves as aviation does. Every delay, diversion, and load factor is logged, published, and comparable across carriers and continents.</p>
<section id="what-this-section-will-cover" class="level2">
<h2 class="anchored" data-anchor-id="what-this-section-will-cover">What this section will cover</h2>
<!-- TODO -->
</section>
<section id="data-sources" class="level2">
<h2 class="anchored" data-anchor-id="data-sources">Data sources</h2>
<!-- TODO -->


</section>

 ]]></description>
  <category>Aviation</category>
  <guid>https://www.analystsdiary.com/posts/aviation/why-aviation.html</guid>
  <pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate>
  <media:content url="https://www.analystsdiary.com/assets/icons/aviation.svg" medium="image" type="image/svg+xml"/>
</item>
</channel>
</rss>
