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;
    }