Как сохранить набор доминирующих решений при решении NSGA 2 в pymoo в фрейме данных?

Я пытаюсь решить проблему многоцелевой оптимизации с 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: [] 
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
895
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Рад, что вы собираетесь использовать 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»

Colton Campbell 18.05.2023 22:10

Другие вопросы по теме