private void learnNN(NeuronNet pNN, List <double> inputs, List <double> expected) { pNN.Update(inputs); var outputs = pNN.Outputs; Debug.Assert(outputs.Count == expected.Count); double tempFitness = pNN.Fitness; for (int ipOutput = 0; ipOutput < outputs.Count; ipOutput++) { tempFitness += calculateFitness(outputs[ipOutput], expected[ipOutput]); } pNN.Fitness = tempFitness; }
//同一时间内屏幕中只有3个子弹 Action GetActionFromNetWork(List <Bullet> bullets, Vector3 gunPos) { List <float> netInputs = new List <float>(); List <float> outputs; Action action = Action.Drift; float toTurretX = gunPos.x - pos.x; float toTurretY = gunPos.y - pos.y; netInputs.Add(toTurretX); netInputs.Add(toTurretY); for (int i = 0; i < bullets.Count; i++) { if (bullets[i].Active) { float xComp = bullets[i].Pos.x - pos.x; float yComp = bullets[i].Pos.y - pos.y; netInputs.Add(xComp); netInputs.Add(yComp); } else { //子弹未则输入一个指向Turret的向量 netInputs.Add(toTurretX); netInputs.Add(toTurretY); } } outputs = brain.Update(netInputs); float bestSoFar = 0; for (int i = 0; i < outputs.Count; i++) { if (outputs[i] > bestSoFar && outputs[i] > 0.9f) { bestSoFar = outputs[i]; action = (Action)i; } } return(action); }