我正在开发一个C#Windows表单程序,我正在进行遗传算法基础知识的练习。我试图做的不是按预期工作如下:
我的代码初始化了两个锯齿状数组和一个普通数组。锯齿状数组各有20个项目,普通数组有8个。普通数组存储个体的基因组,锯齿状population
数组存储这些individual
数组的数组。
当我调用generate_population()
时,它应该使用正确的长度初始化锯齿状数组中的每个数组,然后使用for循环填充所述数组并返回create_indiv()
(该函数返回一个8项individual
数组),然后通过访问填充数组的i索引并打印该值,将数组打印到列表框。
这一切都运行正常,它成功生成一组唯一的individual
,并通过访问和打印填充数组中的特定索引来打印这些个体。
问题是,如果我运行generate_population()
函数一次,然后尝试在另一个函数中使用population
数组,它会显示每个索引值包含相同的individual
- 最后一个在数组中生成。
示例:
在generate_population()
内生成后,population[][]
显示自己被这些数组填充:
如果我尝试迭代并在另一个函数中打印population[][]
的所有值,在我调用generate_population()
之后,我得到了这个:
有没有人发现问题?这段代码并不代表完整的程序,只有我认为我将问题隔离到的部分。我90%确定问题发生在generate_population()
,但我可能错了。
如有必要,我可以发布完整的程序。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
int count = 0;
int count2 = 0;
int[] individual = new int[8];
int[][] population = new int[20][];
int[][] workingpop = new int[20][];
Random seed = new Random();
public Form1()
{
InitializeComponent();
}
public int[] create_indv()
{
for (int i = 0; i <= 7; i++)
{
individual[i] = seed.Next(0, 10);
}
return individual;
}
public string genomestr(int[] indiv)
{
StringBuilder builder = new StringBuilder();
foreach (int value in indiv)
{
builder.Append(value);
}
string fin = builder.ToString();
return fin;
}
public int[][] generate_population(int number)
{
for (int i = 0;i < number; i++)
{
population[i] = new int[8];
workingpop[i] = new int[8];
}
for (int i = 0; i < number; i++)
{
population[i] = create_indv();
workingpop[i] = population[i];
int l = i + 1;
this.popchart.Items.Add("Creature #" + l + ": " + genomestr(population[i]));
}
return population;
}
private void pop_Click(object sender, EventArgs e)
{
popchart.Items.Clear();
generate_population(20);
}
}
}
答案 0 :(得分:0)
将此行放在方法create_indv()中:
int[] individual = new int[8];
你一直覆盖“个人”。
population[i]
指向相同的“个人”