Package: mlo-optimizer
Matrix Optimization of Object LocationsОписаниеБиблиотека mlo-optimizer содержит класс-оптимизатор для решения разного рода задач на подбор оптимального расположения
объектов в матрицахПримеры таких задач:подбор оптимальной раскладки клавиатурызадача составления расписанияпоиск оптимальных маршрутов в графахПреимуществаДля решения задачи достаточно только реализовать целевую функцию, получающую на вход индивида и возвращающую оценку
приспособленности для данного индивидаВ оптимизаторе реализован генетический алгоритм со всеми необходимыми компонентами:создание случайного индивидаскрещивание (упорядоченное скрещивание)мутация (мутация перестановкой)отбор (турнирный)элитизмИндивиды могут иметь любую размерность (вектор, матрица, 3-х мерные тензоры и т.д)Для решения задач элементы можно разделать на 2 множества:Множество учитываемых элементов (учитываются в целевой функции)Множество переставляемых элементов (меняют матричные положения в скрещивании и мутации)Для задач подбора оптимальных раскладок реализован пайплайн, решающий данную задачу (см. раздел 'Подбор оптимальной
раскладки')Установкаpip install mlo-optimizerИспользованиеВсе действия происходят из класса Optimizerfrom 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_elemscounted_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()Подбор оптимальной раскладкиДля задач из этой области можно использовать отдельный пайплайн, который состоит из нескольких шагов:Создание оптимизатораВычисление весов биграммЗапуск оптимизатораПервым делом создаем оптимизатор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