Генетический алгоритм сходится сразу по крайне низкой оптиме и очень медленно - PullRequest
0 голосов
/ 03 сентября 2018

Я начал в благородном стремлении получить (несколько) более высокие взлеты компании, в которой я работаю, чтобы хотя бы рассмотреть ОД. Я работаю в автомобильной промышленности, поэтому основная часть наших «проблем» связана с такими вещами, как поиск идеального расстояния между центром тяжести автомобиля и его задними и передними колесами, идеальный вес и т. Д.

Таким образом, вся сделка может быть сформулирована как фитнес-функция, созревшая для оптимизации.

Фактическая функция работает следующим образом: мы получаем несколько тестовых случаев, скажем, 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 и сходятся там.

Я не делал никаких оптимизаций к алгоритму, так как решил, что сделаю это после того, как получу подтверждение концепции.

Мои текущие детали реализации:

  1. 4 измерения, как я уже сказал, каждое со своей нижней и верхней границами.

  2. Мутация выбирает одно из 4 измерений случайным образом и рандомизирует его значение.

  3. Вероятность мутации составляет 0,3.

  4. Кроссовер моделируется двоичным ограниченным.

  5. Вероятность пересечения составляет 0,6.

  6. Я делаю кроссовер, а затем мутации на случайных выборках населения.

  7. Численность населения составляет около 50 человек.

  8. Я использую выбор турнира с размером турнира 1/4 населения.

  9. Каждое поколение 3/4 этого поколения выбирается, 1/4 заменяется новыми людьми.

Оптимизации, которые я планировал использовать, но еще не внедрил.

  1. элитарность.

  2. Параметры адаптивной мутации с использованием метода кластеризации, как описано здесь: https://matlab1.com/wp-content/uploads/2015/09/Clustering-Based-Adaptive-Crossover-and-Mutation-Probabilities-for-Genetic-Algorithms-matlab1.com_.pdf

Я немного озадачен тем, как именно мне следует поступить, так как алгоритм вроде ... попадание в конкретную локальную оптимуму с самого начала на нескольких прогонах - это то, о чем я даже не думал, что это может произойти, и понятия не имею, как чинить. Любое предложение будет оценено много. Заранее спасибо!

...