python-3.x - 使用 Pymoo 重新启动优化
问题描述
我正在尝试重新启动 pymoo 中的优化。
我有一个问题定义为:
class myOptProb(Problem):
"""my body goes here"""
algorithm = NSGA2(pop_size=24)
problem = myOptProblem(opt_obj=dp_ptr,
nvars=7,
nobj=4,
nconstr=0,
lb=0.3 * np.ones(7),
ub=0.7 * np.ones(7),
parallelization=('threads', cpu_count(),))
res = minimize(problem,
algorithm,
('n_gen', 100),
seed=1,
verbose=True)
在优化过程中,我将设计向量和结果写入 .csv 文件。design_vectors.csv 的一个例子是:
5.000000000000000000e+00, 4.079711567060104183e-01, 6.583544872784267143e-01, 4.712364759485179189e-01, 6.859360188593541796e-01, 5.653765991273791425e-01, 5.486782880836487131e-01, 5.275405748345924906e-01,
7.000000000000000000e+00, 5.211287914743063521e-01, 6.368123569438421949e-01, 3.496693260479644128e-01, 4.116734716044557763e-01, 5.343037085833151068e-01, 6.878382993278697732e-01, 5.244120877022839800e-01,
9.000000000000000000e+00, 5.425317846613321171e-01, 5.275405748345924906e-01, 4.269449637288642574e-01, 6.954464617649794844e-01, 5.318980876983187001e-01, 4.520564690494201510e-01, 5.203792876471586837e-01,
1.100000000000000000e+01, 4.579502451694219545e-01, 6.853050113762846340e-01, 3.695822666721857441e-01, 3.505318077758549089e-01, 3.540316632186925050e-01, 5.022648662707586142e-01, 3.086099221096791911e-01,
3.000000000000000000e+00, 4.121775968257620493e-01, 6.157117313805953174e-01, 3.412904026310568106e-01, 4.791574104703620329e-01, 6.634382012372381787e-01, 4.174456593494717538e-01, 4.151101354345394512e-01,
结果.csv 是:
5.000000000000000000e+00, 1.000000000000000000e+05, 1.000000000000000000e+05, 1.000000000000000000e+05, 1.000000000000000000e+05,
7.000000000000000000e+00, 1.041682833582066703e+00, 3.481167125962069189e-03, -5.235115318709097909e-02, 4.634480813876099177e-03,
9.000000000000000000e+00, 1.067730307802263967e+00, 2.194702810002167534e-02, -3.195892023664552717e-01, 1.841232582360878426e-03,
1.100000000000000000e+01, 8.986880344052742275e-01, 2.969022150977750681e-03, -4.346692726475211849e-02, 4.995468429444801205e-03,
3.000000000000000000e+00, 9.638770499257821589e-01, 1.859596479928402393e-02, -2.723230073142696162e-01, 1.600910928983005632e-03,
第一列是设计向量的索引——因为我是异步线程的,所以我指定了索引。
我看到应该可以通过采样参数重新启动优化,pymoo.algorithms.nsga2.NSGA2
但我找不到工作示例。人口和个人的文件也不清楚。那么如何使用以前的结果重新开始模拟呢?
解决方案
是的,您可以使用种群来初始化算法对象,而不是随机进行。
我为有偏见的初始化写了一个小教程: https ://pymoo.org/customization/initialization.html
因为在您的情况下,数据已经存在,在 CSV 或内存文件中,您可能想要创建一个虚拟问题(我Constant
在我的示例中调用它)来设置对象中的属性Population
。(在人口X
, F
, G
,CV
和feasible
需要设置)。另一种方法是直接设置属性...
带有虚拟问题的有偏初始化如下所示。如果您已经使用 pymoo 来存储 csv 文件,您也可以直接只np.save
加载Population
对象并加载它。然后不需要所有中间步骤。
我计划在未来改进检查点的实施。因此,如果您有更多的反馈和用例还无法实现,请告诉我。
import numpy as np
from pymoo.algorithms.nsga2 import NSGA2
from pymoo.algorithms.so_genetic_algorithm import GA
from pymoo.factory import get_problem, G1, Problem
from pymoo.model.evaluator import Evaluator
from pymoo.model.population import Population
from pymoo.optimize import minimize
class YourProblem(Problem):
def __init__(self, n_var=10):
super().__init__(n_var=n_var, n_obj=1, n_constr=0, xl=-0, xu=1, type_var=np.double)
def _evaluate(self, x, out, *args, **kwargs):
out["F"] = np.sum(np.square(x - 0.5), axis=1)
problem = YourProblem()
# create initial data and set to the population object - for your this is your file
N = 300
X = np.random.random((N, problem.n_var))
F = np.random.random((N, problem.n_obj))
G = np.random.random((N, problem.n_constr))
class Constant(YourProblem):
def _evaluate(self, x, out, *args, **kwargs):
out["F"] = F
out["G"] = G
pop = Population().new("X", X)
Evaluator().eval(Constant(), pop)
algorithm = GA(pop_size=100, sampling=pop)
minimize(problem,
algorithm,
('n_gen', 10),
seed=1,
verbose=True)
推荐阅读
- ios - 未知类型名称'thread_policy_flavor_t';你的意思是“task_policy_flavor_t”吗?
- apache-kafka - 如何使用 Reactor 执行无限 Kafka 轮询?
- linux - CallerFilePathAttribute 未在 azure 的 linux 容器应用服务上返回具有有效目录分隔符的文件路径
- r - 如何按顺序找到向量的最小值
- oracle - PLSQL 语句不检索数据库中存储的不同字符集(垃圾)数字类型
- mysql - 如何在终端或 GUI 中访问 mysql 社区服务器?
- amazon-web-services - 仅允许删除用户创建的存储桶的 S3 策略
- html - 所有列表项(连接)的边框底部,它将如何工作?
- android - fusedLocationProviderClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper()) 使 android 应用程序崩溃
- python - 当提供 boot_volume 而不是图像时,python openstack 客户端创建服务器失败