为什么切换位后双倍是 NaN



我正在编写一种遗传算法,用于查找给定 X、Y 点的系数。本页描述了工作原理 - https://towardsdatascience.com/introduction-to-genetic-algorithms-including-example-code-e396e98d8bf3

我有问题,因为有时在突变或交叉后,我的双值是 NaN。

我尝试使用 byte[] 和 BitArray 执行此操作,但在这两种方法中我都有相同的结果。

转换双<>位数组:

public void ConvertByteArrayToCoefficients(BitArray array)
{
    Coefficients.Clear(); //Coefficients are stored in List<double>
    for (int i = 0; i < _degree + 1; i++)
    {
        var arr = array.ToByteArray();
        double value = BitConverter.ToDouble(array.ToByteArray(), i * sizeof(double));
        Coefficients.Add(value);
    }
}
public BitArray GetAllCoefficientsInBytes()
{
    BitArray bytes = new BitArray(0);
    for (int i = 0; i < Coefficients.Count; i++) //append is extension method
        bytes = bytes.Append(new BitArray(BitConverter.GetBytes(Coefficients[i])));
    return bytes;
}

突变:

public void Mutate(int percentageChance)
{
    BitArray bytes = GetAllCoefficientsInBytes();
    for (int i = 0; i < bytes.Length; i++)
    {
        if (_randomProvider.Next(0, 100) < percentageChance)
        {
            if (bytes.Get(i))
                bytes[i] = false;
            else
                bytes[i] = true;
         }
    }
    ConvertByteArrayToCoefficients(bytes);
}

交叉 - 每两个多项式调用的方法:

private void CrossoverSingle(Polynomial poly1, Polynomial poly2)
{
    int cutPosition = _randomProvider.Next(1, (_degreeOfPolynomial + 1) * sizeof(double) * 8);
    BitArray bytesOne = poly1.GetAllCoefficientsInBytes();
    BitArray bytesTwo = poly2.GetAllCoefficientsInBytes();
    for (int i = bytesOne.Length-1; i >= cutPosition; i--)
    {
        bool bitOne = bytesOne[i];
        bool bitTwo = bytesTwo[i];
        if (bitOne != bitTwo)
        {
            bytesOne[i] = bitTwo;
            bytesTwo[i] = bitOne;
        }
    }
    _crossoveredChildren.Add(new Polynomial(_randomProvider, _degreeOfPolynomial, bytesOne));
    _crossoveredChildren.Add(new Polynomial(_randomProvider, _degreeOfPolynomial, bytesTwo));
}

所有代码都在 github 上:https://github.com/Makulak/CoefficientsFinder也许你知道为什么会发生这种情况?

这是因为您使用随机字节来生成 IEEE-754 数字。您不应该这样做,因为 IEEE-754 定义了这些数字的结构,并且使用随机字节输入不会为您提供随机数,因为某些位表示is Not-a-Number字段之类的东西,而 NaN 值是"病毒式"的,并使其他计算无效。

要生成随机Double数,您应该使用 System.Random.NextDouble() .

相关内容

  • 没有找到相关文章

最新更新