C# 如何从二元染色体中提取多个参数
我正在尝试使用Genetics库创建一个简单的应用程序,用于优化目的。我有一个场景,其中我有四个输入参数,因此我尝试修改项目中的“”类以处理四个参数。 在将二元染色体转换为4个参数(type=double)时,我不确定我的方法是否正确,因为我不知道如何验证提取的值。以下是我的代码不同于原始AForge代码的代码段:C# 如何从二元染色体中提取多个参数,c#,.net,aforge,genetic-programming,C#,.net,Aforge,Genetic Programming,我正在尝试使用Genetics库创建一个简单的应用程序,用于优化目的。我有一个场景,其中我有四个输入参数,因此我尝试修改项目中的“”类以处理四个参数。 在将二元染色体转换为4个参数(type=double)时,我不确定我的方法是否正确,因为我不知道如何验证提取的值。以下是我的代码不同于原始AForge代码的代码段: public double[] Translate( IChromosome chromosome ) { // get chromosome's value
public double[] Translate( IChromosome chromosome )
{
// get chromosome's value
ulong val = ((BinaryChromosome) chromosome).Value;
// chromosome's length
int length = ((BinaryChromosome) chromosome).Length;
// length of W component
int wLength = length/4;
// length of X component
int xLength = length / 4;
// length of Y component
int yLength = length / 4;
// length of Z component
int zLength = length / 4;
// W maximum value - equal to X mask
ulong wMax = 0xFFFFFFFFFFFFFFFF >> (64 - wLength);
// X maximum value
ulong xMax = 0xFFFFFFFFFFFFFFFF >> (64 - xLength);
// Y maximum value - equal to X mask
ulong yMax = 0xFFFFFFFFFFFFFFFF >> (64 - yLength);
// Z maximum value
ulong zMax = 0xFFFFFFFFFFFFFFFF >> (64 - zLength);
// W component
double wPart = val & wMax;
// X component;
double xPart = (val >> wLength) & xMax;
// Y component;
double yPart = (val >> (wLength + xLength) & yMax);
// Z component;
double zPart = val >> (wLength + xLength + yLength);
// translate to optimization's function space
double[] ret = new double[4];
ret[0] = wPart * _rangeW.Length / wMax + _rangeW.Min;
ret[1] = xPart * _rangeX.Length / xMax + _rangeX.Min;
ret[2] = yPart * _rangeY.Length / yMax + _rangeY.Min;
ret[3] = zPart * _rangeZ.Length / zMax + _rangeZ.Min;
return ret;
}
我不确定我是否正确地将染色体值分为四部分(wPart/xPart/yPart/zPart)。AForge.Genetic库中的原始函数如下所示:
public double[] Translate( IChromosome chromosome )
{
// get chromosome's value
ulong val = ( (BinaryChromosome) chromosome ).Value;
// chromosome's length
int length = ( (BinaryChromosome) chromosome ).Length;
// length of X component
int xLength = length / 2;
// length of Y component
int yLength = length - xLength;
// X maximum value - equal to X mask
ulong xMax = 0xFFFFFFFFFFFFFFFF >> ( 64 - xLength );
// Y maximum value
ulong yMax = 0xFFFFFFFFFFFFFFFF >> ( 64 - yLength );
// X component
double xPart = val & xMax;
// Y component;
double yPart = val >> xLength;
// translate to optimization's function space
double[] ret = new double[2];
ret[0] = xPart * rangeX.Length / xMax + rangeX.Min;
ret[1] = yPart * rangeY.Length / yMax + rangeY.Min;
return ret;
}
有人能确认我的转换过程是否正确,或者有更好的方法吗。没有,它可以工作,但你不需要这么复杂
ulong wMax = 0xFFFFFFFFFFFFFFFF >> (64 - wLength);
这将向所有结果返回相同的值wMax xMax yMax zMax
,因此只需执行一个操作并将其称为componentMask
part = (val >> (wLength * pos) & componentMask);
其中,pos是组件的基于0的位置。所以0代表w,1代表x
剩下的没问题
编辑:
如果长度不除以4,则可以将最后一部分设为val>>(wLength*pos),使其具有剩余的位