我目前正在尝试建立一个进化神经网络,为此,我首先给对象提供随机值。此操作首先生效,但经过几次迭代后,它们开始以非常奇怪的方式运行。有时,当新的迭代开始时,它们全部以相同的模式或以相同的速度移动。
我做了一些研究,从我看来,Random如果在很短的时间内使用,可以输出相同的数字,但是我不知道如何防止/解决这个问题。 我仅在一个线程中使用随机的一个全局实例,所以问题不存在。
private void Evolve()
{
var newNetObjects = new List<NeuralNetObject>(); // make a list for new objects we create replace old ones
var netObjects =
new List<NeuralNetObject>(NeuralNetObjectManager.NeuralNetObjects); //get all neuralnetobjects
if (netObjects.Count == 0) //just stop when the list is empty
return;
//the half we remove is the one with the lower fitness values
foreach (var netObject in netObjects) //go through all net objects and do crossover of weights
{
float[] newWeigths = (float[]) netObject.GetNet().Weights.Clone(); //get original weights
;
var randomNet = rnd.Next(netObjects.Count); //random number
float[] otherWeigths = (float[]) netObjects[randomNet].GetNet().Weights.Clone(); //get a random other net
for (int i = 0; i < newWeigths.Length; i++) //for each weight
{
if (rnd.Next(2) == 1)
{
newWeigths[i] = otherWeigths[i]; // 25% to get the weight of the other net
}
}
var newNet = new NeuralNet(netObject.GetNet())
{
Weights = (float[]) newWeigths.Clone()
}; // make a new neural net with the generated weigths
newNetObjects.Add(new NeuralNetObject(100, 300, "KISTE", newNet)
{
Speed = (float) (rnd.NextDouble() - 0.5f) * 2, Direction = (float) (rnd.NextDouble() - 0.5f) * 2
}); //add new object to list
}
}
所以我可能会丢失一些东西,但是我认为我编写的代码应该分配给每个实例
newNetObjects.Add(new NeuralNetObject(100, 300, "KISTE", newNet)
{
Speed = (float) (rnd.NextDouble() - 0.5f) * 2, Direction = (float) (rnd.NextDouble() - 0.5f) * 2
});
一个随机的速度和方向,但是正如我之前说的,经过几次迭代,它们都以相同的速度运动,有时甚至以相同的模式运动。 你知道我的问题是什么吗? 如果需要,我可以发布更多代码,但是我发布的内容经过简化,并且删除了一些内容,因此更易于阅读和理解。预先感谢!