public void Accumulate(OptionPayout otherPayout) { ShotsTaken = Math.Min(otherPayout.ShotsTaken, ShotsTaken); ShotsLanded += otherPayout.ShotsLanded; ProjectileThreat = Math.Min(ProjectileThreat, otherPayout.ProjectileThreat); PositionValue += otherPayout.PositionValue; }
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); }
private void ExpandOption(Option option) { SimulationState simState = GetPrimedState(option); OptionPayout payout = RolloutStateAndGetPayout(simState); option.TimesRun++; option.Payout.Accumulate(payout); }
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); }
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); } } } } }