Source code for glennopt.helpers.population_distance

import numpy as np
from ..base import Individual, Parameter
from typing import List
import math
from .mutate import get_eval_param_matrix, get_objective_matrix, set_eval_parameters
import random

[docs]def diversity(individuals:List[Individual]) -> float: """Computes the diversity of a population. Higher diversity value the better. Citations: J. Hu, J. Zeng, and Y. Tan, ‘‘A diversity-guided particle swarm optimizer for dynamic environments,’’ in Bio-Inspired Computational Intelligence and Applications. Berlin, Germany: Springer, 2007, pp. 239–247 Args: individuals (List[Individual]): List of individuals of a population Returns: float: diversity value """ Np = len(individuals) D = len(individuals[0].eval_parameters) x_avg = 1/len(individuals) * np.sum(np.array([ind.eval_parameters for ind in individuals]),axis=0) L = np.zeros(Np) for i in range(Np): x = individuals[i].eval_parameters for j in range(D): L[i] += (x[j]-x_avg[j])**2 L[i] = math.sqrt(L[i]) pop_diversity = 1/(Np*np.max(L)) * np.sum(L) return pop_diversity
[docs]def distance(individuals:List[Individual], newIndividuals:List[Individual]): """Calculates the distance between individuals Args: individuals (List[Individual]): past list of individuals newIndividuals (List[Individual]): updated list of individuals Returns: float: distance """ pop, _ , _ = get_eval_param_matrix(individuals) newPop, _ , _ = get_eval_param_matrix(newIndividuals) dist = np.sum(np.absolute(pop - newPop),axis=1) # Compute distance return np.average(dist)