2016-05-18 7 views
4

Я пытаюсь создать простой пример алгоритма оптимизации CMA-ES в python. Каков наиболее оптимизированный способ оптимизации функции x**2 + 2*y**2 -4*x*y - 0.5*y, с учетом ограничений -2<x<2 и -1<2*(x**2)*y<1, используя алгоритм CMA-ES?Python CMA-ES Алгоритм для решения пользовательских функций и ограничений

Я заглянул в библиотеку DEAP, но не смог разработать целенаправленную попытку. Я нашел their documentation менее интуитивно понятным. Я также рассмотрел пакет cma, но мне не ясно, как я могу реализовать ограничения.

ответ

2

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

Продолжая, давайте посмотрим на the complete example. Если вы прочтете документы, вам будет удобнее смотреть на код. Размер проблемы - это количество переменных, поэтому в вашем случае, если я правильно понимаю, у вас будет N = 2 (x и y).

И вам нужна пользовательская функция фитнеса вместо benchamrks.rastrigin:

toolbox.register("evaluate", myownfunction)

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

Это будет самый простой подход с ОЭАП, но deap.cma.Strategy class может быть расширен для того, чтобы переопределить/продлить любой метод, например, метод generate так, что все люди в исходной популяции являются действительными.

+0

Можете ли вы подробнее рассказать о том, как реализовать ограничения для тех, кто не знаком с генетическими алгоритмами, в частности с CMAES? Например, я хотел бы использовать pybrain для реализации [оптимизации CMAES] (http://pybrain.org/docs/tutorial/optimization.html#continuous-optimization), но он не говорит, как делать ограниченную оптимизацию, которая вовлекает что-то как '1 - sum (x_guess)> 0' – Pupil

+0

Я предлагаю реализовать ограничения на оценку пригодности (по которым вы можете считать человека недействительным, если какое-либо ограничение не выполняется, приписывая, например, очень высокий уровень физической подготовки) , Вы также можете реализовать пользовательские операторы, которые будут варьировать только индивиды внутри заданных границ. Первое предпочтительнее, на мой взгляд, и должно быть дешевле. – rll