Я пытаюсь решить проблему многоцелевой оптимизации с 3 целями и 2 переменными решения, используя NSGA 2. Ниже приведен код pymoo для алгоритма NSGA2 и критериев завершения. Мой pop_size равен 100, а n_offspring равен 100. Алгоритм повторяется в течение 100 поколений. Я хочу сохранить все 100 значений переменных решения, рассматриваемых в каждом поколении, для всех 100 поколений в фрейме данных.
Реализация NSGA2 в коде pymoo:
from pymoo.algorithms.nsga2 import NSGA2
from pymoo.factory import get_sampling, get_crossover, get_mutation
algorithm = NSGA2(
pop_size=20,
n_offsprings=10,
sampling=get_sampling("real_random"),
crossover=get_crossover("real_sbx", prob=0.9, eta=15),
mutation=get_mutation("real_pm", prob=0.01,eta=20),
eliminate_duplicates=True
)
from pymoo.factory import get_termination
termination = get_termination("n_gen", 100)
from pymoo.optimize import minimize
res = minimize(MyProblem(),
algorithm,
termination,
seed=1,
save_history=True,
verbose=True)
Что я пробовал (Моя ссылка: вопрос о stackoverflow):
import pandas as pd
df2 = pd.DataFrame (algorithm.pop)
df2.head(10)
Результат приведенного выше кода пуст и при прохождении
print(df2)
я получил
Empty DataFrame
Columns: []
Index: []
Рад, что вы собираетесь использовать pymoo для своих исследований. Вы правильно включили опцию save_history
, что означает, что вы можете получить доступ к объектам алгоритма.
Чтобы получить все решения из серии, вы можете объединить потомков (algorithm.off
) из каждого поколения. Не забывайте, что Population
объекты содержат Individual
цели. С помощью метода get
вы можете получить X
и F
или другие значения. См. код ниже.
import pandas as pd
from pymoo.algorithms.nsga2 import NSGA2 from pymoo.factory import get_sampling, get_crossover, get_mutation, ZDT1 from pymoo.factory import get_termination from pymoo.model.population import Population from pymoo.optimize import minimize
problem = ZDT1()
algorithm = NSGA2(
pop_size=20,
n_offsprings=10,
sampling=get_sampling("real_random"),
crossover=get_crossover("real_sbx", prob=0.9, eta=15),
mutation=get_mutation("real_pm", prob=0.01,eta=20),
eliminate_duplicates=True )
termination = get_termination("n_gen", 10)
res = minimize(problem,
algorithm,
termination,
seed=1,
save_history=True,
verbose=True)
all_pop = Population()
for algorithm in res.history:
all_pop = Population.merge(all_pop, algorithm.off)
df = pd.DataFrame(all_pop.get("X"), columns=[f"X{i+1}" for i in range(problem.n_var)])
print(df)
Другой способ — использовать обратный вызов и заполнять фрейм данных при каждом поколении. Подобно тому, как показано здесь: https://pymoo.org/interface/callback.html
Это дает мне ModuleNotFoundError: нет модуля с именем «pymoo.model»