예제 #1
0
        /// <summary>
        /// Moves all agents in the world forward by one step and collects food for any agents on top of
        /// a plant.
        /// </summary>
        public void Step()
        {
            // If no one set a lookup table yet, generate one.
            if (_sensorDictionary == null)
            {
                _sensorDictionary = new SensorDictionary((int)AgentHorizon, Height, Width);
            }

            // Advance each teacher by one step
            foreach (var agent in Agents)
            {
                var sensors = calculateForagingAgentSensors(agent);

                agent.Step(sensors);
                applyToroidalAgentLocationRules(agent);
            }

            // Advance each predator by one step
            foreach (var predator in Predators)
            {
                var sensors = calculatePredatorSensors(predator);
                predator.Step(sensors);
                applyToroidalAgentLocationRules(predator);
            }

            // Make a separate pass over all the agents, now that they're in new locations
            // and determine who is on top of a plant and who is on top of a predator.
            foreach (var agent in Agents)
            {
                foreach (var predator in Predators)
                {
                    if (agent.HidingMode != predator.AttackType &&
                        _sensorDictionary.getDistanceAndOrientation((int)agent.X, (int)agent.Y, (int)predator.X, (int)predator.Y)[0]
                        < agent.Radius && !agent.EatenByRecently(_step, AGENT_GHOST_TIME, predator))
                    {
                        // Eat the agent
                        agent.EatenBy(predator, _step);

                        // Notify the predator that it received a reward
                        predator.ReceiveReward(agent.Reward);

                        // Notify the agent that it's been eaten.
                        agent.ReceiveReward(-agent.Reward);

                        // Notify listeners that we gobbled up this agent
                        onAgentEaten(predator, agent);
                    }
                }
                foreach (var plant in Plants)
                {
                    if (_sensorDictionary.getDistanceAndOrientation((int)agent.X, (int)agent.Y, (int)plant.X, (int)plant.Y)[0]
                        < plant.Radius && plant.AvailableForEating(agent))
                    {
                        // Eat the plant
                        plant.EatenBy(agent, _step);

                        // Notify the teacher that it received a reward
                        agent.ReceiveReward(plant.Reward);

                        // Notify listeners that someone has eaten a plant.
                        onPlantEaten(agent, plant);
                    }
                }

                agent.Fitness += StepReward;
            }

            // Notify listeners that the world has stepped and changed.
            onStepped(EventArgs.Empty);
            onChanged(EventArgs.Empty);
            _step++;
        }
예제 #2
0
        /// <summary>
        /// Moves all agents in the world forward by one step and collects food for any agents on top of
        /// a plant.
        /// </summary>
        public void Step()
        {
            // If no one set a lookup table yet, generate one.
            if (_sensorDictionary == null)
                _sensorDictionary = new SensorDictionary((int)AgentHorizon, Height, Width);

            // Advance each teacher by one step
            foreach (var agent in Agents)
            {
                var sensors = calculateForagingAgentSensors(agent);

                agent.Step(sensors);
                applyToroidalAgentLocationRules(agent);
            }

            // Advance each predator by one step
            foreach (var predator in Predators)
            {
                var sensors = calculatePredatorSensors(predator);
                predator.Step(sensors);
                applyToroidalAgentLocationRules(predator);
            }

            // Make a separate pass over all the agents, now that they're in new locations
            // and determine who is on top of a plant and who is on top of a predator.
            foreach (var agent in Agents)
            {
                foreach (var predator in Predators)
                {
                    if (agent.HidingMode != predator.AttackType &&
                        _sensorDictionary.getDistanceAndOrientation((int)agent.X, (int)agent.Y, (int)predator.X, (int)predator.Y)[0]
                        < agent.Radius && !agent.EatenByRecently(_step, AGENT_GHOST_TIME, predator))
                    {
                        // Eat the agent
                        agent.EatenBy(predator, _step);

                        // Notify the predator that it received a reward
                        predator.ReceiveReward(agent.Reward);

                        // Notify the agent that it's been eaten.
                        agent.ReceiveReward(-agent.Reward);

                        // Notify listeners that we gobbled up this agent
                        onAgentEaten(predator, agent);
                    }
                }
                foreach (var plant in Plants)
                    if (_sensorDictionary.getDistanceAndOrientation((int)agent.X, (int)agent.Y, (int)plant.X, (int)plant.Y)[0]
                        < plant.Radius && plant.AvailableForEating(agent))
                    {
                        // Eat the plant
                        plant.EatenBy(agent, _step);

                        // Notify the teacher that it received a reward
                        agent.ReceiveReward(plant.Reward);

                        // Notify listeners that someone has eaten a plant.
                        onPlantEaten(agent, plant);
                    }

                agent.Fitness += StepReward;
            }

            // Notify listeners that the world has stepped and changed.
            onStepped(EventArgs.Empty);
            onChanged(EventArgs.Empty);
            _step++;
        }