pub struct Individual<G, F = f64>where
G: EvolutionaryGenome,
F: FitnessValue,{
pub genome: G,
pub fitness: Option<F>,
pub birth_generation: usize,
pub offspring_count: usize,
}Expand description
An individual in the population
Wraps a genome with its computed fitness value and additional metadata.
Fields§
§genome: GThe genome of this individual
fitness: Option<F>The fitness value (None if not yet evaluated)
birth_generation: usizeGeneration when this individual was created
offspring_count: usizeNumber of offspring produced by this individual
Implementations§
Source§impl<G, F> Individual<G, F>where
G: EvolutionaryGenome,
F: FitnessValue,
impl<G, F> Individual<G, F>where
G: EvolutionaryGenome,
F: FitnessValue,
Sourcepub fn with_fitness(genome: G, fitness: F) -> Self
pub fn with_fitness(genome: G, fitness: F) -> Self
Create a new individual with a known fitness
Sourcepub fn with_generation(genome: G, generation: usize) -> Self
pub fn with_generation(genome: G, generation: usize) -> Self
Create a new individual with birth generation
Sourcepub fn is_evaluated(&self) -> bool
pub fn is_evaluated(&self) -> bool
Check if this individual has been evaluated
Sourcepub fn fitness_value(&self) -> &F
pub fn fitness_value(&self) -> &F
Get the fitness value, panicking if not evaluated
Sourcepub fn fitness_f64(&self) -> f64
pub fn fitness_f64(&self) -> f64
Get the fitness as f64
Sourcepub fn set_fitness(&mut self, fitness: F)
pub fn set_fitness(&mut self, fitness: F)
Set the fitness value
§Panics
Panics if the fitness is non-finite (NaN). A NaN fitness is always a
bug in the fitness function (e.g. a division by zero or log of a
negative number) and silently corrupts every downstream comparison
(best/worst/sort_by_fitness), so it is rejected at the source
rather than propagated (EV-07). Infinities are permitted (e.g.
ParetoFitness uses +inf crowding distances).
Sourcepub fn into_genome(self) -> G
pub fn into_genome(self) -> G
Take the genome out of this individual
Sourcepub fn genome_mut(&mut self) -> &mut G
pub fn genome_mut(&mut self) -> &mut G
Get a mutable reference to the genome
Mutating the genome invalidates any cached fitness (EV-28): the stored
value was computed for the previous genome, so this clears
self.fitness and resets the evaluated flag. Callers that only need
read access should use genome to preserve the cache.
Note: the genome field is public for backwards compatibility; direct
assignment (individual.genome = ...) bypasses this invalidation, so
prefer genome_mut or set_genome.
Sourcepub fn set_genome(&mut self, genome: G)
pub fn set_genome(&mut self, genome: G)
Replace the genome, clearing any cached fitness
Like genome_mut, this invalidates the cached
fitness so the new genome is re-evaluated (EV-28).
Sourcepub fn is_better_than(&self, other: &Self) -> bool
pub fn is_better_than(&self, other: &Self) -> bool
Check if this individual is better than another
Trait Implementations§
Source§impl<G, F> Clone for Individual<G, F>
impl<G, F> Clone for Individual<G, F>
Source§fn clone(&self) -> Individual<G, F>
fn clone(&self) -> Individual<G, F>
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<G, F> Debug for Individual<G, F>
impl<G, F> Debug for Individual<G, F>
Source§impl<'de, G, F> Deserialize<'de> for Individual<G, F>where
G: EvolutionaryGenome,
F: FitnessValue,
impl<'de, G, F> Deserialize<'de> for Individual<G, F>where
G: EvolutionaryGenome,
F: FitnessValue,
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl<G, F> FromIterator<Individual<G, F>> for Population<G, F>where
G: EvolutionaryGenome,
F: FitnessValue,
impl<G, F> FromIterator<Individual<G, F>> for Population<G, F>where
G: EvolutionaryGenome,
F: FitnessValue,
Source§fn from_iter<I: IntoIterator<Item = Individual<G, F>>>(iter: I) -> Self
fn from_iter<I: IntoIterator<Item = Individual<G, F>>>(iter: I) -> Self
Source§impl<G, F> PartialEq for Individual<G, F>
impl<G, F> PartialEq for Individual<G, F>
Source§impl<G, F> PartialOrd for Individual<G, F>
impl<G, F> PartialOrd for Individual<G, F>
Source§impl<G, F> Serialize for Individual<G, F>where
G: EvolutionaryGenome,
F: FitnessValue,
impl<G, F> Serialize for Individual<G, F>where
G: EvolutionaryGenome,
F: FitnessValue,
Auto Trait Implementations§
impl<G, F> Freeze for Individual<G, F>
impl<G, F> RefUnwindSafe for Individual<G, F>where
G: RefUnwindSafe,
F: RefUnwindSafe,
impl<G, F> Send for Individual<G, F>
impl<G, F> Sync for Individual<G, F>
impl<G, F> Unpin for Individual<G, F>
impl<G, F> UnsafeUnpin for Individual<G, F>where
G: UnsafeUnpin,
F: UnsafeUnpin,
impl<G, F> UnwindSafe for Individual<G, F>where
G: UnwindSafe,
F: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Scalar for T
§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read more§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.