Beispiel #1
0
 public void Accumulate(OptionPayout otherPayout)
 {
     ShotsTaken       = Math.Min(otherPayout.ShotsTaken, ShotsTaken);
     ShotsLanded     += otherPayout.ShotsLanded;
     ProjectileThreat = Math.Min(ProjectileThreat, otherPayout.ProjectileThreat);
     PositionValue   += otherPayout.PositionValue;
 }
Beispiel #2
0
        private OptionPayout RolloutStateAndGetPayout(SimulationState simState)
        {
            OptionPayout payout = new OptionPayout();

            payout.InitializeForExpand();
            SimulationState iterationState = simState;
            const int       kIterations    = 22;

            for (int i = 0; i < kIterations; ++i)
            {
                VehicleState     controlledVehicle   = iterationState.GetVehicle(mControlledID);
                VehiclePrototype controlledPrototype = mSimData.GetVehiclePrototype(mControlledID);
                mControlInputMock[mControlledID] = new VehicleControls(GetRandomControl(controlledVehicle, controlledPrototype, mRandom, mDeltaTime));

                VehicleState     targetVehicle   = iterationState.GetVehicle(mTargetID);
                VehiclePrototype targetPrototype = mSimData.GetVehiclePrototype(mTargetID);
                mControlInputMock[mTargetID] = new VehicleControls(GetRandomControl(targetVehicle, targetPrototype, mRandom, mDeltaTime));

                iterationState = SimulationProcessor.ProcessState(iterationState, mSimData, mControlInputMock, mDeltaTime);

                EvaluateIterationPayout(iterationState, ref payout, controlledVehicle.DynamicTransform, controlledPrototype, targetVehicle.DynamicTransform, targetPrototype);
            }
            ComputeResidueRolloutHits(iterationState, ref payout);
            return(payout);
        }
Beispiel #3
0
        private void ExpandOption(Option option)
        {
            SimulationState simState = GetPrimedState(option);
            OptionPayout    payout   = RolloutStateAndGetPayout(simState);

            option.TimesRun++;
            option.Payout.Accumulate(payout);
        }
Beispiel #4
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);
        }
Beispiel #5
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);
                        }
                    }
                }
            }
        }