【问题标题】:How to combine multiple objectives for optimization?如何组合多个目标进行优化?
【发布时间】:2017-08-26 02:08:36
【问题描述】:

我不知道为什么我很难弄清楚。

例如,我有两个函数,f(x, y)g(x, y)。我想找到 xy 的值,这样:

  • f(x, y) 处于目标值(最小化与目标的差异)
  • g(x, y) 被最小化(可以是负数,不会停在 0)
  • xy 是有界的(所以 g 的最小值不一定有 0 的梯度)

因此,如果我只是为 f 找到解决方案,我可以最小化 abs(f(x, y) - target),例如,当找到解决方案时它会归零。但是有多种这样的解决方案,我也想找到一个最小化 g 的解决方案。

那么我如何将这两个函数组合成一个表达式,然后我可以最小化(使用类似牛顿的方法)?

我的第一次尝试是 100*abs(f(x, y) - target) + g(x, y) 强烈强调首先达到目标,它适用于目标值的某些情况,但对于其他情况却失败了,因为 g(x, y) 可能会变得如此消极以至于它主导了组合和优化器不再关心f。我如何保证 f 击中目标总是占优?

是否有关于如何将多个目标组合成一个目标的一般规则?

【问题讨论】:

标签: math mathematical-optimization nonlinear-optimization


【解决方案1】:

关于多目标优化的文献非常丰富。两种流行的方法是加权客观法和字典法。

加权目标可以设计为:

min w1 * [f-target]^2 + w2 * g

对于一些权重w1, w2 >= 0。通常我们有w1+w2=1,所以我们也可以写:

min w1 * [f-target]^2 + (1-w1) * g

将 w1 设置为大于 w2 的值以强调 f 目标。

字典法假定目标排序。它可能看起来像:

  1. 解决第一个目标z = min [f-target]^2。让 z* 成为最优目标。
  2. 在靠近 z* 的情况下使用第二个目标求解: min g subject to [f-target]^2-z* <= tolerance

为了测量目标和 f 之间的偏差,我在这里使用了二次函数。您也可以使用绝对值。

【讨论】:

  • 哦,平方误差!这比abs() 更流畅;我喜欢。 “目标排序”听起来和我想要的完全一样,但是有没有办法创建一个表达这种排序的单一客观表达式?我觉得它会使用 min(f, g) 之类的东西(选择两者中较小的一个,而不是你使用的 min),但我想不出它实际上会是什么。
  • 我想你的意思是你想摆脱字典搜索的第二个解决方案中的约束。我首选的方法是使用可以处理约束的求解器(我处理的问题通常有很多约束)。否则会有惩罚方法将约束转移到目标中。任何关于非线性规划的好书都会详细介绍这些方法。
  • “任何好书都会详细介绍”你能否举一个具体的例子让我开始,因为我不知道我在寻找什么?
  • 例如 Nocedal 和 Wright,数值优化。然而,几乎在所有情况下,编写自己的求解器都是一个坏主意(就像编写自己的文字处理器一样)。
  • 哦,我不想编写自己的求解器。我以为你的意思是它有如何编写带约束的目标函数的示例。我现在看到scipy.optimize.minimize 确实支持约束,但是当我尝试使用它们时,它给了我不符合约束的错误结果。不过,我想这是一个单独的问题。
【解决方案2】:

由于您无法准确地将 f(x,y)-target 设为零,因此您必须接受一些错误。我将使用相对误差 r = abs((f(x, y) - target)/target)。

一个随着 r 快速增长的函数应该可以解决问题。

exp(r/epsilon) + g(x, y)

如果我选择 epsilon = 1e-10,那么我知道 r 必须小于 1e-7,因为 exp(1000) 是一个巨大的数字,但是当 r 很小时,例如 r = 1e-12,那么指数变化非常缓慢,g(x,y) 将成为主导项。您甚至可以更进一步,计算 x 和 y 与它们的真实值的接近程度,但通常更容易调整参数,直到获得所需的值。

【讨论】:

  • 哦,我想我忘了提到 x 和 y 是有界的,所以 g 的导数不一定是 0,如果它达到其中一个边界。
猜你喜欢
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 2021-11-03
  • 1970-01-01
  • 2019-06-09
  • 2016-10-17
  • 1970-01-01
相关资源
最近更新 更多