我试图用我在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)
}
QueenString
是bitstring
,其形式如下:
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 *
感谢任何可以提供帮助的人。