public double[] CreateInput(NeuralAgent agent, CardinalMovement action) { var input = InputCoder.Encode(agent); InputCoder.EncodeAction(input, action); return(input); }
public void EncodeState(double[] input, NeuralAgent agent) { var space = agent.Anchor.Field.Space; int px = agent.Anchor.Field.X - ViewRadius; int py = agent.Anchor.Field.Y - ViewRadius; int i = ObstaclesOffset; for (int y = 0; y < ViewLength; y++) { for (int x = 0; x < ViewLength; x++) { var field = space[px + x, py + y]; input[i++] = field.IsOutside || field.HasObstacle ? 1 : 0; } } px = agent.Anchor.Field.X - ViewRadius; py = agent.Anchor.Field.Y - ViewRadius; i = AgentsOffset; for (int y = 0; y < ViewLength; y++) { for (int x = 0; x < ViewLength; x++) { var field = space[px + x, py + y]; input[i++] = field.HasAgent ? 1 : 0; } } }
public double[] Encode(NeuralAgent agent) { double[] input = new double[EncodedSize]; EncodeState(input, agent); EncodeGoal(input, agent); return(input); }
public void EncodeGoal(double[] input, NeuralAgent agent) { int dx = agent.Goal.Position.X - agent.Anchor.Field.X; int dy = agent.Goal.Position.Y - agent.Anchor.Field.Y; if (dx == 0 && dy == 0) { input[DirectionOffset] = 0; input[DirectionOffset + 1] = 0; } else { var dn = Vector2.Normalize(new Vector2(dx, dy)); input[DirectionOffset] = dn.X; input[DirectionOffset + 1] = dn.Y; } //var v1 = Vector2.Normalize(agent.Direction); //var v2 = Vector2.Normalize(agent.Goal - agent.Position); //var sin = Vector2.Dot(v2, v1); //var cos = v1.CrossProduct(v2); }
public AgentNetworkPrediction Predict(NeuralAgent agent) { return(Predict(InputCoder.Encode(agent))); }