2016-08-04 2 views
1

J'essaie d'écrire une fonction de condition physique pour mon algorithme génétique. J'ai trois caractéristiques (F1, F2, F3 - Toutes sont des variables numériques), qui sont prises en compte pour évaluer le chromosome. Si tous sont d'importance égale je peux écrire une telle équation: formulaFonction de remise en forme - Que faire, si la valeur d'une des caractéristiques du chromosome est beaucoup plus élevée que les autres

Si leur importance serait différente, je peux multiplier les caractéristiques par différentes constantes. Tout fonctionnera si les valeurs des trois entités ont le même intervalle. Mais que se passerait-il si F1 et F2 pouvaient avoir une valeur de (0,10) et F3 par exemple (0,49)? Comment pourrais-je le mettre à l'échelle approximativement? Ou devrais-je l'aborder différemment?

+0

échelle toutes les valeurs à [0..1] (ici vous prenez en compte si vous le souhaitez à l'échelle linéaire ou exponentielle, etc.) se multiplier avec un ' poids »et diviser par la somme des poids. E.g: '(F1 * 4 + F2 * 1 + F3 * 2)/(4 + 1 + 2)' -> [0..1] –

+0

Mais les poids sont constants. Donc, si F1 = 1, F2 = 1, F3 = 30, avec des poids appropriés, toutes les caractéristiques seraient importantes. Si nous utilisons les mêmes poids pour F1 = 1, F2 = 1, F3 = 1 alors F3 serait disproportionnellement moins important. (Ou est-ce que je reçois quelque chose de mal avec votre réponse?) – Thamiar

+0

Si F1 = 1, F2 = 1, F3 = 30, alors F3 est beaucoup plus important (30) que F1 (1) et F2 (1). Si vous attribuez à chaque F le même poids, le résultat final sera le même si tout F change d'un montant spécifique. Si vous attribuez à F3 un poids beaucoup plus élevé que les autres, le résultat changera beaucoup plus si F3 change. * edit: * Mélangez-vous l'échelle et le poids? Parce que vous devez mettre à l'échelle ces valeurs ** avant ** vous les pesez. –

Répondre

1
  1. échelle toutes vos valeurs à [0..1]
  2. Attribuer un poids/importance à chaque valeur
  3. Multiplier chaque valeur à l'échelle avec son poids
  4. Diviser la somme de toutes les valeurs de l'étape 3 par la somme de tous poids

Je ne sais pas quelle langue que vous utilisez, voici donc un code C#:

classe d'entités

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

Exemple de calcul

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