рисование дерева

This commit is contained in:
2025-11-08 20:51:46 +03:00
parent bacfa20061
commit 4b2398ae05
8 changed files with 153 additions and 81 deletions

View File

@@ -1,16 +1,20 @@
"""
graphviz должен быть доступен в PATH (недостаточно просто установить через pip)
Можно проверить командой
dot -V
"""
import random
from math import log
import numpy as np
from numpy.typing import NDArray
from gp import Chromosome
from gp.crossovers import crossover_subtree
from gp.fitness import (
MAEFitness,
MSEFitness,
NRMSEFitness,
PenalizedFitness,
RMSEFitness,
)
from gp.ga import GARunConfig, genetic_algorithm
@@ -21,10 +25,10 @@ from gp.mutations import (
NodeReplacementMutation,
ShrinkMutation,
)
from gp.ops import ADD, COS, DIV, EXP, MUL, NEG, POW, SIN, SQUARE, SUB
from gp.ops import ADD, COS, DIV, EXP, MUL, POW, SIN, SQUARE, SUB
from gp.population import ramped_initialization
from gp.primitive import Const, Var
from gp.selection import roulette_selection, tournament_selection
from gp.primitive import Var
from gp.selection import tournament_selection
NUM_VARS = 8
TEST_POINTS = 10000
@@ -34,8 +38,6 @@ SEED = 17
np.random.seed(SEED)
random.seed(SEED)
X = np.random.uniform(-5.536, 5.536, size=(TEST_POINTS, NUM_VARS))
# axes = [np.linspace(-5.536, 5.536, TEST_POINTS) for _ in range(NUM_VARS)]
# X = np.array(np.meshgrid(*axes)).T.reshape(-1, NUM_VARS)
operations = [SQUARE, SIN, COS, EXP, ADD, SUB, MUL, DIV, POW]
terminals = [Var(f"x{i}") for i in range(1, NUM_VARS + 1)]
@@ -74,7 +76,6 @@ config = GARunConfig(
fitness_func=fitness_function,
crossover_fn=lambda p1, p2: crossover_subtree(p1, p2, max_depth=MAX_DEPTH),
mutation_fn=combined_mutation,
# selection_fn=roulette_selection,
selection_fn=lambda p, f: tournament_selection(p, f, k=3),
init_population=init_population,
seed=SEED,
@@ -83,6 +84,7 @@ config = GARunConfig(
elitism=15,
max_generations=MAX_GENERATIONS,
log_every_generation=True,
save_generations=[1, 10, 20, 30, 40, 50, 100, 150, 200],
)
result = genetic_algorithm(config)