private void ThreadShession() { functions_queued.Add(ResetCars); thread_wait.WaitOne(); thread_wait.Reset(); BaseTechnique training; switch (training_technique) { case Techniques.PSO: training = new PSO(car_networks); break; case Techniques.GA: training = new GA(car_networks); break; default: log.Add("ERROR: Unkown training technique..."); return; } while (!signal_session_stop) { log.Add("Reseting Cars"); //Update car positions functions_queued.Add(() => { for (int i = 0; i < current_cars.Length; i++) { car_body[i].velocity = Vector3.zero; car_body[i].angularVelocity = Vector3.zero; car_body[i].transform.position = spawner_position.transform.position; car_body[i].transform.rotation = spawner_position.transform.rotation; car_score_manager[i].ResetScore(); Debug.Log(i); } thread_wait.Set(); }); thread_wait.WaitOne(); thread_wait.Reset(); log.Add("Updating Weights"); //Update car weights & biases training.UpdateWeights(); //Start session to get car score for (int i = 0; i < agents_amount; i++) { car_intelligence[i].activate_car = true; car_score_manager[i].activate_car = true; car_intelligence[i].GetNetwork().SetWeightsData(car_networks[i].GetWeightsData()); } log.Add("Session Started"); thread_session_wait.Reset(); session_timer = session_length; thread_session_wait.WaitOne(); if (!signal_session_stop) { //Stop session for (int i = 0; i < agents_amount; i++) { car_intelligence[i].activate_car = false; car_score_manager[i].activate_car = false; car_networks[i].SetNetworkScore(car_intelligence[i].GetNetwork().GetNetworkScore()); } log.Add("Comparing Results"); //Compare all cars scores training.ComputeEpoch(); //Update log info best_score = training.GetBestScore(); best_weights = training.GetBestWeights(); current_epoch++; } } session_activated = false; }