/// <summary>
        ///     Returns true if Profitability instances are equal
        /// </summary>
        /// <param name="other">Instance of Profitability to be compared</param>
        /// <returns>Boolean</returns>
        public bool Equals(Profitability other)
        {
            if (other is null)
            {
                return(false);
            }
            if (ReferenceEquals(this, other))
            {
                return(true);
            }

            return
                ((
                     Roe == other.Roe ||
                     Roe != null &&
                     Roe.Equals(other.Roe)
                     ) &&
                 (
                     Npm == other.Npm ||
                     Npm != null &&
                     Npm.Equals(other.Npm)
                 ) &&
                 (
                     Gpm == other.Gpm ||
                     Gpm != null &&
                     Gpm.Equals(other.Gpm)
                 ) &&
                 (
                     Np == other.Np ||
                     Np != null &&
                     Np.Equals(other.Np)
                 ) &&
                 (
                     Eps == other.Eps ||
                     Eps != null &&
                     Eps.Equals(other.Eps)
                 ) &&
                 (
                     Mbr == other.Mbr ||
                     Mbr != null &&
                     Mbr.Equals(other.Mbr)
                 ) &&
                 (
                     Ts == other.Ts ||
                     Ts != null &&
                     Ts.Equals(other.Ts)
                 ) &&
                 (
                     Cs == other.Cs ||
                     Cs != null &&
                     Cs.Equals(other.Cs)
                 ));
        }
    /*
     * 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();
    }
 /// <summary>
 ///     Gets the hash code
 /// </summary>
 /// <returns>Hash code</returns>
 public override int GetHashCode()
 {
     unchecked            // Overflow is fine, just wrap
     {
         int hashCode = 41;
         // Suitable nullity checks etc, of course :)
         if (Roe != null)
         {
             hashCode = hashCode * 59 + Roe.GetHashCode();
         }
         if (Npm != null)
         {
             hashCode = hashCode * 59 + Npm.GetHashCode();
         }
         if (Gpm != null)
         {
             hashCode = hashCode * 59 + Gpm.GetHashCode();
         }
         if (Np != null)
         {
             hashCode = hashCode * 59 + Np.GetHashCode();
         }
         if (Eps != null)
         {
             hashCode = hashCode * 59 + Eps.GetHashCode();
         }
         if (Mbr != null)
         {
             hashCode = hashCode * 59 + Mbr.GetHashCode();
         }
         if (Ts != null)
         {
             hashCode = hashCode * 59 + Ts.GetHashCode();
         }
         if (Cs != null)
         {
             hashCode = hashCode * 59 + Cs.GetHashCode();
         }
         return(hashCode);
     }
 }
Esempio n. 4
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());
    }