我正在做一个 GA。我的问题如下。我有一个适应度函数,它有几个值:
A - 值很大,但不太重要,例如 999999。(重要性权重占最终结果的 30%)
B - 值小几倍但更重要,例如 50。(重要性权重占最终结果的 70%)
我假设这两个值都力求无穷大。如何在我有类似的地方建立一个健身功能:
long calculateFitness(A, weightOfA, B, weightOfB);
结果将是任何长数字,这将使 B 变量更加重要。
我正在做一个 GA。我的问题如下。我有一个适应度函数,它有几个值:
A - 值很大,但不太重要,例如 999999。(重要性权重占最终结果的 30%)
B - 值小几倍但更重要,例如 50。(重要性权重占最终结果的 70%)
我假设这两个值都力求无穷大。如何在我有类似的地方建立一个健身功能:
long calculateFitness(A, weightOfA, B, weightOfB);
结果将是任何长数字,这将使 B 变量更加重要。
您需要每个目标值的上限和下限。如果无法估计上限(下限),您可以考虑当前迭代中的最高(最低)值。
设目标 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
假设您有 {V1,W1} 和 {v2,W2} 其中 V 代表值,W 代表它的重要性权重。
calcualteFintess(V1,W1,V2,W2){
值Part1 = V1*W1;
价值部分2 = V2*W2;
用 valuePart1 和 valuePart2 做你的魔法}
例如:
V1 = 120,W1 = 30% V2 = 30,W2 = 70%
结果将从 120*0.3 = 36 和 30*0.7 = 21 计算,它将包含值 V1 的 30% 和值 V2 的 70%。这就是我对您的问题的理解,如果我错了,请纠正我。