# 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"
}