我一直在尝试实现简单的 Gen. 算法,但我无法专注于将数组分成几部分并将其分配给新数组。 我的问题: 1.我不知道如何将行逐一分成几部分,然后将这些数组部分分配到其他矩阵的新(1)行中。
for (int i = 0; i < P; i++)
{
int split = random.Next(P);
int split2 = population[i].Length-split;
int[] firstHalf = new int[split];
int[] secondHalf = new int[split2];
Array.Copy(population[i], 0, firstHalf, 0, split);
Array.Copy(population[i], split, secondHalf, 0, split2);
int[] combined = new int[split + split2];
Array.Copy(firstHalf, combined, split);
Array.Copy(secondHalf, 0, combined, split, split2);
for(int j = 0;j <P; j++)
{
children[j]=combined[j];
}
}
我没有编译
children[j]=combined[j];
它说它无法将 int 转换为 int[],这让我感到惊讶,但这不是最大的问题,因为我知道这种方法没有意义,即使它这样做了,也根本不是最佳的。 即使没有这个和分配
children[i]=combined
它确实编译,但在子数组的迭代过程中,我得到 System.Int32[] 而不是实际值,但我也理解这一点,因为我将对象数组分配给children[i](我认为至少)。
问题是我想不出任何其他方法可以做到这一点。 2. 该算法包括拆分 2 行并将它们组合成 2 个子行。 1 个孩子由parent1 和parent2 的氏族组成。 这也让我对将其编码为某种嵌套循环感到困惑。 完整代码供参考:
int P = 10;
int fit = 0;
int[] fittness=new int[P];
Random random = new Random();
int[] ideal = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
int[][] children = new int[P][];
int[][] population= new int[P][];
//generating population
for (int i=0;i < P;i++)
{
population[i] = new int [P];
for (int j=0;j<P;j++)
{
population[i][j] = random.Next(2);
}
}
//fittness
for (int i = 0; i < P; i++)
{
for (int j = 0; j < P; j++)
{
if (population[i][j] == ideal[j])
fit++;
}
fittness[i] = fit;
fit = 0;
}
for (int i = 0; i < P; i++)
{
int split = random.Next(P);
int split2 = population[i].Length-split;
int[] firstHalf = new int[split];
int[] secondHalf = new int[split2];
Array.Copy(population[i], 0, firstHalf, 0, split);
Array.Copy(population[i], split, secondHalf, 0, split2);
int[] combined = new int[split + split2];
Array.Copy(firstHalf, combined, split);
Array.Copy(secondHalf, 0, combined, split, split2);
children[i] = combined;
}
for (int i = 0; i < P; i++)
{
for (int j = 0; j < P; j++)
{
Console.Write(" "+population[i][j]);
}
Console.WriteLine($" => {fittness[i]}");
}
Console.WriteLine("Children:");
for (int i = 0; i < P; i++)
{
for (int j = 0; j < P; j++)
{
Console.Write(" " + children[i]);
}
}
我已经尝试自己解决这个问题并查阅了互联网资源
您将
children
声明为 int[][] children
。因此,每个元素 children[i]
都是一个整数数组 int[]
,但您尝试为其分配一个来自 int
的 combined
元素,该元素在第一个代码片段中声明为 int[] combined
: children[j]=combined[j];
。
稍后你会做正确的作业:
children[i]=combined;
。
为什么你得到的是
System.Int32[]
而不是实际值。嗯,C# 不能直接打印数组。相反,它只是打印其类型名称。如果你想打印一个数组,你可以使用循环,或者将值连接到一个字符串中:
string s = String.Join(", ", children);
Console.WriteLine(s);
打印例如:
2, 3, 5, 7, 11, 13