# --------------------- Distance functions for CHC Algorithm -----------------------------------------------------------
# Fitness-only distances
[docs]
def fitness_l1(population, fitness, xp):
p1 = fitness[0::2]
p2 = fitness[1::2]
return xp.abs(p1 - p2)
[docs]
def fitness_l2(population, fitness, xp):
p1 = fitness[0::2]
p2 = fitness[1::2]
return (p1 - p2) ** 2
[docs]
def fitness_relative(population, fitness, xp, eps=1e-12):
p1 = fitness[0::2]
p2 = fitness[1::2]
return xp.abs(p1 - p2) / (xp.abs(p1) + xp.abs(p2) + eps)
# Parameters-only distances
[docs]
def param_l1(population, fitness, xp):
p1 = population[0::2]
p2 = population[1::2]
return xp.sum(xp.abs(p1 - p2), axis=1)
[docs]
def param_l2(population, fitness, xp):
p1 = population[0::2]
p2 = population[1::2]
return xp.linalg.norm(p1 - p2, axis=1)
# Hybrid parameter-fitness distances
[docs]
def hybrid_param_fit(population, fitness, xp, fact=0.5):
p1, p2 = population[0::2], population[1::2]
f1, f2 = fitness[0::2], fitness[1::2]
dp = xp.linalg.norm(p1 - p2, axis=1)
df = xp.abs(f1 - f2)
return fact * dp + (1 - fact) * df