Paper · 2019-04-10 · cs.NE
Fitness Dependent Optimizer: Inspired by the Bee Swarming Reproductive Process
FDO is a PSO-like swarm optimizer whose step size comes from a fitness-derived weight instead of a velocity term, with a random factor and a reused pace after successful moves. Author-reported: it beats PSO, GA and DA on 19 classical functions and DA, WOA and SSA on 10 CEC-2019 functions, with 30 runs, 10-D.
Metaheuristic optimizationParticle swarm optimizationoptimizationswarm-intelligencemetaheuristic
arXivPDFCodeMarkdown14 min read
AI-compiled by claude-haiku-5-5 on 2026-10-18, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.
In plain words
Optimization means finding the input that gives the best score for some function, for example the lowest error or the lowest cost. A common family of methods copies how animals search together: many simple agents spread out, share what they find, and move toward good spots. This paper proposes one such method, the Fitness Dependent Optimizer (FDO), inspired by how honeybee swarms pick a new nest.
In FDO, each agent is a "scout bee" that sits at one candidate solution. On every round, the agent's step length and direction are based on how good the current best candidate is compared with the agent's own score, plus some randomness. This is different from the usual swarm methods, which keep a velocity that is updated from memory. FDO also remembers the last step that helped an agent, and tries it again if the new step fails.
The authors report that FDO works better than several well-known swarm and evolutionary methods on standard test functions and on two engineering-style examples. These comparisons come from the authors' own experiments, so treat them as claims to check.
TL;DR
- FDO is a swarm optimizer that replaces PSO-style velocity with a step scaled by a fitness-derived weight §III §IV.
- Per agent it needs a fitness weight, a random factor and a stored pace; the paper says the only parameter to tune is the weight factor wf §IV §V.1.
- Author-reported: best or competitive results against PSO, GA, DA on 19 classical functions and against DA, WOA, SSA on 10 CEC-2019 functions, with 30 runs §V tab. 2 tab. 3.
- The official code is an Apache-2.0 MATLAB port with several differences from the paper; see Paper vs code before implementing.
Problem
Nature-inspired metaheuristics can get stuck in local optima, and they have few guarantees on hard multimodal problems §I. The paper argues that no single algorithm is best on every problem (the No Free Lunch argument) and that a new method is worth proposing when it helps on some problems §I. It also argues that PSO-based updates need several coefficients that are tuned by hand, while FDO needs only one §IV.
Method
FDO is presented as a population of N scout bees that search a bounded box. The procedure is given in the pseudocode below and in Figure 3 fig. 3.
- Initialisation. Scouts start at random positions inside the bounds §IV. The initial pace of each scout is not stated fig. 3.
- Best scout. In each iteration the paper selects the global best scout once §IV.
- Fitness weight. For each scout, the weight is the ratio of the best fitness to the scout's own fitness, minus the weight factor wf eq. 2. The paper says the weight should lie in [0, 1] §IV. The text says wf controls how the weight behaves, and that wf = 0 gives the more stable search §IV.
- Zero fitness. When the scout's own fitness is 0, the weight is set to 0 instead of dividing by zero §IV fig. 3.
- Random factor. The paper names r as a random number in [-1, 1] and says a Lévy flight is used for it, because its distribution gives more stable movement §IV.
- Pace. The pace depends on the weight and r eq. 3 eq. 4 eq. 5. If the weight is 0 or 1, the pace is the scout's position times r eq. 3. Otherwise the pace is the distance to the best scout times the weight, with the sign chosen by the sign of r eq. 4 eq. 5.
- Candidate move. The new position is the old position plus the pace eq. 1. If it improves the fitness, it is accepted and the pace is saved fig. 3.
- Second try. If the candidate is not better, the scout tries the position plus its previously saved pace, when one exists §IV fig. 3. If that is better, it is accepted.
- Otherwise the scout stays where it is fig. 3.
- Maximisation. Two changes are needed: Equation 6 replaces Equation 2, and the comparisons are inverted §IV.
# Fitness Dependent Optimizer, minimisation [alg. 1] [fig. 3]
# Input: objective f; bounds lower, upper; n scouts; T iterations; wf
# Output: best position found and its fitness; dims = problem dimension
def fdo(f, n, T, wf, lower, upper):
# Random start inside the box [§IV]
positions = random_uniform(lower, upper, shape=(n, dims)) # (n, dims)
# Saved pace per scout, empty until its first accepted move [fig. 3]
paces = [None] * n
for t in range(T):
# Best scout of this iteration, taken once per iteration [§IV]
best = positions[argmin(f(positions))]
for i in range(n):
# Weight is 0 when the scout's own fitness is zero [fig. 3]
if f(positions[i]) == 0:
weight = 0
else:
# Eq. 2 as printed, with an absolute value [eq. 2]
weight = abs(f(best) / f(positions[i])) - wf
# Random number in [-1, 1] [§IV]
r = random_uniform(-1, 1)
# Weight of 0 or 1 gives a pace from the position [eq. 3]
if weight == 0 or weight == 1:
pace = positions[i] * r
# Negative r flips the sign of the step [eq. 4]
elif r < 0:
pace = (positions[i] - best) * weight * -1
# Non-negative r keeps the sign [eq. 5]
else:
pace = (positions[i] - best) * weight
# Candidate from the new pace [eq. 1]
candidate = positions[i] + pace # boundary rule not stated
if f(candidate) < f(positions[i]):
# Accept and keep this pace for reuse [fig. 3]
positions[i] = candidate
paces[i] = pace
elif paces[i] is not None:
# Retry with the saved pace [§IV] [fig. 3]
candidate = positions[i] + paces[i] # [eq. 1]
if f(candidate) < f(positions[i]):
positions[i] = candidate
# Otherwise keep the current position [fig. 3]
# Best scout after the last iteration [§IV]
best = positions[argmin(f(positions))]
return best, f(best)Key equations, as printed in the paper:
X_{i,t+1} = X_{i,t} + pace eq. 1
fw = \left| \frac{x^*_{t,\,fitness}}{x_{i,t,\,fitness}} \right| - wf eq. 2
Here x^*_{t} is the best scout and x_{i,t} the current scout. Equation 2 applies to minimisation.
pace = x_{i,t} \cdot r \quad \text{if } fw = 1,\ fw = 0,\ \text{or } x_{i,t,\,fitness} = 0 eq. 3
pace = (x_{i,t} - x^*_{i,t}) \cdot fw \cdot (-1) \quad \text{if } r < 0 eq. 4
pace = (x_{i,t} - x^*_{i,t}) \cdot fw \quad \text{if } r \ge 0 eq. 5
fw = \left| \frac{x_{i,t,\,fitness}}{x^*_{t,\,fitness}} \right| - wf eq. 6
Equation 6 is the maximisation variant of Equation 2 §IV.
Sign of the step in Equations 4 and 5: at the scan resolution the signs are hard to read with certainty, so check against the PDF before coding. See Pitfalls.
Benchmark definitions, for reference:
f = \max \left( 20 \log |AF(\theta)| \right) eq. 8
AF(\theta) = \sum_{i=1}^{4} \cos[2\pi x_i (\cos\theta - \cos\theta_s)] + \cos[2.25 \times 2\pi (\cos\theta - \cos\theta_s)] eq. 9
These two equations define the antenna array objective, with \theta_s = 90^\circ §V.5A fig. 9 eq. 8 eq. 9.
f(\vec{x}) = \sum_{t=0}^{100} \left( y(t) - y_0(t) \right)^2 eq. 13
Equation 13 is the frequency-modulated sound fitting objective, with y(t) = a_1 \sin(w_1 t \theta + a_2 \sin(w_2 t \theta + a_3 \sin(w_3 t \theta))) eq. 11 and y_0(t) the target signal eq. 12 §V.5B.
Hyperparameters
| Name | Value | Where | Notes |
|---|---|---|---|
| search agents (scouts), classical and CEC | 30 | §V.1 §V.2 Main.m | the paper calls them "search agents" in the text and "scout bees" in the figures |
| iterations, classical and CEC | 500 | §V.1 §V.2 Main.m | |
| independent runs, classical | 30 | §V.1 | results are averages and standard deviations over 30 runs |
| dimension, TF1–TF13 | 10 | tab. 6 tab. 7 | |
| dimension and bounds, TF14–TF19 (composite) | 10-D, [-5, 5] | tab. 8 | the code does not match this; see Paper vs code |
| dimension and bounds, CEC01–CEC10 | 9, 16, 18 for CEC01–03; 10 for CEC04–10 | tab. 9 | |
| weight factor wf, default | 0 | §V.1 §V.2 | |
| weight factor wf, TF2 and TF6 | 1 | §V.1 | the only functions with wf = 1 |
| random number r | [-1, 1] | §IV | the code uses a different scale; see Paper vs code |
| Lévy flight for r | not stated beyond "Lévy flight" | §IV | the code's exponent and scale are in Paper vs code |
| scouts and iterations, quantitative metrics | 10 agents, 150 iterations, 2-D landscape | §V.4 | |
| scouts and iterations, antenna array | 20 scouts, 200 iterations | §V.5A fig. 10 | |
| scouts and iterations, FM sound | 30 agents, 200 iterations | §V.5B fig. 11 | |
| antenna elements | 10 elements, 4 optimised | §V.5A fig. 9 | outer element fixed at 2.25 λ0 |
| antenna spacing constraints | Equation 7 | §V.5A eq. 7 | |
| FM parameter range | [-6.4, 6.35] | §V.5B | |
| FM sample points | t = 0 to 100, θ = 2π/100 | §V.5B eq. 13 |
Results
Author-reported. Setup: 19 classical functions (10-D, 30 scouts, 500 iterations, 30 runs) and 10 CEC-2019 functions (30 agents, 500 iterations) §V.1 §V.2. The PSO, GA and DA classical results are taken from the DA paper and not re-run §V.1; the CEC baselines (DA, WOA, SSA) were run by the authors with their published default parameters §V.2. Wilcoxon rank-sum tests are reported in tab. 4 and tab. 5 §V.3.
Classical benchmarks, mean and standard deviation over 30 runs tab. 2:
| Test | FDO Ave | FDO Std | DA Ave | DA Std | PSO Ave | PSO Std | GA Ave | GA Std |
|---|---|---|---|---|---|---|---|---|
| TF1 | 7.47E-21 | 7.26E-19 | 2.85E-18 | 7.16E-18 | 4.2E-18 | 1.31E-17 | 748.5972 | 324.9262 |
| TF2 | 9.388E-6 | 6.90696E-6 | 1.49E-05 | 3.76E-05 | 0.003154 | 0.009811 | 5.971358 | 1.533102 |
| TF3 | 8.5522E-7 | 4.39552E-6 | 1.29E-06 | 2.1E-06 | 0.001891 | 0.003311 | 1949.003 | 994.2733 |
| TF4 | 6.688E-4 | 0.0024887 | 0.000988 | 0.002776 | 0.001748 | 0.002515 | 21.16304 | 2.605406 |
| TF5 | 23.50100 | 59.7883701 | 7.600558 | 6.786473 | 63.45331 | 80.12726 | 133307.1 | 85007.62 |
| TF6 | 1.422E-18 | 4.7460E-18 | 4.17E-16 | 1.32E-15 | 4.36E-17 | 1.38E-16 | 563.8889 | 229.6997 |
| TF7 | 0.544401 | 0.3151575 | 0.010293 | 0.004691 | 0.005973 | 0.003583 | 0.166872 | 0.072571 |
| TF8 | -2285207 | 206684.91 | -2857.58 | 383.6466 | -7.1E+11 | 1.2E+12 | -3407.25 | 164.4776 |
| TF9 | 14.56544 | 5.202232 | 16.01883 | 9.479113 | 10.44724 | 7.879807 | 25.51886 | 6.66936 |
| TF10 | 3.996E-15 | 6.3773E-16 | 0.23103 | 0.487053 | 0.280137 | 0.601817 | 9.498785 | 1.271393 |
| TF11 | 0.568776 | 0.1042672 | 0.193354 | 0.073495 | 0.083463 | 0.035067 | 7.719959 | 3.62607 |
| TF12 | 19.83835 | 26.374228 | 0.031101 | 0.098349 | 8.57E-11 | 2.71E-10 | 1858.502 | 5820.215 |
| TF13 | 10.2783 | 7.42028 | 0.002197 | 0.004633 | 0.002197 | 0.004633 | 68047.23 | 87736.76 |
| TF14 | 3.7870E-7 | 6.3193E-7 | 103.742 | 91.24364 | 150 | 135.4006 | 130.0991 | 21.32037 |
| TF15 | 0.001502 | 0.0012431 | 193.0171 | 80.6332 | 188.1951 | 157.2834 | 116.0554 | 19.19351 |
| TF16 | 0.006375 | 0.0105688 | 458.2962 | 165.3724 | 263.0948 | 187.1352 | 383.9184 | 36.60532 |
| TF17 | 23.82013 | 0.2149425 | 596.6629 | 171.0631 | 466.5429 | 180.9493 | 503.0485 | 35.79406 |
| TF18 | 222.9682 | 9.9625E-6 | 229.9515 | 184.6095 | 136.1759 | 160.0187 | 118.438 | 51.00183 |
| TF19 | 22.7801 | 0.0103584 | 679.588 | 199.4014 | 741.6341 | 206.7296 | 544.1018 | 13.30161 |
tab. 2 Source for all values. Read from the PDF table; the paper's own column order is FDO, DA, PSO, GA.
Authors' description of the classical results §V.1: FDO generally gives better results on TF1–TF6, other algorithms are better on TF7, FDO is poor on TF8 even though it beats PSO there, FDO beats DA and GA on TF9, and FDO outperforms DA, PSO and GA on TF14–TF17 and TF19.
CEC-2019 benchmarks, average and standard deviation over the runs tab. 3:
| Test | FDO Average | FDO STD | DA Average | DA STD | WOA Average | WOA STD | SSA Average | SSA STD |
|---|---|---|---|---|---|---|---|---|
| CEC01 | 4585.27 | 20707.627 | 543×10^8 | 669×10^8 | 411×10^8 | 542×10^8 | 605×10^7 | 475×10^7 |
| CEC02 | 4.0 | 3.22414E-9 | 78.0368 | 87.7888 | 17.3495 | 0.0045 | 18.3434 | 0.0005 |
| CEC03 | 13.7024 | 1.6490E-11 | 13.7026 | 0.0007 | 13.7024 | 0.0 | 13.7025 | 0.0003 |
| CEC04 | 34.0837 | 16.528865 | 344.3561 | 414.0982 | 394.6754 | 248.5627 | 41.6936 | 22.2191 |
| CEC05 | 2.13924 | 0.085751 | 2.5572 | 0.3245 | 2.7342 | 0.2917 | 2.2084 | 0.1064 |
| CEC06 | 12.1332 | 0.600237 | 9.8955 | 1.6404 | 10.7085 | 1.0325 | 6.0798 | 1.4873 |
| CEC07 | 120.4858 | 13.59369 | 578.9531 | 329.3983 | 490.6843 | 194.8318 | 410.3964 | 290.5562 |
| CEC08 | 6.1021 | 0.756997 | 6.8734 | 0.5015 | 6.909 | 0.4269 | 6.3723 | 0.5862 |
| CEC09 | 2.0 | 1.5916E-10 | 6.0467 | 2.871 | 5.9371 | 1.6566 | 3.6704 | 0.2362 |
| CEC10 | 2.7182 | 8.8817E-16 | 21.2604 | 0.1715 | 21.2761 | 0.1111 | 21.04 | 0.078 |
tab. 3 Source for all values. The CEC01 DA, WOA and SSA cells are printed in exponent form in the paper, as shown. The text reports FDO outperforms the other algorithms on CEC except CEC06 §V.2.
Wilcoxon rank-sum, FDO versus DA, classical benchmarks tab. 4:
| Function | p-value |
|---|---|
| TF1 | 0.000513631 |
| TF2 | 0.7111046 |
| TF3 | 8.2371E-05 |
| TF4 | 1.0750E-08 |
| TF5 | 0.0023817 |
| TF6 | 1.7620E-04 |
| TF7 | 6.6643E-12 |
| TF8 | 1.4805E-34 |
| TF9 | 5.8820E-08 |
| TF10 | 5.6002E-17 |
| TF11 | 0.012793 |
| TF12 | 9.4381E-05 |
| TF13 | 1.0426E-37 |
| TF14 | 1.1142E-21 |
| TF15 | 0.000094477 |
| TF16 | 0.0000E+00 |
| TF17 | 1.0668E-120 |
| TF18 | 0.0000E+00 |
| TF19 | 5.5373E-166 |
tab. 4 Source. The text says TF2 is the only one above 0.05 and explains TF16 and TF18 as cases where DA gives the same value in all runs §V.3.
Wilcoxon rank-sum, FDO against DA, WOA and SSA, CEC-2019 tab. 5:
| Function | FDO vs DA | FDO vs WOA | FDO vs SSA |
|---|---|---|---|
| CEC01 | 4.03455E-05 | 0.000108312 | 3.1831E-09 |
| CEC02 | 1.81428E-05 | 3.17E-252 | 1.1E-196 |
| CEC03 | 0.244847 | 0.363647 | 1E-306 |
| CEC04 | 0.000124 | 0.095911 | 7.4365E-11 |
| CEC05 | 6.05468E-09 | 0.007884 | 2.3682E-15 |
| CEC06 | 2.90314E-09 | 2.196E-28 | 1.9679E-08 |
| CEC07 | 2.69474E-10 | 1.0424E-06 | 6.2691E-15 |
| CEC08 | 2.3638E-05 | 0.131704 | 5.2331E-06 |
| CEC09 | 1.80487E-10 | 3.7992E-43 | 7.4029E-19 |
| CEC10 | 2.2248E-111 | 6.397E-131 | 2.459E-122 |
tab. 5 Source. The text says the differences are significant in all cases except CEC03 against DA and WOA, and CEC04 and CEC08 against WOA §V.3.
Real-world examples, author-reported:
- Antenna array §V.5A fig. 10: with 20 scouts over 200 iterations, the global best reaches its best value at iteration 78, at element positions {0.713, 1.595, 0.433, 0.130} §V.5A. Figure 10 shows the global best near -120 in the plot; this value is read from the figure and not stated in the text.
- FM sound synthesis §V.5B fig. 11: with 30 agents over 200 iterations, the parameters at iteration 200 are a1 = 0.974, w1 = -0.241, a2 = -4.3160, w2 = -0.0193, a3 = -0.5701, w3 = 4.937 §V.5B. The global best converges near its optimum from iteration 64 §V.5B. The paper gives no numeric objective value for this result.
Quantitative metrics (10 agents, 150 iterations) are shown only as figures fig. 4 fig. 5 fig. 6 fig. 7; no numbers are given for them §V.4.
Paper vs code
Code: MATLAB repository https://github.com/Jaza-Abdullah/FDO at code_commit ffd8a87e2e98770c6dd5652127d08246c84f7cd1, Apache-2.0. The paper does not link it. I found it by searching GitHub for "fitness dependent optimizer". Its owner matches author Jaza M. Abdullah, and the header of FDO.m names the paper and its DOI FDO.m. Citations below use paths relative to the repository root. I did not use the repository Tarik4Rashid4/FDO-matlab: it has no license file and its citation names a different author.
Discrepancies, each with both citations:
- Weight special case. The code sets the weight to 0.2 when the best fitness is below 5% of the scout's fitness; the paper has no such rule FDO.m. The paper's weight is the absolute ratio minus wf eq. 2; the code uses the ratio with no absolute value and no sign handling FDO.m.
- Zero fitness. The paper sets the weight to 0 when the scout's own fitness is zero fig. 3. The code only assigns a weight when the best fitness is non-zero FDO.m, and it divides by the scout's fitness without checking for zero FDO.m. A zero weight is never set in the code. When the best fitness is zero, the variable keeps its previous value FDO.m.
- Pace for weight 0. The paper gives pace = position × r for weight 0 eq. 3. The code uses the distance to the best times r FDO.m.
- Random factor scale. The paper uses r in [-1, 1] §IV. The code uses
Levy(1), which is a Lévy step (exponent 3/2) multiplied by 0.01 FDO.m Levy.m. The code's Lévy generator cites Yang's 2014 book and a 2015 Springer paper Levy.m. - Best per agent. The paper selects the global best once per iteration §IV. The code recomputes the best inside the agent loop, so later agents see updated positions FDO.m.
- Second try. The paper's second try is the position plus the saved pace, and the scout stays put on failure fig. 3. The code's second try adds the distance-weighted step as well as the saved pace FDO.m. On failure, the code moves the scout by its position times a Lévy step instead of keeping it still FDO.m.
- Boundary handling. The paper says nothing about bounds. The code replaces any coordinate outside the bounds with the bound times a Lévy step FDO.m.
- Benchmarks TF14–TF19. The paper defines these as 10-D composite functions on [-5, 5] tab. 8. The code's F14–F19 have dimensions 2, 4, 2, 2, 2 and 3, and different bounds Select_Functions.m. The paper's TF14–TF19 numbers cannot be reproduced from this code.
- Shift positions. The paper gives shift positions for TF1–TF13 tab. 6 tab. 7.
Select_Functions.mstores only bounds and dimensions Select_Functions.m. I did not find a shift in the code, but I did not read every function body. - Per-function wf. The paper sets wf = 1 for TF2 and TF6 §V.1.
Main.muses one fixed value, wf = 0.0 Main.m. The per-function settings are not in the repository. - Runs. The paper averages 30 runs §V.1.
Main.mruns one optimisation of F1 Main.m. - Maximisation. The paper gives Equation 6 and a change to the comparisons for maximisation §IV. The code only minimises FDO.m.
- Dimensions and bounds, TF1–TF13 and CEC. These match the paper's tables tab. 6 tab. 7 tab. 9 Select_Functions.m.
Pitfalls
- Eq. 13. The text says the fitness is "the summation of the square root" of the difference §V.5B. Equation 13 as printed is the sum of squared differences over t = 0 to 100 eq. 13. Implement the equation and check your numbers against the paper's figure before you rely on it.
- Signs in Eq. 4 and Eq. 5. As printed, the two equations give pace = (x − x*) × fw × (−1) for r < 0 and pace = (x − x*) × fw for r ≥ 0. The code gives the opposite sign for r ≥ 0 FDO.m. The printed signs are hard to read at the scan resolution, so check the PDF before coding.
- Negative fitness. TF8 has a minimum of −418.9829 tab. 7. The ratio f(best)/f(scout) can be negative when the two fitnesses have different signs. The paper's absolute value keeps the weight positive eq. 2; the code has no absolute value FDO.m.
- Zero fitness. The paper's zero rule fig. 3 is missing from the code. Use the paper's rule and say so if you port the code.
- Lévy step scale. The paper names a Lévy flight but gives no exponent or scale §IV. The code uses exponent 3/2 and a 0.01 scale Levy.m. Results depend on this choice.
- Tuned wf. The paper says wf is the only parameter to tune §IV. It is set per function §V.1, and those settings are not in the code. Expect to tune it on your own problem.
- Statistics. The classical PSO, GA and DA results come from another paper, not from the same runs §V.1. Compare with care.
- Figure labels. Figure 7 is labelled "FT9" and "TF17 in 10-D", while the text describes the 2-D experiment §V.4 fig. 7.
- Cost. The paper gives the per-iteration time as O(p·n + p·CF) and the space as O(p·CF + p·pace) §IV, where p is the population size, n the dimension and CF the cost of one objective evaluation.
Lineage
- Builds on: particle swarm optimisation, which the paper calls the base for its update style §I §IV. The paper states that FDO has no algorithmic link to the honey bee algorithm or to artificial bee colony §I.
- Compared against: PSO, GA and DA on the classical functions §V.1; DA, WOA and SSA on CEC-2019 §V.2.
- Superseded by: not known from this wiki.
Source and license
Adapted from “Fitness Dependent Optimizer: Inspired by the Bee Swarming Reproductive Process” by Jaza M. Abdullah, Tarik A. Rashid (arXiv:1904.05226), used under CC BY-SA 4.0. Changes: condensed and restructured for implementation, with tables, equations and algorithms taken from the paper and its code, each cited to its source. Not affiliated with or endorsed by the authors. This page is licensed under CC BY-SA 4.0. Code citations refer to https://github.com/Jaza-Abdullah/FDO at commit ffd8a87e2e98 (Apache-2.0). Any quoted code is shown under that license.