如何在Platypus的NSGAII算法中调整目标:最大化x²并最小化(x-1)²
修改Platypus NSGAII实现以混合最大化/最小化目标
嗨,这事儿其实很简单,因为Platypus的Problem类默认是最小化所有目标的,所以要实现最大化某个目标,我们只需要对这个目标取反(最小化一个负数等价于最大化原数值),或者直接显式设置目标的优化方向。下面给你两种可行的修改方式:
方法1:修改目标函数返回值(最直接)
我们只需要把要最大化的x²改成-x²,这样算法在最小化这个负数的时候,就等价于最大化原来的x²。修改后的代码如下:
from platypus import NSGAII, Problem, Real def schaffer(x): # 把最大化x²转为最小化 -x²,同时保留最小化(x-1)² return [-x[0]**2, (x[0]-1)**2] problem = Problem(1, 2) problem.types[:] = Real(-10, 10) problem.function = schaffer algorithm = NSGAII(problem) algorithm.run(10000)
方法2:显式设置目标优化方向(更清晰)
如果你不想修改目标函数的数值,可以通过Problem的directions属性来指定每个目标是最大化还是最小化。Platypus提供了Problem.MAXIMIZE和Problem.MINIMIZE两个常量来定义方向:
from platypus import NSGAII, Problem, Real def schaffer(x): # 保持原目标函数的返回值 return [x[0]**2, (x[0]-1)**2] problem = Problem(1, 2) problem.types[:] = Real(-10, 10) problem.function = schaffer # 第一个目标最大化,第二个目标最小化 problem.directions[:] = [Problem.MAXIMIZE, Problem.MINIMIZE] algorithm = NSGAII(problem) algorithm.run(10000)
这两种方法都能达到你的需求——最大化x²同时最小化(x-1)²。个人更推荐第二种,因为代码可读性更高,目标的优化方向一目了然,后期维护也更方便。
内容的提问来源于stack exchange,提问作者samie
相关产品推荐
相关产品推荐

