# Customise the mutation process¶

The mutation process can be altered in three ways:

- Setting the initial mutation probability
- Adjusting (dwindling) the mutation probability over time
- Compacting the mutation space around the best individuals

Below are some quick examples of how to do these things.

## Setting the initial probability¶

This is done using the `mutation_prob`

parameter in
`edo.DataOptimiser`

. For instance, we can remove all mutation by setting
this parameter to be zero:

```
>>> import edo
>>> from edo.distributions import Uniform
>>>
>>> def xsquared(ind):
... return ind.dataframe.iloc[0, 0] ** 2
>>>
>>> opt = edo.DataOptimiser(
... xsquared, 100, [1, 1], [1, 1], [edo.Family(Uniform)], mutation_prob=0
... )
```

## Dwindling mutation probability¶

Sometimes an evolutionary algorithm can be thrown off once it has started converging. The purpose of the mutation process is to do this deliberately. However, as the EA progresses, mutation can make this disruption unhelpful and the population may become unpredictable or noisy.

To combat this, the `edo.DataOptimiser.dwindle()`

method can be redefined in
a subclass:

```
>>> class MyOptimiser(edo.DataOptimiser):
... def dwindle(self, N=50):
... """ Cut the mutation probability every ``N`` generations. """
... if self.generation % N == 0:
... self.mutation_prob /= 2
```

Any further arguments for this method should be passed in the `dwindle`

parameter of `edo.DataOptimiser.run()`

:

```
>>> opt = MyOptimiser(
... xsquared,
... 100,
... [1, 1],
... [1, 1],
... [edo.Family(Uniform)],
... max_iter=1,
... mutation_prob=1,
... )
>>>
>>> pop_history, fit_history = opt.run(dwindle_kwargs={"N": 1})
>>> opt.mutation_prob
0.5
```

## Compacting the mutation space¶

The final way to alter the mutation process is to progressively reduce the
mutation space via shrinking. This is done using the
`shrinkage`

parameter of `edo.DataOptimiser`

:

```
>>> opt = edo.DataOptimiser(
... xsquared, 100, [1, 1], [1, 1], [edo.Family(Uniform)], shrinkage=0.9
... )
```