适应度函数 - 如果一个染色体特征的值比其他特征高得多,该怎么办

Fitness Function - What to do, if value of one Chromosome features is much higher than other ones

我正在尝试为我的遗传算法编写适应度函数。我有三个特征(F1、F2、F3 - 都是数字变量),在对染色体进行评级时会考虑这些特征。如果所有这些都同等重要,我可以写出这样的等式: formula

如果它们的重要性不同,我可以将特征乘以不同的常数。 如果所有三个特征的值具有相同的间隔,这一切都会起作用。 但是,如果 F1 和 F2 的值可能来自 (0,10) 和 F3,例如 (0,49) 呢? 我怎样才能大致缩放它?或者我应该以不同的方式处理它?

  1. 将所有值缩放到 [0..1]
  2. 为每个值分配权重/重要性
  3. 将每个缩放值与其权重相乘
  4. 将第 3 步中所有值的总和除以所有权重的总和

我不知道你使用的是哪种语言,所以这里是一些 C# 代码:

特征Class

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);