python - 在将 pymoo 中的 NSGA 2 求解到数据帧中时,如何保存一组主导解决方案?

标签 python optimization evolutionary-algorithm

我正在尝试使用 NSGA 2 解决具有 3 个目标和 2 个决策变量的多目标优化问题。下面给出了 NSGA2 算法和终止标准的 pymoo 代码。我的 pop_size 是 100,n_offspring 是 100。该算法迭代了 100 代。我想将所有 100 代的每一代中考虑的所有 100 个决策变量值存储在一个数据框中。

pymoo 代码中的 NSGA2 实现:

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 question):

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 方法,您可以获得 XF 或其他值。请参阅下面的代码。

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

关于python - 在将 pymoo 中的 NSGA 2 求解到数据帧中时,如何保存一组主导解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65228878/

相关文章:

python - 使用 Selenium 和 Python 以通用方式解析表数据

python - sklearn.ensemble.AdaBoostClassifier 不能接受 SVM 作为 base_estimator?

c# - SQL 聚合性能 : converting data types, 然后序列化,而不是让它们单独存在。哪个更好?

java - 使用差异进化的函数值

python - 在数组中查找不寻常的值,列表

python - 使用 Python/NumPy 对图像阈值进行矢量化

javascript - 如何使用map()和find()方法搜索对象数组中的最小值?

android - 在嵌入式上快速解决许多微小的线性规划问题

neural-network - NEAT 算法 : How to crossover disjoint and excess genes?

python - CSound与Python通信