【问题标题】:How to scale and weight fitness of a given values?如何缩放和加权给定值的适应度?
【发布时间】:2020-01-10 16:17:46
【问题描述】:

我正在开发 GA。我的问题如下。我有一个需要几个值的适应度函数:

A - 一个巨大但不太重要的值,例如 999999。 (重要性权重占最终结果的 30%)

B - 值小几倍但更重要,例如 50。 (重要性权重占最终结果的 70%)

我假设这两个值都力求无穷大。如何在我有类似的地方建立一个健身功能:

long calculateFitness(A, weightOfA, B, weightOfB);

结果将是任何长数字,这将使 B 变量更加重要。

【问题讨论】:

  • 我认为这取决于 A 和 B 如何增长。例如。如果 A 呈指数增长,您可能希望在适应度函数中使用 log(A)。
  • 这可行。你的意思是让 log(A) 和 log(B) 乘以它们的权重?如何选择正确的日志库?这两个值的增长速度不同。更重要的价值 B,增长速度比 A 慢几倍。
  • 不清楚你想要什么。在什么条件下 (a1,b1) 会比 (a2,b2) 好?您说的是“重要性的重要性”之类的东西,但实际上是什么意思?
  • 我可以举一个例子,说明我的 AI 的行为方式以及它如何获得健康。对于正确方向的每一步,它都会获得+1分。变量表示正确方向的步数。如果您到达某个地方,您将获得 50 分,即变量 B。要解决的主要问题是在变量 B 处获得最高分。变量 A 显着缩短了找到正确路径的时间。

标签: algorithm neural-network artificial-intelligence genetic-algorithm fitness


【解决方案1】:

您需要为每个目标值设置一个上限和下限。如果无法估计上限(下限),您可以考虑当前迭代中的最高(最低)值。

设目标 A 和 B 的上限分别为 ubA 和 ubB,目标 A 和 B 的下限分别为 lbA 和 lbB。这里我假设 lbA 和 lbB 等于 0,而 ubA 和 ubB 分别是 999999 和 50。

现在假设你有一个 valueA = 642465 和一个 valueB = 47。你可以这样做:

let lbA = 0;
let ubA = 999999;
let valueA = 642465

let lbB = 0;
let ubB = 50
let valueB = 47

let remappedA = remap(valueA, lbA, ubA, 0, 1);
let remappedB = remap(valueB, lbB, ubB, 0, 1);
let weightedValue = getWeightedValue(0.3, remappedA, 0.7, remappedB);

console.log(valueA + ' remapped to ' + remappedA);
console.log(valueB + ' remapped to ' + remappedB);
console.log("Weighted objective value: " + weightedValue);

function remap(n, start1, stop1, start2, stop2) {
  return ((n - start1)/(stop1 - start1)) * (stop2 - start2) + start2;
}

function getWeightedValue(weightA, valueA, weightB, valueB){
   return  weightA * valueA + weightB * valueB;
}

你的输出值应该是 0.8507396927396926

【讨论】:

  • 谢谢回答,我稍后会检查。但我无法预测这两个变量的最大值。因为它是适应度函数,所以它力求无穷大。每个新生物都在无限游戏中找到更好的路径。当我将 ubA 和 ubB 更新为最近的最高值时,它会起作用吗?这就是为什么使用日志有一些好处。
  • 您应该尝试更新上限,因为您发现新的最高值,正如您评论的那样。不幸的是,如果您无法计算上限,那是我能想到的解决问题的唯一方法。
  • 这正是我想要的,谢谢。使用您的方程式,可以添加任何因素、比例并为其设置适当的权重。尽管使用 double 作为适应度会导致我正在使用的库中出现一些问题,例如 NaN 或 Infnity。现在,如果我找到更高的 valueA,我让 ubA = valueA*1.2。这避免了为每个新高获得 1。如果您有更多建议,我将不胜感激。
  • 还有一件事。你能向我解释一下 remap 中的变量 start2、stop2 是什么吗?这是规模边界?
  • remap 函数表示映射值n,从start1stop1start2stop2 的范围。
【解决方案2】:

假设您有 {V1,W1} 和 {v2,W2},其中 V 表示值,W 表示它的重要性权重。

calcualteFintess(V1,W1,V2,W2){

valuePart1 = V1*W1;

valuePart2 = V2*W2;

用 valuePart1 和 valuePart2 施展你的魔法}

例如:

V1 = 120,W1 = 30% V2 = 30,W2 = 70%

结果将从 120*0.3 = 36 和 30*0.7 = 21 计算,它将包含值 V1 的 30% 和值 V2 的 70%。 这就是我对您的问题的理解,如果我错了,请纠正我。

【讨论】:

  • 这不是那么简单,因为我的例子中的 A 和 B 来自不同的范围,我不知道它们范围的上限。对于值 A = 999999 是平均数,对于值 B = 50 是平均数。如果我接受你的建议,我最终会得到 A 压倒性的 B,这是不正确的。
  • 您还可以得到 x = A / B,根据 x 以及 A 和 B 值的权重,您可以计算结果中每个值的百分比/参与度。
  • 这个更接近,但我不完全确定当 A 和 B 达到现在的上限时如何动态缩放这些值。
猜你喜欢
  • 2012-09-19
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2022-08-19
  • 2012-06-20
  • 1970-01-01
  • 2019-11-19
相关资源
最近更新 更多