pymoo框架下达到指定目标值时如何终止最小化优化迭代?
pymoo单目标优化设置最优适应度阈值终止的解决方案
pymoo没有内置直接的f_threshold阈值终止配置,你可以通过以下两种可行方案实现需求:
方案1:自定义终止条件类(推荐)
这是pymoo官方推荐的扩展终止规则的方式,逻辑清晰且可以和原有内置终止条件组合使用:
- 首先自定义阈值终止类:
from pymoo.core.termination import Termination import numpy as np class FThresholdTermination(Termination): def __init__(self, f_threshold, is_minimize=True): super().__init__() self.f_threshold = f_threshold self.is_minimize = is_minimize def _do_terminate(self, algorithm): # 获取当前迭代的最优适应度值 current_opt_f = algorithm.opt.get("F").min() if self.is_minimize else algorithm.opt.get("F").max() # 最小化问题判断是否小于等于阈值,最大化反之 if self.is_minimize: return current_opt_f <= self.f_threshold else: return current_opt_f >= self.f_threshold
- 与原有默认终止条件组合使用(避免无限迭代):
pymoo支持多个终止条件逻辑或组合,只要触发任意一个就停止迭代:
from pymoo.core.termination import OR from pymoo.termination.default import SingleObjectiveDefaultTermination # 组合原有默认终止 + 自定义阈值终止 termination = OR( SingleObjectiveDefaultTermination( x_tol=1e-8, cv_tol=1e-6, f_tol=1e-6, nth_gen=5, n_last=20, n_max_gen=1000, n_max_evals=100000 ), FThresholdTermination(f_threshold=1e-3) # 替换为你需要的目标阈值 )
- 正常将上述
termination对象传入minimize方法的对应参数即可。
方案2:通过回调实现临时终止
如果只是临时测试不想单独定义类,可以通过回调函数判断后手动停止迭代:
from pymoo.core.callback import Callback class StopAtFThreshold(Callback): def __init__(self, f_threshold, is_minimize=True): super().__init__() self.f_threshold = f_threshold self.is_minimize = is_minimize def notify(self, algorithm): current_opt_f = algorithm.opt.get("F").min() if self.is_minimize else algorithm.opt.get("F").max() if (self.is_minimize and current_opt_f <= self.f_threshold) or (not self.is_minimize and current_opt_f >= self.f_threshold): algorithm.termination.force_termination = True
使用时将回调传入minimize方法的callback参数即可,建议同时保留原有默认终止条件兜底。
内容的提问来源于stack exchange,提问作者Thomas Wagenaar
相关产品推荐
相关产品推荐

