>>> На главную <<<

Deap документация

Смотри вводную в [deap]

Creating Types

Fitness

Fitness is an abstract class that needs a weights attribute in order to be functional.

Можно использовать ready-tobuild creator матефабрику

create("Foo", list, bar=dict, spam=1)

что эквивалентно:

class Foo(list):
    spam = 1

    def __init__(self):
        self.bar = dict()

Пример создания

creator.create("FitnessMin", base.Fitness, weights=(-1.0,))
creator.create("FitnessMulti", base.Fitness, weights=(-1.0, 1.0))

Во втором примере минимизируется первая функция и максимизируется вторая. Порядок определен слева направо. Знак определяет минимизацию или максимизацию, а значение числа - важность.

Individual

Individual - необходимо создать специальный класс, который определяет индивида. Пример

import random

from deap import base
from deap import creator
from deap import tools

creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", list, fitness=creator.FitnessMax)

IND_SIZE=10

toolbox = base.Toolbox()
toolbox.register("attr_float", random.random)
toolbox.register("individual", tools.initRepeat, creator.Individual,
                 toolbox.attr_float, n=IND_SIZE)

Варианты с наследованием типов естественно не ограничены списком

creator.create("Individual", array.array, typecode="d", fitness=creator.FitnessMax)
creator.create("Individual", numpy.ndarray, fitness=creator.FitnessMax)

В примерах выше инициализация выполняется с пмощью методов Initialization:

Пример

>>> import random
>>> random.seed(42)
>>> initRepeat(list, random.random, 2) # doctest: +ELLIPSIS,
...                                    # doctest: +NORMALIZE_WHITESPACE
[0.6394..., 0.0250...]

Permutation - пример инициализацйии индивидума с перестановкой. пример простейщего случая (список) - в данном случае создается кастомная функция для заполения, которой и инициализируется индивидуум с помощьюtools.initIterate

import random

from deap import base
from deap import creator
from deap import tools

creator.create("FitnessMin", base.Fitness, weights=(-1.0,))
creator.create("Individual", list, fitness=creator.FitnessMin)

IND_SIZE=10

toolbox = base.Toolbox()
toolbox.register("indices", random.sample, range(IND_SIZE), IND_SIZE)
toolbox.register("individual", tools.initIterate, creator.Individual,
                 toolbox.indices)

Arithmetic Expression - использование математических выражений для инициализации

import operator

from deap import base
from deap import creator
from deap import gp
from deap import tools

pset = gp.PrimitiveSet("MAIN", arity=1)
pset.addPrimitive(operator.add, 2)
pset.addPrimitive(operator.sub, 2)
pset.addPrimitive(operator.mul, 2)

creator.create("FitnessMin", base.Fitness, weights=(-1.0,))
creator.create("Individual", gp.PrimitiveTree, fitness=creator.FitnessMin,
               pset=pset)

toolbox = base.Toolbox()
toolbox.register("expr", gp.genHalfAndHalf, pset=pset, min_=1, max_=2)
toolbox.register("individual", tools.initIterate, creator.Individual,
                 toolbox.expr)

Evolution Strategy - индивидуальные стратегии эволюции содержат два списка: один для конкретного индивидума, а другой - для его параметров мутации.

import array
import random

from deap import base
from deap import creator
from deap import tools

creator.create("FitnessMin", base.Fitness, weights=(-1.0,))
creator.create("Individual", array.array, typecode="d",
               fitness=creator.FitnessMin, strategy=None)
creator.create("Strategy", array.array, typecode="d")

def initES(icls, scls, size, imin, imax, smin, smax):
    ind = icls(random.uniform(imin, imax) for _ in range(size))
    ind.strategy = scls(random.uniform(smin, smax) for _ in range(size))
    return ind

IND_SIZE = 10
MIN_VALUE, MAX_VALUE = -5., 5.
MIN_STRAT, MAX_STRAT = -1., 1. 

toolbox = base.Toolbox()
toolbox.register("individual", initES, creator.Individual,
                 creator.Str

Particle - имеет ряд дополнительных параметров, позволяющих задавать скорость и запоминать лучший результат

import random

from deap import base
from deap import creator
from deap import tools

creator.create("FitnessMax", base.Fitness, weights=(1.0, 1.0))
creator.create("Particle", list, fitness=creator.FitnessMax, speed=None,
               smin=None, smax=None, best=None)

def initParticle(pcls, size, pmin, pmax, smin, smax):
    part = pcls(random.uniform(pmin, pmax) for _ in xrange(size))
    part.speed = [random.uniform(smin, smax) for _ in xrange(size)]
    part.smin = smin
    part.smax = smax
    return part

toolbox = base.Toolbox()
toolbox.register("particle", initParticle, creator.Particle, size=2,
                 pmin=-6, pmax=6, smin=-3, smax=3)

A Funky One - можно создавать любые собственные конструкции классов

import random

from deap import base
from deap import creator
from deap import tools

creator.create("FitnessMax", base.Fitness, weights=(1.0, 1.0))
creator.create("Individual", list, fitness=creator.FitnessMax)

toolbox = base.Toolbox()

INT_MIN, INT_MAX = 5, 10
FLT_MIN, FLT_MAX = -0.2, 0.8
N_CYCLES = 4

toolbox.register("attr_int", random.randint, INT_MIN, INT_MAX)
toolbox.register("attr_flt", random.uniform, FLT_MIN, FLT_MAX)
toolbox.register("individual", tools.initCycle, creator.Individual,
                 (toolbox.attr_int, toolbox.attr_flt), n=N_CYCLES)

Population

Варианты создания популяций

Bag

Индивидумы создаются в виде списка

toolbox.register("population", tools.initRepeat, list, toolbox.individual)

toolbox.population(n=100)

Grid

Сеточная популяция - это особый случай структурированной популяции, в которой соседние индивидумы оказывают прямое влияние друг на друга. Индивидумы распределены в матрице, где каждая ячейка содержит одного индивидума.

Swarm

Частично использована оптимизация роя

Demes

Позволяет создать сабпопуляцию в популяции

Seeding a Population - тут описывается способ создания воспроизводимой популяции

import json

from deap import base
from deap import creator

creator.create("FitnessMax", base.Fitness, weights=(1.0, 1.0))
creator.create("Individual", list, fitness=creator.FitnessMax)

def initIndividual(icls, content):
    return icls(content)

def initPopulation(pcls, ind_init, filename):
    with open(filename, "r") as pop_file:
        contents = json.load(pop_file)
    return pcls(ind_init(c) for c in contents)

toolbox = base.Toolbox()

toolbox.register("individual_guess", initIndividual, creator.Individual)
toolbox.register("population_guess", initPopulation, list, toolbox.individual_guess, "my_guess.json")

population = toolbox.population_guess()

Evolutionary Tools

Включает готовые тулзы:

Alghoritms

Включает несколько готовых алгоритмов эволюционной оптимизации.

Complete Algorithms:

Variations:

Covariance Matrix Adaptation Evolution Strategy:

Computing Statistics

Logging Data

Using Multiple Processors

Еще по теме:

>>> На главную <<<