2016-08-04 51 views
1

我想爲我的遺傳算法編寫一個健身功能。我有三個特徵(F1,F2,F3 - 都是數字變量),這些特徵被考慮用於對染色體進行評分。如果他們都同樣重要,我可以寫出這樣的等式: formula健身功能 - 如果一個染色體功能的值遠高於其他功能,該怎麼辦

如果它們的重要性會不同,我可以乘以不同的常量。 如果所有三個特徵的值都具有相同的間隔,它將全部有效。 但是如果F1和F2的值可以是(0,10)和F3(例如0,49)? 我怎麼能大概縮放呢?或者我應該採取不同的方式?

+0

量表所有值到[0..1](這裏如果希望按比例線性或指數等你考慮到)與乘以'權重'併除以權重的總和。例如:(F1 * 4 + F2 * 1 + F3 * 2)/(4 + 1 + 2) - > [0..1] –

+0

但是權重是恆定的。所以如果F1 = 1,F2 = 1,F3 = 30,所有特徵都是重要的。如果我們將使用相同的權重F1 = 1,F2 = 1,F3 = 1,那麼F3將不成比例地不那麼重要。 (或者我的答案是否有問題?) – Thamiar

+0

如果F1 = 1,F2 = 1,F3 = 30,那麼F3比F1(1)和F2(1)更重要(30)。如果您將每個F賦予相同的權重,則如果任何F按特定量更改,則最終結果將相同。如果您將F3的權重設置得高出其他權重,則F3改變時結果將發生更大的變化。 *編輯:*你在混合規模和重量?因爲你需要在**之前對這些值進行縮放**,所以你加權。 –

回答

1
  1. 量表所有的值[0..1]
  2. 分配給每個值
  3. 乘以每個換算值與它的重量
  4. 將第3步的所有值的所有總和的總和的重量/重要性權重

我不知道你正在使用的語言,所以這裏是一些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);