8皇后健身功能

时间:2014-10-22 21:00:22

标签: r n-queens

我试图用我在C#中找到的方法编写R中8个Queens的适应度函数。这就是我到目前为止在R中所拥有的:

getFitness <- function(QueenString) {
    Translation <- Translate(QueenString)
    Collisions <- 0
    for (i in 1:length(Translation)) { # Iterate through all bits in the gene
        x <- i
        y <- Translation[i] # grab the ith bit
        j <- i + 1
        while (j < length(Translation)) {
            if (abs(j-x) == abs(Translation[j]-y))
                Collisions <- Collisions + 1
            j <- j + 1
        }
        j <- 0
    }
    return(Collisions)
}

QueenStringbitstring,其形式如下:

c(1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0)

Translate函数将上述bitString转换为以下bitstring

c(5, 2, 7, 7, 8, 2, 8)

基本上,我们正在使用上面的Translate字符串;不是QueenString函数的fitness。我试图改编的C#代码如下:

public void CalcFitness()
{
    int collisions = 0;
        for (int i = 0; i < genes.Length - 1; i++)
        {
            int x = i;
            int y = genes[i];
            for (int j = i + 1; j < genes.Length; j++)
            {
                if (Math.Abs(j - x) == Math.Abs(genes[j] - y))
                    collisions++;                        
            }
        }
}

根据我的代码,我会得到3个碰撞次数;但这远低于实际的碰撞次数。打印输出示例如下所示:

* * * * Q * * * 
* Q * * * * * * 
* * * * * * Q * 
* * * * * * Q * 
* * * * * * * Q 
* Q * * * * * * 
* * * * * * * Q 
* * * * * * Q *

感谢任何可以提供帮助的人。

0 个答案:

没有答案