Algebraic Functions#
Examples using classic mathematical test functions.
Basic Algebraic Functions#
import numpy as np
from surfaces.test_functions.algebraic import (
SphereFunction,
RastriginFunction,
RosenbrockFunction,
AckleyFunction,
)
# Create functions
sphere = SphereFunction(n_dim=5)
rastrigin = RastriginFunction(n_dim=5)
rosenbrock = RosenbrockFunction(n_dim=5)
ackley = AckleyFunction() # Fixed 2D
# Evaluate at random points
for func in [sphere, rastrigin, rosenbrock, ackley]:
space = func.search_space
sample = {k: np.random.choice(v) for k, v in space.items()}
result = func(sample)
print(f"{func.__class__.__name__}: {result:.4f}")
Comparing Function Landscapes#
"""Compare difficulty of different algebraic functions."""
import numpy as np
from surfaces.test_functions.algebraic import SphereFunction, RastriginFunction
def random_search(func, n_iter=1000, seed=42):
np.random.seed(seed)
space = func.search_space
best = float('inf')
for _ in range(n_iter):
sample = {k: np.random.choice(v) for k, v in space.items()}
result = func(sample)
best = min(best, result)
return best
sphere = SphereFunction(n_dim=10)
rastrigin = RastriginFunction(n_dim=10)
print("Random search (1000 iterations):")
print(f" Sphere: {random_search(sphere):.6f}")
print(f" Rastrigin: {random_search(rastrigin):.6f}")
Scaling with Dimension#
"""Test how functions scale with dimensionality."""
import numpy as np
from surfaces.test_functions.algebraic import RastriginFunction
import time
for n_dim in [2, 5, 10, 20, 50]:
func = RastriginFunction(n_dim=n_dim)
space = func.search_space
start = time.time()
for _ in range(1000):
sample = {k: np.random.choice(v) for k, v in space.items()}
func(sample)
elapsed = time.time() - start
print(f"n_dim={n_dim:2d}: {elapsed*1000:.1f}ms for 1000 evals")