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

← Rendered

markdown source:

---
description: Описание python фреймворка DEAP для эволюционной оптимизации
tags: machine-learning genetic python evol
title: Deap документация
---
Смотри вводную в [[deap]]

## [Creating Types](https://deap.readthedocs.io/en/master/tutorials/basic/part1.html)

### Fitness

[Fitness](https://deap.readthedocs.io/en/master/api/base.html#deap.base.Fitness) is an abstract class that needs a weights attribute in order to be functional.

Можно использовать ready-tobuild [creator](https://deap.readthedocs.io/en/master/api/creator.html#module-deap.creator) матефабрику

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

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

```python
class Foo(list):
    spam = 1

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

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

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

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

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

### Individual

[Individual](https://deap.readthedocs.io/en/master/tutorials/basic/part1.html#individual) - необходимо создать специальный класс, который определяет индивида. Пример

```python
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)
```

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

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

В примерах выше инициализация выполняется с пмощью методов [Initialization](https://deap.readthedocs.io/en/master/api/tools.html#initialization):

- `initRepeat`
- `initIterate`
- `initCycle`
- `genFull`
- `genGrow`
- `genHalfAndHalf`

Пример

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

[Permutation](https://deap.readthedocs.io/en/master/tutorials/basic/part1.html#permutation) - пример инициализацйии индивидума с перестановкой. пример простейщего случая (список) - в данном случае создается кастомная функция для заполения, которой и инициализируется индивидуум с помощью`tools.initIterate`

```python
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](https://deap.readthedocs.io/en/master/tutorials/basic/part1.html#permutation) - использование математических выражений для инициализации

```python
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](https://deap.readthedocs.io/en/master/tutorials/basic/part1.html#evolution-strategy) - индивидуальные стратегии эволюции содержат два списка: один для конкретного индивидума, а другой - для его параметров мутации.

```python
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](https://deap.readthedocs.io/en/master/tutorials/basic/part1.html#particle) - имеет ряд дополнительных параметров, позволяющих задавать скорость и запоминать лучший результат

```python
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](https://deap.readthedocs.io/en/master/tutorials/basic/part1.html#a-funky-one) - можно создавать любые собственные конструкции классов

```python
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

[Варианты создания популяций](https://deap.readthedocs.io/en/master/tutorials/basic/part1.html#population)

#### Bag

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

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

toolbox.population(n=100)
```

#### Grid

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

#### Swarm

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

##### Demes

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

**[Seeding a Population](https://deap.readthedocs.io/en/master/tutorials/basic/part1.html#seeding-a-population)** - тут описывается способ создания воспроизводимой популяции

```python
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](https://deap.readthedocs.io/en/master/api/tools.html#module-deap.tools)

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

- Initialization
- Crossover
- Mutation
- Selection
- Migration
- Initialization
- Crossover
- Mutation
- Bloat control

## [Alghoritms](https://deap.readthedocs.io/en/master/api/algo.html#module-deap.algorithms)

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

**Complete Algorithms**:

- eaSimple - simplest evolutionary algorithm
- eaMuPlusLambda. This is the (μ+λ) evolutionary algorithm
- eaMuCommaLambda. This is the (μ , λ) evolutionary algorithm
- eaGenerateUpdate. Ask-tell model proposed in Colette2010 (Collette, Y., N. Hansen, G. Pujol, D. Salazar Aponte and R. Le Riche (2010). On Object-Oriented Programming of Optimizers - Examples in Scilab. In P. Breitkopf and R. F. Coelho, eds.: Multidisciplinary Design Optimization in Computational Mechanics, Wiley, pp. 527-565;), where ask is called generate and tell is called update

**Variations**:

- varAnd. Part of an evolutionary algorithm applying only the variation part (crossover and mutation). The modified individuals have their fitness invalidated. The individuals are cloned so returned population is independent of the input population.
- varOr. Part of an evolutionary algorithm applying only the variation part (crossover, mutation or reproduction). The modified individuals have their fitness invalidated. The individuals are cloned so returned population is independent of the input population.

**Covariance Matrix Adaptation Evolution Strategy**:

- Strategy. A strategy that will keep track of the basic parameters of the CMA-ES algorithm
- StrategyOnePlusLambda. A CMA-ES strategy that uses the 1+λ paradigm
- StrategyMultiObjective. Multiobjective CMA-ES strategy based on the paper Voss2010 (). It is used similarly as the standard CMA-ES strategy with a generate-update scheme.

## [Computing Statistics](https://deap.readthedocs.io/en/master/tutorials/basic/part3.html#computing-statistics)

## [Logging Data](https://deap.readthedocs.io/en/master/tutorials/basic/part3.html#logging-data)

## [Using Multiple Processors](https://deap.readthedocs.io/en/master/tutorials/basic/part4.html#using-multiple-processors)

Еще по теме:

- [One Max Problem: Using Numpy](https://deap.readthedocs.io/en/master/examples/ga_onemax_numpy.html)
- [DEEP examples in notebooks](https://github.com/DEAP/notebooks)
- [[evolution-methods]]


[deap]: deap "Deap - генетические алгоритмы на python"
[evolution-methods]: ../lists/evolution-methods "Evolution methods"