A social-force simulation and evolutionary search testing when pillars help—or harm—crowds moving through a door.
A pillar in front of an exit can make a panicking crowd leave faster. It can also turn an ordinary evacuation into a permanent jam. The interesting problem is not whether the paradox exists in one simulation. It is why it appears, where it stops, and whether a search can find a layout that is useful without being dangerous.
I built a social-force crowd simulator, used evolutionary search to place circular pillars, and then extended the project by treating the simulated crowd as both a fluid and a granular material. The final study contains thousands of matched simulations across door widths, crowd sizes, desired speeds, pillar gaps, and multi-pillar patterns. Every reported winner was evaluated on crowds the search had never seen.
The result is less like a design recommendation than a map of a trade-off. A tuned pillar can raise a one-metre door's capacity by about 20%, lower the pressure concentrated around the exit, and cut long stalls in half. But its useful position sits beside a sharp failure region, and the larger search did not discover a layout with a large gain for both calm and pushing crowds.
The room is 12 by 12 metres with a one-metre door in its right wall. Each person is a disc with radius 0.25–0.35 m and mass 80 kg. The simulator follows the social-force model introduced by Helbing, Farkas and Vicsek: each person is driven toward the exit, repelled before contact, and compressed and dragged by friction after contact.
$$ m\dot{\mathbf v}i = m\frac{v0\mathbf ei-\mathbf vi}{\tau} + \sum{j\ne i}\mathbf f{ij} + \sumW\mathbf f{iW} $$
The desired speed $v0$ is the control for how hard the crowd pushes. At low values people approach the door calmly. At 5 m/s they continue trying to accelerate even when the crowd in front has nowhere to go. Contact and tangential friction then stabilize temporary arches across the opening. This creates the classic faster-is-slower effect: after a point, increasing the desired speed makes the room empty more slowly.
The simulator is intentionally small enough to inspect. A scenario fixes the room, door, desired speed, people, pillars, and random seed. Paired comparisons use the same seed with and without a pillar, so the initial crowd is identical and only the geometry changes.
base = Scenario(desiredspeed=5.0, seed=101) pillar = base.with(pillars=[(10.5, 6.0, 0.53)])