Доступ к размеру популяции NSGA2 с помощью драйвера pyoptsparse с OpenMDAO

Я пытаюсь изменить размер популяции GA при использовании оптимизатора NSGA2 через драйвер pyoptsparse OpenMDAO.

Я попытался получить доступ к PopSize из pyNSGA2.py с помощью словаря opt_settings следующим образом:

prob.driver = om.pyOptSparseDriver(optimizer='NSGA2')
prob.driver.opt_settings["PopSize"] = 150

Однако это приводит к ошибке сегментации, сообщение ниже:

[0]PETSC ERROR: ------------------------------------------------------------------------
[0]PETSC ERROR: Caught signal number 11 SEGV: Segmentation Violation, probably memory access out of range
[0]PETSC ERROR: Try option -start_in_debugger or -on_error_attach_debugger
[0]PETSC ERROR: or see https://www.mcs.anl.gov/petsc/documentation/faq.html#valgrind
[0]PETSC ERROR: or try http://valgrind.org on GNU/linux and Apple Mac OS X to find memory corruption errors
[0]PETSC ERROR: configure using --with-debugging=yes, recompile, link, and run 
[0]PETSC ERROR: to get more information on the crash.
--------------------------------------------------------------------------
MPI_ABORT was invoked on rank 0 in communicator MPI_COMM_WORLD
with errorcode 50152059.

NOTE: invoking MPI_ABORT causes Open MPI to kill all MPI processes.
You may or may not see output from other processes, depending on
exactly when Open MPI kills them.

Есть ли другой способ доступа к параметрам оптимизатора NSGA2, который следует использовать вместо словаря opt_settings? Я относительно новичок в Python, поэтому я также подозреваю, что мой синтаксис также может быть неправильным.

Обновление: для большего контекста я попытался запустить без PETSC. Оптимизация прошла успешно без попытки изменить PopSize, однако произошел сбой только с Segmentation fault при попытке изменить PopSize. Отследите ошибку, я считаю, что источник ошибки сегментации находится в pyoptsparse/pyNSGA2/source/crossover.c, согласно сообщению ниже

Program received signal SIGSEGV, Segmentation fault.
0x00007fffbc85747b in realcross (parent1=parent1@entry=0x1864bf0, parent2=parent2@entry=0x186d030, 
    child1=child1@entry=0x1868280, child2=child2@entry=0x18682c0, global=..., nrealcross=<optimized out>)
    at pyoptsparse/pyNSGA2/source/crossover.c:104
104                 child2->xreal[i] = parent2->xreal[i];

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


person Peter    schedule 22.05.2020    source источник
comment
У меня нет большого опыта работы с оболочкой NSGAII, поэтому я не могу сильно помочь. Тем не менее, ваш синтаксис выглядит нормально для меня. Похоже, у вас проблемы с компиляцией petsc и MPI.   -  person Justin Gray    schedule 24.05.2020
comment
@JustinGray Я попытался выполнить чистую установку petsc и MPI на новой машине и столкнулся с той же ошибкой (см. обновление выше). Я опубликую еще одно обновление, если мне удастся найти проблему в petsc/MPI.   -  person Peter    schedule 25.05.2020


Ответы (1)


Просматривая исходный код C для оптимизатора NSGA2, я обнаружил, что проблема была не в доступе к параметру размера популяции, а в том, что я указывал недопустимый размер популяции. Согласно комментарию заголовка файла nsga2.c, размер популяции должен быть кратен 4.

Мне удалось успешно запустить оптимизацию при численности населения 160, а не 150 человек.

person Peter    schedule 02.06.2020