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); } } } } }
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(); }