【发布时间】:2020-06-04 03:12:22
【问题描述】:
我想使用多目标进化算法来解决单目标优化问题。它在技术上是否正确以及如何完成?
【问题讨论】:
标签: optimization evolutionary-algorithm
我想使用多目标进化算法来解决单目标优化问题。它在技术上是否正确以及如何完成?
【问题讨论】:
标签: optimization evolutionary-algorithm
多目标算法通常通过比较适应度得分来工作。但是当健身分数是多目标时,你怎么能比较它们呢?因此,神奇之处通常在于算法如何对适应度分数进行排序。对于单目标,当尝试使用多目标算法进行优化时,这种魔力可能会丢失,但尽管如此,它可能仍然可以很好地工作。
由于您只优化一个目标,您可以使用最简单的遗传算法。例如,请参阅我在AI algorithm for multi dimension solution optimization / prediction 上的回答。
【讨论】:
让我在前面的答案中添加一些内容。多目标优化是单目标优化的推广。这意味着单目标优化是它的一个子集。多目标优化的研究领域解决了具有多个值的困难,这意味着在目标空间中用于性能评估的不是标量而是向量。每个多目标优化算法都必须解决这个问题才能工作。
对于单目标优化,目标空间中的支配概念显然仍然成立。在双目标优化(假设最小化)中,我们说[3, 5] 由[2, 4] 主导(因为它在两个目标上都更好)并且对[4, 2] 无动于衷(一次更好,一次更糟)。在单目标优化中,我们基本上将列表与 single 元素进行比较,这与仅比较标量相同。我们简单地说 3 支配 5。
因此,您通常还可以对单目标问题运行多目标优化算法。但是,您可能会发现更好的收敛速度更快的单目标算法。
例如,您可以使用著名的 NSGA-II 算法使用 Python 中的多目标优化框架 pymoo 优化单目标函数。
免责声明:我是pymoo的主要开发者。
下面的源代码使用 NSGA-II(一种多目标算法)来获得 Himmelblau 函数(单目标测试问题)的最优解:
from pymoo.algorithms.nsga2 import NSGA2
from pymoo.factory import get_problem
from pymoo.optimize import minimize
problem = get_problem("himmelblau")
algorithm = NSGA2(pop_size=20)
res = minimize(problem,
algorithm,
seed=1,
verbose=True)
print(res.F)
在 2000 次函数评估中找到 F=0.00034225。
但是,如果您使用Hooke and Jeeves Pattern Search,您将更快地获得最佳值:
from pymoo.algorithms.so_pattern_search import PatternSearch
from pymoo.factory import get_problem
from pymoo.optimize import minimize
problem = get_problem("himmelblau")
algorithm = PatternSearch()
res = minimize(problem,
algorithm,
seed=1,
verbose=True)
print(res.F)
仅在 224 次评估中找到 F=4.62182083e-18。
【讨论】: