fitnesses
This commit is contained in:
@@ -1,3 +1,39 @@
|
||||
import random
|
||||
|
||||
from .chromosome import Chromosome
|
||||
|
||||
|
||||
def shrink_mutation(chromosome: Chromosome) -> Chromosome:
|
||||
"""Усекающая мутация. Заменяет случайно выбранную операцию на случайный терминал."""
|
||||
chromosome = chromosome.copy()
|
||||
|
||||
operation_nodes = [n for n in chromosome.root.list_nodes() if n.value.arity > 0]
|
||||
|
||||
if not operation_nodes:
|
||||
return chromosome
|
||||
|
||||
target_node = random.choice(operation_nodes)
|
||||
|
||||
target_node.prune(chromosome.terminals, max_depth=1)
|
||||
|
||||
return chromosome
|
||||
|
||||
|
||||
def grow_mutation(chromosome: Chromosome, max_depth: int) -> Chromosome:
|
||||
"""Растущая мутация. Заменяет случайно выбранный узел на случайное поддерево."""
|
||||
chromosome = chromosome.copy()
|
||||
|
||||
target_node = random.choice(chromosome.root.list_nodes())
|
||||
|
||||
max_subtree_depth = max_depth - target_node.get_level() + 1
|
||||
|
||||
subtree = Chromosome.grow_init(
|
||||
chromosome.terminals, chromosome.operations, max_subtree_depth
|
||||
).root
|
||||
|
||||
if target_node.parent:
|
||||
target_node.parent.replace_child(target_node, subtree)
|
||||
else:
|
||||
chromosome.root = subtree
|
||||
|
||||
return chromosome
|
||||
|
||||
Reference in New Issue
Block a user