遗传算法中的数组操作实现问题求助
遗传算法数组操作问题解决
问题1:数组赋值编译错误与输出异常
编译错误解决
你代码里的children是int[][]类型(二维数组,每个元素是一维int数组),而combined[j]是单个整数,直接赋值children[j] = combined[j]肯定会报错。正确的做法是把整个combined数组赋值给children的对应行:
children[i] = combined;
输出异常解决
打印children时直接写children[i],会输出数组对象的默认字符串(也就是System.Int32[]),必须遍历数组的每个元素才能打印实际值:
Console.WriteLine("Children:"); for (int i = 0; i < P; i++) { for (int j = 0; j < P; j++) { Console.Write(" " + children[i][j]); } Console.WriteLine(); // 每行结束换行,更易读 }
问题2:双父代交叉生成子代的实现
遗传算法的交叉操作(以常用的单点交叉为例)需要选取两个父代,随机确定交叉点,将两个父代的片段拼接生成两个子代。具体实现如下:
- 遍历种群,每次选取两个父代(步长设为2,成对处理)
- 随机生成交叉点(范围1到P-1,避免全取单个父代的基因)
- 分别拼接两个父代的前后段,生成两个子代
- 将子代存入
children数组
替换你原来的交叉循环代码,修改后的交叉逻辑:
// 交叉操作:每两个父代生成两个子代 for (int i = 0; i < P; i += 2) { // 选取两个父代 int[] parent1 = population[i]; int[] parent2 = population[i + 1]; // 随机生成交叉点(至少保留1个元素) int splitPoint = random.Next(1, P); // 生成子代1:parent1前半段 + parent2后半段 int[] child1 = new int[P]; Array.Copy(parent1, 0, child1, 0, splitPoint); Array.Copy(parent2, splitPoint, child1, splitPoint, P - splitPoint); // 生成子代2:parent2前半段 + parent1后半段 int[] child2 = new int[P]; Array.Copy(parent2, 0, child2, 0, splitPoint); Array.Copy(parent1, splitPoint, child2, splitPoint, P - splitPoint); // 存入children数组 children[i] = child1; children[i + 1] = child2; }
完整修正后的代码
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][]; // 生成初始种群 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); } } // 计算适应度 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 += 2) { int[] parent1 = population[i]; int[] parent2 = population[i + 1]; int splitPoint = random.Next(1, P); int[] child1 = new int[P]; Array.Copy(parent1, 0, child1, 0, splitPoint); Array.Copy(parent2, splitPoint, child1, splitPoint, P - splitPoint); int[] child2 = new int[P]; Array.Copy(parent2, 0, child2, 0, splitPoint); Array.Copy(parent1, splitPoint, child2, splitPoint, P - splitPoint); children[i] = child1; children[i + 1] = child2; } // 打印初始种群与适应度 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][j]); } Console.WriteLine(); }
内容的提问来源于stack exchange,提问作者pkrzysiek
相关产品推荐
相关产品推荐

