scipy.optimize дифференциальная_эволюция, кажется, игнорирует ограничение размера популяции - PullRequest
0 голосов
/ 24 марта 2020

Я использую следующий код, чтобы провести эксперименты и начать изучать, как использовать DE для оптимизации более сложных задач. Мне нужен оптимизатор, который может работать с целыми числами.

from scipy.optimize import differential_evolution
def objfun(x):
    print('N')
    return x[0]+2*x[1]**-4*x[2]
solution=differential_evolution(objfun,bounds=((1,10000),(1,200000),(1,50000)),popsize=0,maxiter=3,polish=False,disp=True)

Проблема возникает при настройке popsize. Я получаю больше населения, чем ожидалось, и если я установлю его на 0, то получу 10 элементов для первой группы, а затем 5 для остальных групп, пока не достигну максимума.

это пример результата, который я получаю с приведенным выше кодом

runfile('D:/PYTHON/untitled0.py', wdir='D:/PYTHON')
N
N
N
N
N
N
N
N
N
N
differential_evolution step 1: f(x)= 318.074
N
N
N
N
N
differential_evolution step 2: f(x)= 169.667
N
N
N
N
N
differential_evolution step 3: f(x)= 169.667

Я действительно не понимаю, что я делаю неправильно, по крайней мере я ожидал, что popsize = 0 выдаст ошибку. Кроме того, есть ли другие скрытые параметры для установки начального размера популяции, которые должны быть отредактированы?

Я все еще бегун, я начал с python несколько недель go, поэтому я бы будь очень благодарен за простое объяснение.

Большое спасибо всем, кто нашел время, чтобы ответить мне.

Стив

1 Ответ

0 голосов
/ 15 апреля 2020

Есть несколько частей к вопросам, поэтому у меня будет пара частей к этому ответу.

Почему popsize=0 не выдает ошибку?

Это скучная реализация differential_evolution, почему она не выдает ошибку. Вы можете видеть, что первый вызов приведет к 10 вызовам, а второй и третий вызов только 5. Это из-за случайного начального числа.

Когда вы вызываете differential_evolution, есть аргумент seed, который определяет «случайность» в функции. Поскольку в первый момент времени он может быть очень отличным от истинного значения, он будет вызывать его 10 раз, а за 1 шаг функция может оптимизироваться до истинного значения.

Если вы установили начальное значение и всплывающее значение равно 0:

Если вы установите начальное значение, вы можете воспроизвести код и посмотреть, верен ли он.

Вот где начальное число 0 (оно больше не оптимизирует):

>>> soln = differential_evolution(objfun, bounds=((1,10000),(1,200000),(1,50000)),popsize=0,maxiter=3,polish=False,disp=True, seed=0)
differential_evolution step 1: f(x)= 1098.52
differential_evolution step 2: f(x)= 1098.52
differential_evolution step 3: f(x)= 1098.52

Семя с попсовым размером> 0:

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

differential_evolution step 1: f(x)= 183.92
differential_evolution step 2: f(x)= 183.92
differential_evolution step 3: f(x)= 5.81206

Если мы изменим размер всплывающего окна на значение, большее 10, мы приблизимся к минимуму.

>>> soln = differential_evolution(objfun, bounds=((1,10000),(1,200000),(1,50000)),popsize=100,maxiter=3,polish=False,disp=True, seed=0)
differential_evolution step 1: f(x)= 10.3284
differential_evolution step 2: f(x)= 8.35376
differential_evolution step 3: f(x)= 2.65333
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...