Each rule delivers the same message on the same topology, between the same sender and recipient. We compare what each spends on the air, and what each must learn before it can forward at all.
Press Send to deliver one message under the selected rule.
Setup. Hall sets the square's side. A cluster is one cell of it and the radio reaches one cell side, so Cell sets the cluster size, the range and how many clusters the hall divides into at once — which is also why every member can hear into a neighbouring cluster. The seed fixes the topology and the sender–recipient pair, so switching rules repeats the same delivery, paired per seed. Speed is wall-clock only — a shorter tick runs the same mesh faster, and the congested rules need it.
Scope. The mesh carries background traffic at all times, with custody capped at 60 packets, hop budget 7, and idle link rotation for top-3 — the only rule that runs with the policy on. A node drives all its links at once and its radio's rate is split across the ones transferring, on top of a coarse contention penalty. Our message is injected into that running mesh. The field shows mechanism; every rate we report comes from the measured runs below.
One point per completed send, in the order you made them. A curve is one rule with one set of parameters, so changing F or the weights starts a new curve rather than moving an old one. Reconfiguring the field clears everything, since the runs would no longer be comparable.
Every peer advertises a score for itself. A node ranks its links by the score the peer on the far side advertises — it never computes anything about that peer itself.
A link is a lane if its peer passes the gate. The node floods each message on its top F lanes only; messages addressed to a link's own peer bypass lanes entirely.
Both terms ride the peer's ANNOUNCE, quantized to one byte and refreshed once per announce epoch, so every decision runs on values as stale as that interval. Quantization is load-bearing: with raw doubles, jitter in ρ reshuffles near-tied rankings on every announce, and the resulting preemption storm aborts transfers mesh-wide.
| α | weight on centrality | 0.5 |
| β | weight on free buffer | 0 |
| θ | gate threshold, inclusive | 0 |
| F | lane fan-out | 3 |
| W | centrality window | 60 s |
| Dmax | concurrent link cap | 7 |
| — | announce interval | 5 s |
With β = 0 the score reduces to Sk = αCk: this arm ranks by centrality alone. θ = 0 under the inclusive gate admits every peer, including those that have fed nobody yet.
| Rule | 160 | 240 | 320 | 400 | 480 | relays / delivered |
|---|
Measures. Relays per delivered message is our airtime proxy, listed at
480 nodes. A shortest path costs its hop count, so the oracle stays at 8.2 → 10.0 across a
threefold rise in node count while the flood goes 116 → 371: flooding costs O(n)
per message, directed forwarding O(hops). Read the flood's median latency against
its delivery — it falls with density only because the slow messages stop arriving at all.
Threats to validity. The simulator keeps an exact set of seen packet ids per peer; the implementation uses a Bloom filter of 96,000 bits over at most 10,000 items at ~1% false positives, rotating every 5 minutes. The modelled seen-set never errs, never fills and never forgets, so the sync exchange is cheaper here than on a device. The two errors do not cancel: a false positive skips a packet the node lacks, costing delivery where copies are fewest, while rotation forgets and old packets are reflooded, costing airtime where copies are most. We report relays per delivered as a lower bound, for every rule.