/*
     * CrossOver: tras el éxito de la reproducción, se instanciarán nuevos agentes que
     * utilizarán los ADNs de los padres para crear el suyo propio.
     */
    public void Crossover(BaseAgent otherParent)
    {
        //Debug.Log("Me he reproducido");
        List <float> newDna = new List <float>();
        float        stat;

        for (int i = 0; i < dna.Count; i++)
        {
            stat = Random.value < 0.5 ? dna[i] : otherParent.dna[i];
            newDna.Add(stat);
        }
        Roe roe = Instantiate(hijoPrefab, transform.position, Quaternion.identity).GetComponent <Roe>();

        roe.Init(newDna, perfectDna, worstDna);

        roe.Mutate();
    }
Пример #2
0
    /*
     * StartSimulation: método encargado de guardar los listas de los mejores y peores ADNs
     * y de instanciar a los agentes.
     */
    public void StartSimulation()
    {
        //Peces perfect y worst
        List <float> perfectFishDna = new List <float>();

        perfectFishDna.Add(maxFishVel);
        perfectFishDna.Add(maxFishAcceleration);
        perfectFishDna.Add(maxFishPhys);
        perfectFishDna.Add(maxFishOffspring);
        perfectFishDna.Add(maxFishEggLayingTime);
        perfectFishDna.Add(maxFishGrowingTime);
        perfectFishDna.Add(maxFishHatchingTime);
        perfectFishDna.Add(maxFishNutritionalValue);
        perfectFishDna.Add(maxFishLifespan);
        perfectFishDna.Add(maxFishPossibilityOfSuccess);
        perfectFishDna.Add(minFishMutationRate);

        List <float> worstFishDna = new List <float>();

        worstFishDna.Add(minFishVel);
        worstFishDna.Add(minFishAcceleration);
        worstFishDna.Add(minFishPhys);
        worstFishDna.Add(minFishOffspring);
        worstFishDna.Add(minFishEggLayingTime);
        worstFishDna.Add(minFishGrowingTime);
        worstFishDna.Add(minFishHatchingTime);
        worstFishDna.Add(minFishNutritionalValue);
        worstFishDna.Add(minFishLifespan);
        worstFishDna.Add(minFishPossibilityOfSuccess);
        worstFishDna.Add(maxFishMutationRate);

        //Ranas perfect y worst
        List <float> perfectFrogDna = new List <float>();

        perfectFrogDna.Add(maxFrogVel);
        perfectFrogDna.Add(maxFrogAcceleration);
        perfectFrogDna.Add(maxFrogPhys);
        perfectFrogDna.Add(maxFrogOffspring);
        perfectFrogDna.Add(maxFrogEggLayingTime);
        perfectFrogDna.Add(maxFrogGrowingTime);
        perfectFrogDna.Add(maxFrogHatchingTime);
        perfectFrogDna.Add(maxFrogNutritionalValue);
        perfectFrogDna.Add(maxFrogLifespan);
        perfectFrogDna.Add(maxFrogPossibilityOfSuccess);
        perfectFrogDna.Add(minFrogMutationRate);

        List <float> worstFrogDna = new List <float>();

        worstFrogDna.Add(minFrogVel);
        worstFrogDna.Add(minFrogAcceleration);
        worstFrogDna.Add(minFrogPhys);
        worstFrogDna.Add(minFrogOffspring);
        worstFrogDna.Add(minFrogEggLayingTime);
        worstFrogDna.Add(minFrogGrowingTime);
        worstFrogDna.Add(minFrogHatchingTime);
        worstFrogDna.Add(minFrogNutritionalValue);
        worstFrogDna.Add(minFrogLifespan);
        worstFrogDna.Add(minFrogPossibilityOfSuccess);
        worstFrogDna.Add(maxFrogMutationRate);

        //Peces perfect y worst
        perfectFlyDna = new List <float>();
        perfectFlyDna.Add(maxFlyVel);
        perfectFlyDna.Add(maxFlyAcceleration);
        perfectFlyDna.Add(maxFlyPhys);
        perfectFlyDna.Add(maxFlyOffspring);
        perfectFlyDna.Add(maxFlyEggLayingTime);
        perfectFlyDna.Add(maxFlyGrowingTime);
        perfectFlyDna.Add(maxFlyHatchingTime);
        perfectFlyDna.Add(maxFlyNutritionalValue);
        perfectFlyDna.Add(maxFlyLifespan);
        perfectFlyDna.Add(maxFlyPossibilityOfSuccess);
        perfectFlyDna.Add(minFlyMutationRate);

        worstFlyDna = new List <float>();
        worstFlyDna.Add(minFlyVel);
        worstFlyDna.Add(minFlyAcceleration);
        worstFlyDna.Add(minFlyPhys);
        worstFlyDna.Add(minFlyOffspring);
        worstFlyDna.Add(minFlyEggLayingTime);
        worstFlyDna.Add(minFlyGrowingTime);
        worstFlyDna.Add(minFlyHatchingTime);
        worstFlyDna.Add(minFlyNutritionalValue);
        worstFlyDna.Add(minFlyLifespan);
        worstFlyDna.Add(minFlyPossibilityOfSuccess);
        worstFlyDna.Add(maxFlyMutationRate);

        Vector3 randomPos;
        //Instanciador de huevos de pez
        List <float> fishRoeDna;

        for (int i = 0; i < numeroHuevosPez; i++)
        {
            fishRoeDna = new List <float>();
            fishRoeDna.Add(Random.Range(minFishVel, maxFishVel));
            fishRoeDna.Add(Random.Range(minFishAcceleration, maxFishAcceleration));
            fishRoeDna.Add(Random.Range(minFishPhys, maxFishPhys));
            fishRoeDna.Add(Random.Range(minFishOffspring, maxFishOffspring));
            fishRoeDna.Add(Random.Range(minFishEggLayingTime, maxFishEggLayingTime));
            fishRoeDna.Add(Random.Range(minFishGrowingTime, maxFishGrowingTime));
            fishRoeDna.Add(Random.Range(minFishHatchingTime, maxFishHatchingTime));
            fishRoeDna.Add(Random.Range(minFishNutritionalValue, maxFishNutritionalValue));
            fishRoeDna.Add(Random.Range(minFishLifespan, maxFishLifespan));
            fishRoeDna.Add(Random.Range(minFishPossibilityOfSuccess, maxFishPossibilityOfSuccess));
            fishRoeDna.Add(Random.Range(minFishMutationRate, maxFishMutationRate));
            randomPos   = Random.insideUnitSphere * 10;
            randomPos.z = 0;
            Roe roeFish = Instantiate(huevoPezPrefab, transform.position + randomPos, Quaternion.identity).GetComponent <Roe>();

            roeFish.Init(fishRoeDna, perfectFishDna, worstFishDna);
        }

        //Instanciador de huevos de rana
        List <float> frogRoeDna;

        for (int i = 0; i < numeroHuevosRana; i++)
        {
            frogRoeDna = new List <float>();
            frogRoeDna.Add(Random.Range(minFrogVel, maxFrogVel));
            frogRoeDna.Add(Random.Range(minFrogAcceleration, maxFrogAcceleration));
            frogRoeDna.Add(Random.Range(minFrogPhys, maxFrogPhys));
            frogRoeDna.Add(Random.Range(minFrogOffspring, maxFrogOffspring));
            frogRoeDna.Add(Random.Range(minFrogEggLayingTime, maxFrogEggLayingTime));
            frogRoeDna.Add(Random.Range(minFrogGrowingTime, maxFrogGrowingTime));
            frogRoeDna.Add(Random.Range(minFrogHatchingTime, maxFrogHatchingTime));
            frogRoeDna.Add(Random.Range(minFrogNutritionalValue, maxFrogNutritionalValue));
            frogRoeDna.Add(Random.Range(minFrogLifespan, maxFrogLifespan));
            frogRoeDna.Add(Random.Range(minFrogPossibilityOfSuccess, maxFrogPossibilityOfSuccess));
            frogRoeDna.Add(Random.Range(minFrogMutationRate, maxFrogMutationRate));

            randomPos   = Random.insideUnitSphere * 10;
            randomPos.z = 0;
            Roe roeFrog = Instantiate(huevoRanaPrefab, transform.position + randomPos, Quaternion.identity).GetComponent <Roe>();

            roeFrog.Init(frogRoeDna, perfectFrogDna, worstFrogDna);
        }

        for (int i = 0; i < numeroPlantas; i++)
        {
            randomPos   = Random.insideUnitSphere * 18;
            randomPos.z = 0;
            Instantiate(plantaPrefab, transform.position + randomPos, Quaternion.identity);
        }

        bool freeSpace;

        for (int i = 0; i < numeroRocas; i++)
        {
            freeSpace = false;
            randomPos = Vector3.zero;
            while (!freeSpace)
            {
                randomPos   = Random.insideUnitSphere * 18;
                randomPos.z = 0;
                if (!Physics.CheckSphere(randomPos, 1.04f, noRockLayer))
                {
                    freeSpace = true;
                }
            }
            Instantiate(rocaPrefab, transform.position + randomPos, Quaternion.identity);
        }

        for (int i = 0; i < numeroMoscas; i++)
        {
            SpawnFly();
        }
        StartCoroutine(FlySpawn());
    }