在将 pymoo 中的 NSGA 2 求解到数据帧中时,如何保存一组主导解决方案?
How to save the set of dominated solutions while solving NSGA 2 in pymoo into a dataframe?
我正在尝试使用 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)
我尝试过的(我的参考:Whosebug 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
方法,您可以获得 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
我正在尝试使用 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)
我尝试过的(我的参考:Whosebug 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
方法,您可以获得 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