コード例 #1
0
        public static void InterpretOutput(ThinkingAgent agent, IWorld world, Vector2D output)
        {
            var centerOfGravity =
                world.Sheep.Select(x => x.Position).Center();

            var vCentered = new Vector2D(
                centerOfGravity.X - agent.Position.X,
                centerOfGravity.Y - agent.Position.Y);

            var vCenteredLength = vCentered.Length;

            var sin = vCentered.Y / vCenteredLength;
            var cos = vCentered.X / vCenteredLength;

            if (double.IsNaN(sin))
            {
                sin = 0.0;
            }

            if (double.IsNaN(cos))
            {
                cos = 1.0;
            }

            var vRotated = new Vector2D(
                output.X * cos - output.Y * sin,
                output.X * sin + output.Y * cos);

            agent.decision = vRotated;
            agent.Move();
        }
コード例 #2
0
        public static double[] ExtractFeatures(IWorld world, ThinkingAgent agent)
        {
            var centerOfGravity =
                world.Sheep.Select(x => x.Position).Center();

            var closestAgents =
                Finder.FindClosestAgents(agent, agent.NumberOfSeenShepherds, world.Shepherds.Members)
                .Concat(Finder.FindClosestAgents(agent, agent.NumberOfSeenSheep, world.Sheep));

            var closestAgentsInRelativeCoordinationSystem = closestAgents
                                                            .Select(x => x.Position.PositionInRelativeCoordinationSystem(agent.Position, centerOfGravity)).ToList();

            var features = new double[closestAgentsInRelativeCoordinationSystem.Count * 2 + 2];

            features[0] = TransformPerception(0.0);
            features[1] = TransformPerception(agent.Position.Distance(centerOfGravity));

            if (double.IsNaN(features[1]))
            {
                features[1] = 0.0f;
            }

            for (int i = 0; i < closestAgentsInRelativeCoordinationSystem.Count; i++)
            {
                features[2 + 2 * i]     = TransformPerception(closestAgentsInRelativeCoordinationSystem[i].X);
                features[2 + 2 * i + 1] = TransformPerception(closestAgentsInRelativeCoordinationSystem[i].Y);
            }

            return(features);
        }