예제 #1
0
    public static void InstantiateSaveObject(SaveObject s)
    {
        foreach (GameObject obj in GameObject.FindGameObjectsWithTag("food"))
        {
            GameObject.Destroy(obj);
        }
        var    fs            = GameObject.FindGameObjectsWithTag("foodspawner");
        double totalfoodRate = 0;

        for (int i = 0; i < fs.Length; i++)
        {
            totalfoodRate += fs[i].GetComponent <FoodSpawn>().foodRate;
        }

        for (int i = 0; i < fs.Length; i++)
        {
            fs[i].GetComponent <FoodSpawn>().foodCount = 0;

            while (fs[i].GetComponent <FoodSpawn>().foodCount < s.foodSpawned * (fs[i].GetComponent <FoodSpawn>().foodRate / totalfoodRate) && fs[i].GetComponent <FoodSpawn>().foodCount < fs[i].GetComponent <FoodSpawn>().MAX_FOOD)
            {
                fs[i].GetComponent <FoodSpawn>().SpawnFood();
            }
        }
        foreach (SaveOrganism data in s.organisms)
        {
            Organism org = OrganismSpawn.SpawnOrganism(data.chromosome, new Vector3(data.x, data.y), data.initialEnergy);
            if (org != null)
            {
                //    org.fullyGrow = true;
            }
        }
    }
    void Spawn()
    {
        GenesManager.mutationRate       = _mutationRate;
        GenesManager.neuralMutationRate = _neuralMutationRate;
        GameObject[] organisms = GameObject.FindGameObjectsWithTag("organism");

        _organismNumber = organisms.Length;
        OrganismSpawn.organismNumber = organisms.Length;
        if (organisms.Length < STOP_SPAWNING_AT)
        {
            float      x = (float)((r.NextDouble() * 0.8 + 0.1) * (Convert.ToDouble(Hyperparameters.MAP_SIZE)));
            float      y = (float)((r.NextDouble() * 0.8 + 0.1) * (Convert.ToDouble(Hyperparameters.MAP_SIZE))); //PROBLEMA DI SPAWN SUI BORDI??
            Chromosome chromosome;
            //    if (organisms.Length == 0)
            //     {
            chromosome = MakeChromosome();
            //       }
            //       else
            //       {

            //       chromosome = organisms[r.Next(organisms.Length)].GetComponent<Organism>().chromosome;

            //        }
            OrganismSpawn.SpawnOrganism(chromosome, new Vector3(x, y), OrganismSetter.BodyEnergy(chromosome) * 3 / 2);
        }
    }
    void Start()
    {
        OrganismSpawn.organismSpawner = this;

        ModifyBodyEnergy();

        InvokeRepeating("Spawn", 2f, 2f);
    }
예제 #4
0
 // Update is called once per frame
 void Update()
 {
     if (Input.GetMouseButtonDown(2))
     {
         Chromosome chromosome = new Chromosome(MakeGenes(), MakeNeuralChromosome(), new ChromosomeParameters.ChromosomeParametersBuilder().SetAltruismEnergy(0.5).Build());
         OrganismSpawn.SpawnOrganism(chromosome, Camera.main.ScreenToWorldPoint(Input.mousePosition), OrganismSetter.BodyEnergy(chromosome) * 3 / 2);
     }
 }
예제 #5
0
    public static void InstantiateRandomOrganism(SaveObject s)
    {
        SaveOrganism so = s.organisms[r.Next(s.organisms.Length)];

        Organism org = OrganismSpawn.SpawnOrganism(so.chromosome, new Vector3(so.x, so.y), so.initialEnergy);

        if (org != null)
        {
            org.fullyGrow = true;
        }
    }
예제 #6
0
    private void SexualReproduction(Organism mother)
    {
        int energyToReproduce    = (int)(bodyEnergy * chromosome.Parameters.EnergyToSonRatio * 2);
        int momEnergyToReproduce = (int)(mother.bodyEnergy * mother.chromosome.Parameters.EnergyToSonRatio * 2);

        if (organismEnergy.Value > (1 + chromosome.Parameters.ExcessEnergyToReproduce) * energyToReproduce &&
            mother.organismEnergy.Value > (1 + mother.chromosome.Parameters.ExcessEnergyToReproduce) * momEnergyToReproduce &&
            sexualReproductionNeuron.Value >= 0.5 &&
            mother.sexualReproductionNeuron.Value >= 0.5)
        {
            Chromosome newChromosome = GenesManager.CreateNewGenesForReproduction(this.chromosome, mother.chromosome);

            int totalEnergy = energyToReproduce + momEnergyToReproduce;
            OrganismSpawn.SpawnOrganism(newChromosome, ComputeChildPosition(), totalEnergy);

            organismEnergy.Value        -= energyToReproduce;
            mother.organismEnergy.Value -= momEnergyToReproduce;
        }
    }
예제 #7
0
    public void Mitosis()
    {
        if (!Hyperparameters.ALLOW_MITOSIS)
        {
            return;
        }

        int energyToReproduce = (int)(bodyEnergy * chromosome.Parameters.EnergyToSonRatio * 4);


        if (organismEnergy.Value > energyToReproduce * (1 + chromosome.Parameters.ExcessEnergyToReproduce) && mitosisNeuron.Value >= 0.5)
        {
            Chromosome newChromosome = GenesManager.CreateNewGenesForReproduction(this.chromosome);

            OrganismSpawn.SpawnOrganism(newChromosome, ComputeChildPosition(), energyToReproduce);

            organismEnergy.Value -= energyToReproduce;
        }
    }