我正在尝试为我的遗传算法编写一个适应度函数。我有三个功能(F1,F2,F3 - 所有都是数字变量),它们被考虑用于评估染色体。如果所有这些都同样重要,我可以写下这样的等式:
如果它们的重要性不同,我可以用不同的常数乘以特征。 如果所有三个特征的值具有相同的间隔,它将全部起作用。 但是如果F1和F2可以有(0,10)和F3的值(例如(0,49))怎么办? 我怎么能大致缩放它?或者我应该采用不同的方法吗?
答案 0 :(得分:1)
[0..1]
我不知道你使用的是哪种语言,所以这里有一些C#代码:
public class Feature
{
public double Importance { get; set; }
public double Value { get; set; }
public double LowValue { get; set; }
public double HighValue { get; set; }
public double ScaledValue
{
get
{
// Make sure value is within bounds
double intermediate = Math.Max(Math.Min(LowValue, HighValue),
Math.Min(Math.Max(LowValue, HighValue), Value));
// Scale from 0 to 1 within defined bounds
double scaledValue = (intermediate - LowValue)/(HighValue - LowValue);
return scaledValue;
}
}
}
// low importance (1), values from [20..-10] (less is better)
var f1 = new Feature
{
Importance = 1,
Value = 0,
LowValue = 20,
HighValue = -10
};
// low importance (1), values from [0..10] (more is better)
var f2 = new Feature
{
Importance = 1,
Value = 1,
LowValue = 0,
HighValue = 10
};
// high importance (5), values from [0..49]
var f3 = new Feature
{
Importance = 5,
Value = 25,
LowValue = 0,
HighValue = 49
};
var features = new[] {f1, f2, f3};
var score = features.Sum(f => f.ScaledValue*f.Importance)/features.Sum(f => f.Importance);
Debug.WriteLine(score);