Paper fidelity — AntHocNet v1.0¶
How this implementation maps to the canonical paper, what is reproduced, and
where it deviates — honestly. The reference is [1] = Di Caro, Ducatelle &
Gambardella, AntHocNet: an Ant-Based Hybrid Routing Algorithm for Mobile Ad Hoc
Networks, PPSN VIII, LNCS 3242, 2004 (digest:
publications/papers/2004-ppsn-anthocnet.md).
The living compliance ledger is issue #91.
What v1.0 claims. A faithful, simulator-agnostic implementation of the AntHocNet algorithm with NS-2 and NS-3 adapters, whose mechanisms and parameters match [1] and whose delivery-ratio and overhead advantages over AODV reproduce the paper. It does not claim bit-for-bit reproduction of the paper's Qualnet numbers, nor that every headline metric is reproduced on every ns-3 channel model — see Known deviations below.
Mechanisms (feature ↔ paper § ↔ evidence)¶
| Mechanism | [1] § | Implementation | Status |
|---|---|---|---|
| Reactive path setup (forward/backward ants) | 3.1 | core/ant_router_logic |
✅ core-tested |
| Multipath setup (hops+time acceptance filter; [1] states 1.5×) | 3.1 | GenerationTracker, enableMultipath (#96/#97) |
✅ default on — factors are the thesis's a1 = 0.9 / a2 = 2.0 since #177 |
MAC-queue-aware per-hop cost (Q+1)·T̂_mac (A2) |
3.1 | enableMacMetric (#67/#70) |
✅ formula matches; default off (gated) |
Pheromone deposit τ=((T̂+h·T_hop)/2)⁻¹, running avg γ |
3.1 | pheromone_engine |
✅ |
| Stochastic data routing, pheromone² | 3.2 | betaData=20 (#179) |
⚠️ deliberate deviation — follows the thesis's β₃ = 20 instead of [1]'s squared rule; measured, see below |
| Proactive ants, unsquared pheromone, broadcast≤2 | 3.3 | betaAnts=20, proactiveMaxBroadcasts=2 (#45/#179) |
⚠️ deliberate deviation on the exponent (thesis β₁=β₂=20); broadcast≤2 ✅ |
| Pheromone diffusion via hello ants | 3.3 | enableDiffusion (ADR-0007) |
✅ |
| Reactive ant floods when it has no pheromone | 3.1 | default behaviour; enableDirectedReactive steers instead (ADR-0016) |
✅ faithful by default — the deviation is off |
| Hello beacons (1 s, 2 missed → remove) | 3.3 fn.1 | helloInterval, allowedHelloLoss |
✅ |
| Link-failure detection + notification | 3.4 | detectors A/D (#19/#44/#54) | ✅ |
| Bounded local repair (≤2 broadcasts, wait 5×) | 3.4 | repairMaxBroadcasts, repairWaitFactor |
✅ |
Every pinned-down parameter and its match/deviation status is tabulated in the
paper digest §3; the corresponding
Config defaults, the provenance category of each ([1] §x / thesis / repo
choice / unknown) and how to calibrate one are in
configuration.md.
Headline results vs AODV (paper regime: 50 nodes, 1500×300 m, RWP 20 m/s, 20 CBR flows)¶
| Paper claim ([1] §4.2) | Reproduced? | Evidence (this repo, ns-3, 5 seeds) |
|---|---|---|
| PDR ≥ AODV, gap grows with difficulty | ✅ | 92.1 vs 81.4 (disk); 92.9 vs 83.4 (two-ray). #22 (mobility), taxonomy |
| Overhead (NRL) below AODV | ✅ | 45 vs 61 (disk); 44 vs 75 (two-ray) |
| Delay/jitter QoS advantage (bounded tail) | 🟡 partial | two-ray (paper PHY): mean-delay parity with AODV (52.8 vs 52.6 ms), jitter within 11 %, after the #21 reconv hold cap (#104). Disk model: tail narrowed (delay99 −37 %, jitter −26 % via ReconvHoldCap, measured at the then-default 1 s; 200 ms since #371) but still above AODV |
Correction pending re-measurement (#169, 2026-07-25)¶
Every benchmark number in this document was produced with
reactiveMaxBroadcasts = 2, which — because a reactive forward ant
broadcasts at every node lacking pheromone for the destination — was a hop
limit on route discovery: destinations more than ~5 hops away were never
found at all. Both primary sources bound the reactive flood by duplicate
suppression and maxPathLength, never by a broadcast count; the 2-broadcast
rule belongs to proactive ants ([1] §3.3). The default is now unbounded.
This most likely explains the sparse/long-path results that were previously
read as protocol character — in particular the static-network inversion
(delivery 59.9 % vs AODV 98.9 % at pause=900, while AntHocNet led under
constant motion) and the decay of its advantage as the field is stretched.
Until the sweeps are re-run, treat every result below — including the headline
PDR/NRL figures — as pending re-measurement, and do not cite the
sparse-static weakness as a property of the algorithm.
Confirmed, and it exposed a second defect. The first taxonomy run after the
fix bears the diagnosis out: sparse-static rose 83.8 → 93.0 %, overtaking
AODV (81.9 %), and the inversion is gone. But large-scale fell 75.8 → 21.7 %
and heavy-load 85.0 → 51.4 %, with NRL rising 99.9 → 3071. Cause
(#173): with
enableMultipath on, a reactive forward ant is admitted by the acceptance band
instead of (src,seq) duplicate suppression, so removing the broadcast budget
left the reactive flood unbounded in dense graphs. reactiveMaxBroadcasts
became a per-(node, generation) broadcast count (default 2 at the time)
rather than a per-path budget — bounding the flood without reintroducing the
169 hop limit. Numbers measured between those two fixes carry the flood and¶
are not representative either. (#177
later retired the count — default now -1, unbounded — because the thesis's
a1 = 0.9 acceptance band bounds the flood on its own; see
configuration.md §4.)
Where we ship [1]'s algorithm and the 2007 thesis superseded it¶
The thesis is this repo's designated primary source for parameters that [1] leaves unspecified (#58/#70). On three mechanisms the two sources disagree because the thesis's authors changed the algorithm, and in all three we ship the [1] version. That is defensible — [1] is a real published algorithm and the one this document's claims are written against — but it had not been stated anywhere, so a reader checking us against the thesis would read three deliberate choices as three defects. Recorded here (audit: #182):
- Multipath reactive route setup. [1] §3.1 admits later same-generation
ants within a 1.5× band (
enableMultipath,antAcceptanceFactor). The thesis parameterises the same band differently (a1 = 0.9, plusa2 = 2for first-hop-disjoint ants) and then records dropping the design: reactive setup is restricted to a single route, with multiple routes obtained through proactive maintenance instead. #177 measured the options and adopted the thesis's factors (a1 = 0.9,a2 = 2.0) while keeping [1]'s multipath mechanism — so this item is now a hybrid, not a pure [1] choice; #178 records the citation trap. - Proactive broadcast probability (
proactiveBroadcastProb = 0.1). Our exact value appears in the thesis, but in §4.3.4, "Older versions of AntHocNet". In the shipped thesis algorithm proactive forward ants are "never broadcast" — on reaching a node with no routing information for the destination they are simply discarded. - Proactive broadcast budget (
proactiveMaxBroadcasts = 2). Same section, same status: the thesis states the budget asnb = 2for the older algorithm only. With no proactive broadcasting in the current version, there is nothing for the budget to bound there.
So the accurate claim is "faithful to [1]", not "as close to the 2007 thesis as
possible". Provenance for each parameter is in
configuration.md §3.1, where these rows are marked
thesis §4.3.4 (superseded version) rather than a bare thesis.
The exception: the β exponents now follow the thesis (#179)¶
The three items above are places where the two sources disagree and we keep [1]. The routing exponents are the one place we deliberately went the other way, so the "faithful to [1]" claim needs this carve-out.
The sources disagree on a ratio, not just a value:
| data exponent | ant exponent | relationship | |
|---|---|---|---|
| [1] PPSN 2004 | pheromone squared (§3.2, "to be more greedy with respect to the better paths") | unsquared (§3.3, "not squared, so that they sample the paths more evenly") | asymmetric, 2 : 1 — ants explore wider than data |
| 2007 thesis | β₃ = 20 (eq 4.6, "we normally keep β₃ on 20") | β₁ = 20 (eq 4.1), β₂ = 20 (eq 4.5) | symmetric, 1 : 1 |
[1] gives no absolute values, only the squared/unsquared form; the thesis gives
numbers. That is the same situation as hopTimeSec (#88), where the thesis's
3 ms replaced a value [1] defines but never states — and the same resolution.
What we give up by adopting 20/20 is [1]'s reason for the asymmetry: ants no
longer sample more evenly than data, because they use the identical exponent.
The thesis does not lose exploration, it relocates it — proactive ants there
route on max(regular, virtual) pheromone (eq 4.5) and carry a per-node
broadcast probability, so exploration comes from the virtual pheromone rather
than from a flatter distribution.
Unlike the three items above, this one is measured, not just sourced. A
20-seed × 900 s paired A/B across all six discrete scenarios
(#179) moved five of six
to PAIRED-IMPROVED with none regressing: PDR +0.50 to +3.23 pp and routing
load −9.7 % to −16.7 % where significant, with the baselines byte-identical
across arms. It also narrowed the #21
delay-tail deficit against AODV on five of six scenarios (heavy-load
+125.4 % → +82.4 %) without closing it. The one adverse signal is dense-small's
tail at +9.55 ms, where the bootstrap CI and the Wilcoxon test disagree.
betaAnts conflates the thesis's β₁ and β₂. They coincide at 20, so nothing is
lost today — but the thesis sweeps β₂ separately in chapter 5, so the field must
be split before anyone deviates per ant type.
Known deviations (honest list)¶
- Delay tail on the ns-3 disk model (#21). On the contention-dominated
range/disk propagation model AntHocNet's delay99/jitter run above AODV even
after the multipath (#96), backward-ant flush (#101) and reconv hold-cap
(#104) work. On two-ray — the paper's actual PHY — the gap closes to
parity on mean delay. The residual is a channel-model artefact
(CONTEXT.md §8), not an algorithmic gap. Mitigated by
ReconvHoldCap(measured at the then-default1.0 s; the shipped default is200 mssince the #371 flip for the v1.5.0 re-baseline). Note (2026-07-25): theT_hopco-lever named in item 2 has now been corrected to the thesis value; the benchmark impact on this tail is pending a re-run (#88). T_hop— resolved from the primary source (#88, 2026-07-25). [1] defines the constant but states no number. The 2007 Ducatelle thesis does: "we kept thop on 0.003 sec". The repo's provisional 50 ms was 16.7× too large and is now corrected to 3 ms. BecauseT_hopweights hop count against measured delay in every pheromone deposit, this changes all routing goodness values — every benchmark number in this document predates the fix and must be re-measured before being cited as current. A prior sweep suggested a few-ms value cuts delay/jitter ~12 %, so the #21 delay tail may improve.- Evaporation (
enableEvaporation, default on; ADR-0012) — a time-decay safety net not present in [1] (whose reinforcement is a pure running average). Config-gated so the paper-faithful ablation is available. - Proactive ant clocking — [1] emits one proactive ant per n data
packets; the repo clocks it on a timer (
proactiveInterval). #26 item 04. Note the mechanism is not a deviation against the thesis, which uses a plain periodic timer as we do; what differs there is only the interval. The #248 sweep measured it (7 points, paper field, 900 s, paired seeds): the thesis's §5.3.3 "2 s almost always best" inverts on our field — the curve is strictly monotone toward less proactive, withEnableProactive=falsethe measured MANET optimum (97.2 PDR / 31.73 NRL vs 94.9/40.51 at the 10 s default; 2 s costs −15.8 pp PDR and ×5.3 NRL). The 10 s default is retained cross-regime — the satellite track (#192) is the configuration that needs proactive sampling; MANET benchmark guidance is proactive off. 4b. The thesis's proactive emission gate is implemented per-link and shipped OFF (proactiveVirtualMargin, default0; the thesis states0.10best-vs-best). Two deviations by measurement, not by omission: the value and the shape. At the thesis value the literal scalar gate suppressed essentially all proactive maintenance (pass rate 0–3.8 %; PR #188 measured the damage as NRL +36-68 %, PDR −5 to −6.4 pp) — originally because two table-hygiene defects depressed virtual pheromone (#262 aging clock, #279 advert magnitude, both since fixed), but the post-fix uniformity probe (exp_uniformity_probe, PR #278) showed the scalar form is structurally broken regardless: best-vs-best compares estimators of different paths, and its ratio has a hard ceiling τ(h−1)/τ(h) ≈ h/(h−1) (measured byte-exact), so any fixed margin silently disables the gate beyond 1 + 1/m hops. ADR-0018 re-derives the comparison per-link — v vs r on the same neighbour, an unsampled-link hint passing trivially — which cancels the systematic and makes the margin hop-independent (probe: per-link ratio centred 0.97–1.06). The mechanism is the thesis's; the shape is a measured correction; the default stays 0 pending the satellite-regime A/B on #180.core/tests/exp_gate_cascade.cppreproduces the historical failure. - Multipath link-failure suppression — with multipath on, a link break that leaves a usable alternate next-hop is absorbed rather than always notified (paper §3.4 always notifies). Benchmark-justified (#96): notification floods cost PDR on the ns-3 channel.
- Directed reactive discovery (
enableDirectedReactive, default off; ADR-0016) — a mechanism in neither source: a reactive forward ant may be unicast along the diffused virtual gradient instead of broadcast. Listed here for completeness rather than as an active deviation — with the default off the shipped protocol matches [1] §3.1 exactly, and the gate exists to make the deviation runnable (the inverse of item 3, where the gate makes the fidelity runnable). #244 measures it; #245 tracks the open hazard that a stale gradient can strand the single steered ant where a flood would not have been. - Cross-simulator parity is not guaranteed — NS-2 and NS-3 have different MAC/PHY; the NS-2 adapter also has no pending-queue hold cap yet. Treat cross-sim comparison as behaviour re-validation, not a bit-for-bit port.
Verification status¶
- Algorithm mechanisms: ✅ covered by
core/tests(unit + randomized property/invariant sweeps), NS-2/NS-3 e2e delivery smokes in CI. - Parameters vs [1] (2004 paper): ✅ verified — see the digest table.
- Parameters vs 2007 thesis: 🟡 partial — thesis obtained 2026-07-25.
T_hop✅ adopted (3 ms). Jitter estimator ✅ defined in the thesis (eq. 5.1,Σ|(tᵢ−tᵢ₋₁)−(tᵢ₋₁−tᵢ₋₂)|) but not yet reconciled with our FlowMonitorjitterSummetric (#89). Full field table ✅ read from §5.1.3 and adopted into--scenario=thesis(#58) — five constants corrected (2400×800 m, 10 m/s, 2048 bps, 250 m range, 20 repetitions); the thesis's two-ray propagation still has to be asked for with--propagation=tworay. - Numbers on the paper's own 900 s / large-scale field: ⏳
--scenario=thesispreset exists; the multi-hour run is future work.
v1.0 is the milestone where the mechanisms and 2004-paper parameters are faithful and the delivery/overhead claims reproduce; the thesis parameter cross-check and the full disk-model delay-tail closure are the roadmap beyond it (#91).