mlo-optimizer


Namemlo-optimizer JSON
Version 1.0.0 PyPI version JSON
download
home_page
Summary
upload_time2023-11-05 18:19:50
maintainer
docs_urlNone
authorJaskier
requires_python>=3.9,<3.13
licenseApache-2.0
keywords matrix optimization genetic keyboard
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Matrix Optimization of Object Locations

## Описание

Библиотека mlo-optimizer содержит класс-оптимизатор для решения разного рода задач на подбор оптимального расположения 
объектов в матрицах

Примеры таких задач:
 - подбор оптимальной раскладки клавиатуры
 - задача составления расписания
 - поиск оптимальных маршрутов в графах

## Преимущества

Для решения задачи достаточно только реализовать целевую функцию, получающую на вход индивида и возвращающую оценку 
приспособленности для данного индивида

В оптимизаторе реализован генетический алгоритм со всеми необходимыми компонентами:
- создание случайного индивида
- скрещивание (упорядоченное скрещивание)
- мутация (мутация перестановкой)
- отбор (турнирный)
- элитизм

Индивиды могут иметь любую размерность (вектор, матрица, 3-х мерные тензоры и т.д)

Для решения задач элементы можно разделать на 2 множества:
 1. Множество учитываемых элементов (учитываются в целевой функции)
 2. Множество переставляемых элементов (меняют матричные положения в скрещивании и мутации)

