Есть несколько частей к вопросам, поэтому у меня будет пара частей к этому ответу.
Почему 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