遗传算法中的数组运算

问题描述 投票:0回答:1

我一直在尝试实现简单的 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]);

    }
   


}

我已经尝试自己解决这个问题并查阅了互联网资源

c# arrays multidimensional-array genetic-algorithm
1个回答
0
投票

您将

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

© www.soinside.com 2019 - 2024. All rights reserved.