Exemple #1
0
        private void EvaluateIterationPayout(
            SimulationState iterationState,
            ref OptionPayout payout,
            DynamicTransform2 controlledDynamicState,
            VehiclePrototype controlledPrototype,
            DynamicTransform2 targetDynamicState,
            VehiclePrototype targetPrototype)
        {
            payout.ShotsTaken  += iterationState.GetRegisteredHits(mTargetID);
            payout.ShotsLanded += iterationState.GetRegisteredHits(mControlledID);
            GunData controlledGun = controlledPrototype.Guns.MountedGun;
            GunData targetsGun    = targetPrototype.Guns.MountedGun;

            float ownShotDistance      = MonteCarloVehicleAI.ShotDistanceSq(controlledDynamicState, controlledGun, targetDynamicState.DynamicPosition);
            float targetShotDistance   = MonteCarloVehicleAI.ShotDistanceSq(targetDynamicState, targetsGun, controlledDynamicState.DynamicPosition);
            float currentPositionValue = (ownShotDistance + 0.001f) / (targetShotDistance + 0.001f);

            payout.PositionValue = Math.Min(currentPositionValue, payout.PositionValue);
        }
Exemple #2
0
        private void ComputeResidueRolloutHits(SimulationState finalState, ref OptionPayout payout)
        {
            var remainingOwnProjectiles = finalState.GetProjectiles(mControlledID);

            if (remainingOwnProjectiles.Count > 0)
            {
                var targetState = finalState.GetVehicle(mTargetID);
                foreach (var projectile in remainingOwnProjectiles)
                {
                    if (SimulationProcessor.ProjectileHitsVehicle(targetState.DynamicTransform, mSimData.GetVehiclePrototype(mTargetID), projectile, 1000f))
                    {
                        payout.ShotsLanded += 1;
                    }
                }
            }
            var remainingEnemyProjectiles = finalState.GetProjectiles(mTargetID);

            if (remainingEnemyProjectiles.Count > 0)
            {
                var controlledState     = finalState.GetVehicle(mControlledID);
                var controlledPrototype = mSimData.GetVehiclePrototype(mControlledID);
                foreach (var projectile in remainingEnemyProjectiles)
                {
                    Vector2 relativePosition = controlledState.DynamicTransform.Position - projectile.Position;
                    Vector2 relativeVelocity = controlledState.DynamicTransform.Velocity - projectile.Velocity;
                    if (Vector2.Dot(relativePosition, relativeVelocity) < 0f)
                    {
                        if (SimulationProcessor.ProjectileHitsVehicle(controlledState.DynamicTransform, controlledPrototype, projectile, 1000f))
                        {
                            payout.ShotsTaken += 1;
                        }
                        else
                        {
                            float timeToImpact;
                            float distanceSq = MonteCarloVehicleAI.ShotDistanceSq(projectile, controlledState.DynamicTransform.DynamicPosition, out timeToImpact);
                            payout.ProjectileThreat += 1f / (timeToImpact * timeToImpact * distanceSq);
                        }
                    }
                }
            }
        }
Exemple #3
0
        private void CreateAITask(uint aiID, uint targetID, float deltaTime, int iterations)
        {
            mAIIterator.Add(aiID);
            var resultPlacement = new BlockingCollection <VehicleControls>(1);

            mControlResults[aiID] = resultPlacement;
            var requestPlacement = new BlockingCollection <SimulationState>(1);

            mControlRequests[aiID] = requestPlacement;
            MonteCarloVehicleAI ai = new MonteCarloVehicleAI(aiID, targetID, deltaTime, SimulationData, iterations);   //TODO: inconsistently assuming delta time fixed here and otherwise elsewhere
            Action aiAction        = () =>
            {
                while (true)
                {
                    SimulationState state    = requestPlacement.Take();
                    VehicleControls controls = ai.ComputeControl(state);
                    resultPlacement.Add(controls);
                }
            };
            Task aiTask = new Task(aiAction);

            requestPlacement.Add(ActiveState);
            aiTask.Start();
        }