Metadata-Version: 2.1
Name: Darwinian
Version: 0.0.5.4
Summary: “Darwinian” - это модуль Python, который реализует Дарвиновский Генетический Алгоритм (GA) для задач оптимизации. GA симулирует процесс естественного отбора, где наиболее приспособленные особи выбираются для воспроизводства, чтобы произвести потомство следующего поколения.
Author-email: Arseniy Vinner <mrliquidxd@gmail.com>
Project-URL: Homepage, https://github.com/MrLiquidXd/Darwinian-GA
Project-URL: Issues, https://github.com/MrLiquidXd/Darwinian-GA/issues
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Python: >=3.9
Description-Content-Type: text/markdown
License-File: LICENSE

## Вдохновлен 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)
```
