适应度函数 - 如果一个染色体特征的值比其他特征高得多,该怎么办
Fitness Function - What to do, if value of one Chromosome features is much higher than other ones
我正在尝试为我的遗传算法编写适应度函数。我有三个特征(F1、F2、F3 - 都是数字变量),在对染色体进行评级时会考虑这些特征。如果所有这些都同等重要,我可以写出这样的等式:
%20%3D%20F_%7B1%7D%20%2B%20%20F_%7B2%7D%20%2B%20%20F_%7B3%7D)
如果它们的重要性不同,我可以将特征乘以不同的常数。
如果所有三个特征的值具有相同的间隔,这一切都会起作用。
但是,如果 F1 和 F2 的值可能来自 (0,10) 和 F3,例如 (0,49) 呢?
我怎样才能大致缩放它?或者我应该以不同的方式处理它?
- 将所有值缩放到
[0..1]
- 为每个值分配权重/重要性
- 将每个缩放值与其权重相乘
- 将第 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);
我正在尝试为我的遗传算法编写适应度函数。我有三个特征(F1、F2、F3 - 都是数字变量),在对染色体进行评级时会考虑这些特征。如果所有这些都同等重要,我可以写出这样的等式:
如果它们的重要性不同,我可以将特征乘以不同的常数。 如果所有三个特征的值具有相同的间隔,这一切都会起作用。 但是,如果 F1 和 F2 的值可能来自 (0,10) 和 F3,例如 (0,49) 呢? 我怎样才能大致缩放它?或者我应该以不同的方式处理它?
- 将所有值缩放到
[0..1]
- 为每个值分配权重/重要性
- 将每个缩放值与其权重相乘
- 将第 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);