Для задач подбора оптимальных раскладок реализован пайплайн, решающий данную задачу (см. раздел 'Подбор оптимальной 
раскладки')

## Установка

```
pip install mlo-optimizer
```

## Использование

Все действия происходят из класса Optimizer
```
from mlo_optimizer.optimizer import Optimizer
```

Создаем экземпляр класса с некоторыми обязательными значениями
```
optimizer = Optimizer(
    init_matrix,
    counted_elems,
    permutable_elems,
    fitness_func,
)
```

init_matrix - начальная матрица с любыми элементами, например:
```
[
    ['inv', 'lang', None, None, None, None, '?123'],
    ['settings', None, None, None, None, None, 'backspace'],
    ['inv', None, None, None, None, None, None],
    [None, None, None, 'space', None, None, 'enter'],
    ['inv', None, None, None, None, None, None],
    ['move', None, None, None, None, None, 'capslock'],
    ['inv', 'exit', None, None, None, None, 'shift'],
]
```

Места None займут элементы из permutable_elems

counted_elems - учитываемые элементы, например:
```
['a', 'b', 'c', 'd', 'e', 'f', 'space', 'enter']
```

permutable_elems - переставляемые элементы, например:
```
['a', 'b', 'c', 'd', 'e', 'f']
```

fitness_func - целевая функция, получающая на вход матрицу-индивида и возвращающую **кортеж** из оценок 
приспособленности, например:
```
def test_fitness_func(individual):
    if individual[0][0] == 'a':
        return (2.5,)
    return (-2.5,)
```
Также можно прописать именованные аргументы в fitness_func_kwargs

В конце выполняем оптимизацию
```
best_matrix = optimizer.optimize()
```

## Подбор оптимальной раскладки

Для задач из этой области можно использовать отдельный пайплайн, который состоит из нескольких шагов:
1. Создание оптимизатора
2. Вычисление весов биграмм
3. Запуск оптимизатора

Первым делом создаем оптимизатор
```
optimizer = Optimizer(
        INIT_HEX_KEYBOARD,
        EN_COUNTED_ELEMS,
        EN_PERMUTABLE_ELEMS,
        fitness_func='square',
)
```
Для этой задачи возможно получить решения для клавиатур с квадратными клавишами (fitness_func='square') и с
гексагональными (fitness_func='hex')

Также можно указать размеры клавиш с помощью следующих параметров:
- a_s (по-умолчанию 0.5): половина стороны квадратной клавиши
- a_h (по-умолчанию 0.537634): расстояние от середины гексагональной клавиши до середины ее стороны
- b_h (по-умолчанию 0.930605): расстояния от середины гексагональной клавиши до середины стороны нижестоящей клавиши

Далее запускаем fit_bigrams с указанием пути до папки с файлами формата .txt. Это необходимо для оценки важности 
близкого расположения одних пар клавиш по отношению к другим
```
lang_base_part = '../data/en/'

optimizer.fit_bigrams(lang_base_part)
```

И оптимизируем
```
best_matrix = optimizer.optimize()
```

## Параметры

При создании экземпляра класса Optimizer можно прописать следующие параметры:
- minimization (по-умолчанию True): минимизация или максимизация оценки приспособленности
- population_size (по-умолчанию 50): размер популяции в одном поколении
- max_generation (по умолчанию 50): максимальное количество поколений
- p_crossover (по-умолчанию 0.9): вероятность скрещивания
- p_mutation (по-умолчанию 0.2): вероятность мутации
- tourn_size (по-умолчанию 3): размер выборки для турнирного отбора
- hall_of_fame_size (по-умолчанию 1): количество лучших индивидов, полученных после завершения оптимизации

## Лицензия

Прям тут: [LICENSE](LICENSE)

            

Raw data

            {
    "_id": null,
    "home_page": "",
    "name": "mlo-optimizer",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.9,<3.13",
    "maintainer_email": "",
    "keywords": "matrix,optimization,genetic,keyboard",
    "author": "Jaskier",
    "author_email": "borody.maxim@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/8e/da/a9fe5dff276d5f767d43310fdc7c2726de352f4286c277781273928417f7/mlo_optimizer-1.0.0.tar.gz",
    "platform": null,
    "description": "# Matrix Optimization of Object Locations\n\n## \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\n\n\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 mlo-optimizer \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441-\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u0437\u0430\u0434\u0430\u0447 \u043d\u0430 \u043f\u043e\u0434\u0431\u043e\u0440 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \n\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0430\u0445\n\n\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0442\u0430\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447:\n - \u043f\u043e\u0434\u0431\u043e\u0440 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b\n - \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f\n - \u043f\u043e\u0438\u0441\u043a \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u0432 \u0432 \u0433\u0440\u0430\u0444\u0430\u0445\n\n## \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430\n\n\u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0449\u0443\u044e \u043d\u0430 \u0432\u0445\u043e\u0434 \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0430 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0443\u044e \u043e\u0446\u0435\u043d\u043a\u0443 \n\u043f\u0440\u0438\u0441\u043f\u043e\u0441\u043e\u0431\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0430\n\n\u0412 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0433\u0435\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438:\n- \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0430\n- \u0441\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u0435 (\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u043e\u0435 \u0441\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u0435)\n- \u043c\u0443\u0442\u0430\u0446\u0438\u044f (\u043c\u0443\u0442\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439)\n- \u043e\u0442\u0431\u043e\u0440 (\u0442\u0443\u0440\u043d\u0438\u0440\u043d\u044b\u0439)\n- \u044d\u043b\u0438\u0442\u0438\u0437\u043c\n\n\u0418\u043d\u0434\u0438\u0432\u0438\u0434\u044b \u043c\u043e\u0433\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c (\u0432\u0435\u043a\u0442\u043e\u0440, \u043c\u0430\u0442\u0440\u0438\u0446\u0430, 3-\u0445 \u043c\u0435\u0440\u043d\u044b\u0435 \u0442\u0435\u043d\u0437\u043e\u0440\u044b \u0438 \u0442.\u0434)\n\n\u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430 2 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430:\n 1. \u041c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 (\u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)\n 2. \u041c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 (\u043c\u0435\u043d\u044f\u044e\u0442 \u043c\u0430\u0442\u0440\u0438\u0447\u043d\u044b\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0441\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u0438 \u0438 \u043c\u0443\u0442\u0430\u0446\u0438\u0438)\n\n\u0414\u043b\u044f \u0437\u0430\u0434\u0430\u0447 \u043f\u043e\u0434\u0431\u043e\u0440\u0430 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043e\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d, \u0440\u0435\u0448\u0430\u044e\u0449\u0438\u0439 \u0434\u0430\u043d\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 (\u0441\u043c. \u0440\u0430\u0437\u0434\u0435\u043b '\u041f\u043e\u0434\u0431\u043e\u0440 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \n\u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438')\n\n## \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\n\n```\npip install mlo-optimizer\n```\n\n## \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\n\n\u0412\u0441\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u0430 Optimizer\n```\nfrom mlo_optimizer.optimizer import Optimizer\n```\n\n\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438\n```\noptimizer = Optimizer(\n    init_matrix,\n    counted_elems,\n    permutable_elems,\n    fitness_func,\n)\n```\n\ninit_matrix - \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441 \u043b\u044e\u0431\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:\n```\n[\n    ['inv', 'lang', None, None, None, None, '?123'],\n    ['settings', None, None, None, None, None, 'backspace'],\n    ['inv', None, None, None, None, None, None],\n    [None, None, None, 'space', None, None, 'enter'],\n    ['inv', None, None, None, None, None, None],\n    ['move', None, None, None, None, None, 'capslock'],\n    ['inv', 'exit', None, None, None, None, 'shift'],\n]\n```\n\n\u041c\u0435\u0441\u0442\u0430 None \u0437\u0430\u0439\u043c\u0443\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437 permutable_elems\n\ncounted_elems - \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:\n```\n['a', 'b', 'c', 'd', 'e', 'f', 'space', 'enter']\n```\n\npermutable_elems - \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:\n```\n['a', 'b', 'c', 'd', 'e', 'f']\n```\n\nfitness_func - \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0449\u0430\u044f \u043d\u0430 \u0432\u0445\u043e\u0434 \u043c\u0430\u0442\u0440\u0438\u0446\u0443-\u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0430 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0443\u044e **\u043a\u043e\u0440\u0442\u0435\u0436** \u0438\u0437 \u043e\u0446\u0435\u043d\u043e\u043a \n\u043f\u0440\u0438\u0441\u043f\u043e\u0441\u043e\u0431\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:\n```\ndef test_fitness_func(individual):\n    if individual[0][0] == 'a':\n        return (2.5,)\n    return (-2.5,)\n```\n\u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 fitness_func_kwargs\n\n\u0412 \u043a\u043e\u043d\u0446\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e\n```\nbest_matrix = optimizer.optimize()\n```\n\n## \u041f\u043e\u0434\u0431\u043e\u0440 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438\n\n\u0414\u043b\u044f \u0437\u0430\u0434\u0430\u0447 \u0438\u0437 \u044d\u0442\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0448\u0430\u0433\u043e\u0432:\n1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440\u0430\n2. \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0441\u043e\u0432 \u0431\u0438\u0433\u0440\u0430\u043c\u043c\n3. \u0417\u0430\u043f\u0443\u0441\u043a \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440\u0430\n\n\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440\n```\noptimizer = Optimizer(\n        INIT_HEX_KEYBOARD,\n        EN_COUNTED_ELEMS,\n        EN_PERMUTABLE_ELEMS,\n        fitness_func='square',\n)\n```\n\u0414\u043b\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440 \u0441 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u043c\u0438 \u043a\u043b\u0430\u0432\u0438\u0448\u0430\u043c\u0438 (fitness_func='square') \u0438 \u0441\n\u0433\u0435\u043a\u0441\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c\u0438 (fitness_func='hex')\n\n\u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043a\u043b\u0430\u0432\u0438\u0448 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432:\n- a_s (\u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 0.5): \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u043e\u0439 \u043a\u043b\u0430\u0432\u0438\u0448\u0438\n- a_h (\u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 0.537634): \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0442 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b \u0433\u0435\u043a\u0441\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u0434\u043e \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b \u0435\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b\n- b_h (\u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 0.930605): \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043e\u0442 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b \u0433\u0435\u043a\u0441\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u0434\u043e \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043d\u0438\u0436\u0435\u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u043a\u043b\u0430\u0432\u0438\u0448\u0438\n\n\u0414\u0430\u043b\u0435\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c fit_bigrams \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u043f\u0443\u0442\u0438 \u0434\u043e \u043f\u0430\u043f\u043a\u0438 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 .txt. \u042d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u0438 \n\u0431\u043b\u0438\u0437\u043a\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u0438\u0445 \u043f\u0430\u0440 \u043a\u043b\u0430\u0432\u0438\u0448 \u043f\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044e \u043a \u0434\u0440\u0443\u0433\u0438\u043c\n```\nlang_base_part = '../data/en/'\n\noptimizer.fit_bigrams(lang_base_part)\n```\n\n\u0418 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u043c\n```\nbest_matrix = optimizer.optimize()\n```\n\n## \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b\n\n\u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 Optimizer \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:\n- minimization (\u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e True): \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043b\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u043f\u0440\u0438\u0441\u043f\u043e\u0441\u043e\u0431\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438\n- population_size (\u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 50): \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0438\n- max_generation (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 50): \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0439\n- p_crossover (\u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 0.9): \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u044f\n- p_mutation (\u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 0.2): \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043c\u0443\u0442\u0430\u0446\u0438\u0438\n- tourn_size (\u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 3): \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0434\u043b\u044f \u0442\u0443\u0440\u043d\u0438\u0440\u043d\u043e\u0433\u043e \u043e\u0442\u0431\u043e\u0440\u0430\n- hall_of_fame_size (\u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 1): \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043b\u0443\u0447\u0448\u0438\u0445 \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438\n\n## \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f\n\n\u041f\u0440\u044f\u043c \u0442\u0443\u0442: [LICENSE](LICENSE)\n",
    "bugtrack_url": null,
    "license": "Apache-2.0",
    "summary": "",
    "version": "1.0.0",
    "project_urls": null,
    "split_keywords": [
        "matrix",
        "optimization",
        "genetic",
        "keyboard"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e6a5fea15f70a86669b7c4bb65a562076d8cccdb8c038b757645bbad05bf0915",
                "md5": "6f0b01e31183d9f5280f977aa234568c",
                "sha256": "2e5163d9dc09eccaba3cbaa465c0299299c74329bf28244cad715a684ccf9b24"
            },
            "downloads": -1,
            "filename": "mlo_optimizer-1.0.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "6f0b01e31183d9f5280f977aa234568c",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9,<3.13",
            "size": 19588,
            "upload_time": "2023-11-05T18:19:48",
            "upload_time_iso_8601": "2023-11-05T18:19:48.795505Z",
            "url": "https://files.pythonhosted.org/packages/e6/a5/fea15f70a86669b7c4bb65a562076d8cccdb8c038b757645bbad05bf0915/mlo_optimizer-1.0.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8edaa9fe5dff276d5f767d43310fdc7c2726de352f4286c277781273928417f7",
                "md5": "5b0d881a2bb913c1c04f02df31b88d42",
                "sha256": "928ad72f0b453cb055d20eeeb81ac7d5134936cdc0d3ea0272c087eb549e1455"
            },
            "downloads": -1,
            "filename": "mlo_optimizer-1.0.0.tar.gz",
            "has_sig": false,
            "md5_digest": "5b0d881a2bb913c1c04f02df31b88d42",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9,<3.13",
            "size": 17126,
            "upload_time": "2023-11-05T18:19:50",
            "upload_time_iso_8601": "2023-11-05T18:19:50.757881Z",
            "url": "https://files.pythonhosted.org/packages/8e/da/a9fe5dff276d5f767d43310fdc7c2726de352f4286c277781273928417f7/mlo_optimizer-1.0.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-11-05 18:19:50",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "mlo-optimizer"
}
        
Elapsed time: 0.13306s