public void InitializeFlock_ECS(int flockManagerN, float zPos, int flockLayer) //inicializar cena/flocks
    {
        for (int i = 0; i < startingCount; i++)                                    //para cada flock
        {
            int index = i + (flockManagerN) * startingCount;

            Vector2    flockPosition = UnityEngine.Random.insideUnitCircle * startingCount * agentDensity;     //posicao "aleatoria" dentro do range especificado para o novo flock
            Quaternion flockRotation = Quaternion.Euler(Vector3.forward * UnityEngine.Random.Range(0f, 360f)); //rotacao "aleatoria" para o novo flock (de 0 a 360)

            Translation newT = new Translation {
                Value = new float3(flockPosition.x, flockPosition.y, gameObject.transform.position.z + zPos)
            };
            entityManager.SetComponentData(flockAgents_ECS[index], newT); //setar a posicao
            Rotation newR = new Rotation {
                Value = flockRotation
            };
            entityManager.SetComponentData(flockAgents_ECS[index], newR); //setar a rotacao

            FlockWho newFW = new FlockWho {
                flockValue = i, flockManagerValue = flockManagerN, flockLayerValue = flockLayer, flockCollisionCount = 0, objectCollisionCount = 0
            };
            entityManager.AddComponentData(flockAgents_ECS[index], newFW); //setar a numeracao do flock e do respectivo manager

            //newFlockAgent.flockManager = this; //ajustar quem criou o flock
            flockAgents_ECS_T[index]  = newT; //setar arrays auxiliares
            flockAgents_ECS_R[index]  = newR;
            flockAgents_ECS_FW[index] = newFW;
        }
    }
    public void RestartFlocks()
    {
        for (int i = 0; i < qtdFlocksInFlock; i++)                                                             //para cada flock
        {
            Vector2    flockPosition = UnityEngine.Random.insideUnitCircle * startingCount * agentDensity;     //posicao "aleatoria" dentro do range especificado para o novo flock
            Quaternion flockRotation = Quaternion.Euler(Vector3.forward * UnityEngine.Random.Range(0f, 360f)); //rotacao "aleatoria" para o novo flock (de 0 a 360)

            Translation newT = new Translation {
                Value = new float3(flockPosition.x, flockPosition.y, flockAgents_ECS_T[i].Value.z)
            };
            entityManager.SetComponentData(flockAgents_ECS[i], newT); //setar a posicao
            Rotation newR = new Rotation {
                Value = flockRotation
            };
            entityManager.SetComponentData(flockAgents_ECS[i], newR); //setar a rotacao

            FlockWho newFW = new FlockWho {
                flockValue = flockAgents_ECS_FW[i].flockValue, flockManagerValue = flockAgents_ECS_FW[i].flockManagerValue, flockLayerValue = flockAgents_ECS_FW[i].flockLayerValue, flockCollisionCount = 0, objectCollisionCount = 0
            };
            entityManager.SetComponentData(flockAgents_ECS[i], newFW); //setar a numeracao do flock e do respectivo manager

            //newFlockAgent.flockManager = this; //ajustar quem criou o flock
            flockAgents_ECS_T[i]  = newT; //setar arrays auxiliares
            flockAgents_ECS_R[i]  = newR;
            flockAgents_ECS_FW[i] = newFW;
        }

        for (int i = 0; i < qtdFlocks; i++)
        {
            squareNeighborRadiusNArray[i]  = neighborRadiusNArray[i] * neighborRadiusNArray[i];
            squareAvoidanceRadiusNArray[i] = squareNeighborRadiusNArray[i] * avoidanceRadiusMultiplierNArray[i] * avoidanceRadiusMultiplierNArray[i];
        }
    }
예제 #3
0
    void EvaluateRun()
    {
        List <int> numFlockColision  = new List <int>();
        List <int> numObjectColision = new List <int>();

        //Initialize values
        for (int i = 0; i < generationSize; i++)
        {
            numFlockColision.Add(0);
            numObjectColision.Add(0);
        }

        //Find number of colisions per flock
        int numAgents        = flockManager.flockAgents_ECS_FW.Length;
        int numAgentsOnSwarm = numAgents / generationSize;

        for (int i = 0; i < numAgents; i++)
        {
            FlockWho agent = flockManager.flockAgents_ECS_FW[i];
            numFlockColision[agent.flockManagerValue]  += agent.flockCollisionCount;
            numObjectColision[agent.flockManagerValue] += agent.objectCollisionCount;
        }

        // Make the score
        for (int i = 0; i < generationSize; i++)
        {
            float meanFlockColision  = (float)numFlockColision[i] / (float)numAgentsOnSwarm;
            float meanObjectColision = (float)numObjectColision[i] / (float)numAgentsOnSwarm;
            float score = meanFlockColision + meanObjectColision;
            scoreSum[i] += score;
        }

        currentEvaluation++;

        flockManager.RestartFlocks();
    }