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

时间:2016-08-04 12:18:17

标签: scalability genetic-algorithm

我正在尝试为我的遗传算法编写一个适应度函数。我有三个功能(F1,F2,F3 - 所有都是数字变量),它们被考虑用于评估染色体。如果所有这些都同样重要,我可以写下这样的等式: formula

如果它们的重要性不同,我可以用不同的常数乘以特征。 如果所有三个特征的值具有相同的间隔,它将全部起作用。 但是如果F1和F2可以有(0,10)和F3的值(例如(0,49))怎么办? 我怎么能大致缩放它?或者我应该采用不同的方法吗?

1 个答案:

答案 0 :(得分:1)

  1. 将所有值缩放到[0..1]
  2. 为每个值指定权重/重要性
  3. 将每个缩放值乘以其权重
  4. 将步骤3中所有值的总和除以所有权重的总和
  5. 我不知道你使用的是哪种语言,所以这里有一些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);