Darwinian 0.0.5.4
“Darwinian” - это модуль Python, который реализует Дарвиновский Генетический Алгоритм (GA) для задач оптимизации. GA симулирует процесс естественного отбора, где наиболее приспособленные особи выбираются для воспроизводства, чтобы произвести потомство следующего поколения.
Requires Python: >=3.9

## Вдохновлен EasyGa ❤️ 
[ссылка на их проект](https://github.com/danielwilczak101/EasyGA?ysclid=lt6np341qo375655432)

# Darwinian GA

Эта библиотека Python реализует "Дарвиновский" Генетический Алгоритм (GA) для задач оптимизации. GA симулирует процесс естественного отбора, где наиболее приспособленные особи выбираются для воспроизводства, чтобы произвести потомство следующего поколения.

## Особенности

- **Генетическое представление**: Каждая особь в популяции представлена в виде списка генов.
- **Инициализация популяции**: Популяция инициализируется случайными особями, но возможние значения генов могут задоваться пользователем.
- **Функция приспособленности**: Пользовательская функция для оценки приспособленности особи.
- **Выбор**: Реализованы три типа методов выбора: Лучшие Родители, Турнир и Рулетка.
- **Скрещивание**: Метод для объединения генов двух родителей для создания новой особи.
- **Мутация**: Метод для внесения небольших изменений в особи для поддержания разнообразия в популяции.

## Методы

- `setup`: Инициализирует GA с необходимыми параметрами.
- `tournament_selection`: Выбирает лучшую особь из случайно выбранного подмножества популяции.
- `roulette_selection`: Выбирает особь из популяции с использованием выбора рулеткой.
- `crossover`: Объединяет гены двух особей для создания новой.
- `mutate`: Вносит небольшие изменения в особь.
- `constructor`: Запускает GA с использованием указанного метода.

## constructor

- `constructor`: Запускает GA с использованием указанного метода.
Аргументы:
        selection_method (str, optional): _description_. Defaults to "bestparents".
        MaxOrMin (bool, optional): _description_. Defaults to True.
        how_much (int, optional): _description_. Defaults to 5.
        print_pop (bool, optional): _description_. Defaults to False.

    Ща покажу как этим пользоваться:
    1) bestparents - выбираем двух лучших родителей
    2) tournament - выбираем двух родителей с помощью турнирного отбора
    3) roulette - выбираем двух родителей с помощью рулетки
    
    При турнирном отборе можно задать параметр tournament_size, по умолчанию равен 2


## Использование

Для использования этого модуля вам нужно определить функцию приспособленности, которая оценивает приспособленность особи. Затем вы можете инициализировать GA с необходимыми параметрами и запустить его с использованием одного из методов выбора.


```python
from darwinian import Darwinian_GA
import random

# Определите функцию приспособленности
def fitness(*individual):
    return sum(individual[0])

# Инициализируйте GA
ga = Darwinian_GA()
ga.setup(len_gen=10, pop_size=100, mutation_rate=0.1, crossover_chance=0.5, epochs=100, fitness_func=fitness)

# Запустите GA
best_individuals = ga.constructor()
print(best_individuals[0])
```

GA будет развивать популяцию в течение указанного количества эпох и возвращать лучших особей из окончательной популяции. Вы также можете вывести популяцию на каждой эпохе, чтобы наблюдать за прогрессом GA.

```python
ga.constructor(print_pop=True)
```

## Кастомизация функции генерации особи rand_func

Эта функция генерирует гены индивида. По умолчанию, генерируются случайное целое число в диапазоне от 0 до 1.

Получается -> [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]

Ее можно переопределить:

```python
from darwinian import Darwinian_GA
import random

def fitness(*individual):
    return sum(individual[0])

# Инициализируйте GA
ga = Darwinian_GA()
ga.setup(len_gen=10, pop_size=100, mutation_rate=0.1, crossover_chance=0.5, epochs=100, fitness_func=fitness, rand_func= lambda: random.randint(0, 5))

# Запустите GA
best_individuals = ga.constructor()
print(best_individuals[0])
```

результат будет

```python
([5, 5, 5, 5, 5, 5, 5, 5, 5, 5], 50)
```
## Метод максимезации или минимизации:

Если вы хотите чтоб приспособленность была минимизирована:

то вы можете использовать параметр `MaxOrMin=False`

```python
best_individuals = ga.constructor(MaxOrMin=False)
print(best_individuals[0])
```

при прошлом примере ответ будет:

```python 
([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 0)
```