Я начал в благородном стремлении получить (несколько) более высокие взлеты компании, в которой я работаю, чтобы хотя бы рассмотреть ОД. Я работаю в автомобильной промышленности, поэтому основная часть наших «проблем» связана с такими вещами, как поиск идеального расстояния между центром тяжести автомобиля и его задними и передними колесами, идеальный вес и т. Д.
Таким образом, вся сделка может быть сформулирована как фитнес-функция, созревшая для оптимизации.
Фактическая функция работает следующим образом: мы получаем несколько тестовых случаев, скажем, 10-15, тестовые примеры, представляющие поворот на скорости 100 км / ч, переключение полосы движения на скорости 150 км / ч и т. Д., И у нас есть универсальная тестовая функция, которая, учитывая набор или параметры (как упомянуто выше) возвращает процент ошибок. Например:
get_error(test_case = lane_switch_100kph,
weight = 2000, // kg
front_axle_dist = 1.3, // meters
back_axle_dist = 1.4 // meters
)
И эта функция возвращает значение с плавающей точкой в интервале [0, 100], в котором указана «ошибка», насколько автомобиль отклоняется от идеального пути, когда используются эти конкретные параметры. Эта ошибка должна быть ниже 10%.
Я собрал генетический алгоритм (если это имеет значение, я сделал это на python, используя библиотеку DEAP) и протестировал с помощью функции Rastrigin, и все было отлично. Для функции пригодности реального моделирования я использовал среднее значение квадратов ошибок для всех тестовых случаев.
На бумаге это выглядело достаточно просто. Для начала мне нужно оптимизировать более общее моделирование, которое имеет только 4 параметра, так что функция с 4 переменными, которая должна быть достаточно простой для решения генетического алгоритма, прекрасно справилась с Растригином в 100 измерениях, поэтому 4-мерная функция должна быть кусок торта.
Эта конкретная модель уже была сделана вручную несколькими неделями ранее, и можно получить ошибку ниже 10% во всех тестовых случаях.
Проблема - алгоритм, хотя он и улучшает среднеквадратичную ошибку, он делает это крайне медленно. Для 11 тестовых случаев, с начальными ошибками, висящими около 10-30%, и начальным MSE, висящим около 800, алгоритм, кажется, находится в заключительной фазе сходимости сразу, медленно переходя от ~ 800 (1-3 MSE уменьшаются на поколение) примерно до 725-750 и сходятся там.
Я не делал никаких оптимизаций к алгоритму, так как решил, что сделаю это после того, как получу подтверждение концепции.
Мои текущие детали реализации:
4 измерения, как я уже сказал, каждое со своей нижней и верхней границами.
Мутация выбирает одно из 4 измерений случайным образом и рандомизирует его значение.
Вероятность мутации составляет 0,3.
Кроссовер моделируется двоичным ограниченным.
Вероятность пересечения составляет 0,6.
Я делаю кроссовер, а затем мутации на случайных выборках населения.
Численность населения составляет около 50 человек.
Я использую выбор турнира с размером турнира 1/4 населения.
Каждое поколение 3/4 этого поколения выбирается, 1/4 заменяется новыми людьми.
Оптимизации, которые я планировал использовать, но еще не внедрил.
элитарность.
Параметры адаптивной мутации с использованием метода кластеризации, как описано здесь: https://matlab1.com/wp-content/uploads/2015/09/Clustering-Based-Adaptive-Crossover-and-Mutation-Probabilities-for-Genetic-Algorithms-matlab1.com_.pdf
Я немного озадачен тем, как именно мне следует поступить, так как алгоритм вроде ... попадание в конкретную локальную оптимуму с самого начала на нескольких прогонах - это то, о чем я даже не думал, что это может произойти, и понятия не имею, как чинить. Любое предложение будет оценено много. Заранее спасибо!