public function sosaStradonitzAncestors(Individual $individual, int $generations): Collection
    {
        $ancestors = [1 => $individual];

        $queue = [1];

        $max = 2 ** ($generations - 1);

        while (!empty($queue)) {
            $sosa_stradonitz_number = array_shift($queue);

            if ($sosa_stradonitz_number >= $max) {
                break;
            }

            $family = $ancestors[$sosa_stradonitz_number]->primaryChildFamily();

            if ($family instanceof Family) {
                if ($family->husband() instanceof Individual) {
                    $ancestors[$sosa_stradonitz_number * 2] = $family->husband();
                    $queue[] = $sosa_stradonitz_number * 2;
                }

                if ($family->wife() instanceof Individual) {
                    $ancestors[$sosa_stradonitz_number * 2 + 1] = $family->wife();
                    $queue[] = $sosa_stradonitz_number * 2 + 1;
                }
            }
        }

        return new Collection($ancestors);
    }