/// <summary> /// Runs the algorithm. /// </summary> /// <param name="refreshRate"></param> /// <param name="ComputationLimit"></param> /// <param name="Batch"></param> /// <param name="maxPathLength"></param> /// <returns></returns> public Results Run(long refreshRate, bool Batch, double computationLimitCeilingRatio, string Alg, int ComputationLimit, Metric OptimalPathLength, string File, bool Dynamic) { if (Algorithm is RealTimeAlgorithm <GenericGridWorldStaticState, GenericGridWorldDynamicState> ) { (Algorithm as RealTimeAlgorithm <GenericGridWorldStaticState, GenericGridWorldDynamicState>).SetComputationLimit(ComputationLimit); } Path <GenericGridWorldStaticState, GenericGridWorldDynamicState> path = null; Path <GenericGridWorldStaticState, GenericGridWorldDynamicState> fullPath = new Path <GenericGridWorldStaticState, GenericGridWorldDynamicState>( (GenericGridWorldDynamicState)null); long MaxMemoryUsage = 0; int numStops = 0; List <double> ComputationTimes = new List <double>( ); List <double> Expansions = new List <double>( ); double LastExpansions = 0; long ComputationTimeMax = long.MinValue; if (!Batch) { #if OpenGl if (vis != null) { vis.Visualize(StaticState, StaticState.InitialDynamicState); vis.SetInitData(Alg, ComputationLimit, StaticState.Map != null && StaticState.Map.OptimalSolutionCostSpecified ? StaticState.Map.OptimalSolutionCost : OptimalPathLength.ToDouble( ), File, Resultss); } #else System.Console.WriteLine(StaticState.InitialDynamicState); #endif } int StepNumber = 0; UncoverMap( ); Stopwatch total = Stopwatch.StartNew( ); Stopwatch step = Stopwatch.StartNew( ); foreach (var nextPath in Algorithm.Compute(StaticState, StaticState.InitialDynamicState, Goal, Actions)) { step.Stop( ); total.Stop( ); long CurrentUsage = Process.GetCurrentProcess( ).PrivateMemorySize64; if (CurrentUsage > MaxMemoryUsage) { MaxMemoryUsage = CurrentUsage; } path = nextPath; if (path != null) { foreach (var Action in path.Actions) { var oldState = StaticState.InitialDynamicState; if (!Action.IsValidOn(StaticState.InitialDynamicState, StaticState, true)) { throw new IllegalActionOnStateException( "Illegal Action Given By Algorithm"); } StaticState.InitialDynamicState = Action.PerformOn( StaticState.InitialDynamicState, StaticState).First( ); fullPath.Push(Action, oldState, StaticState.InitialDynamicState); if (!Batch) { var U = StaticState.InitialDynamicState.FindUnit(0); StaticState.Tiles[U.Y][U.X].Hits++; #if OpenGl vis.Visualize(StaticState, StaticState.InitialDynamicState); vis.SetStepData((int)Algorithm.Generations, (int)Algorithm.Expansions, total.ElapsedTicks, fullPath.Cost.ToDouble( ) + numStops, ComputationTimes.Count != 0 ? ComputationTimes.Average( ): 0, MaxMemoryUsage, ComputationTimeMax, Expansions.Count != 0 ? Expansions.Average( ): 0); #else System.Console.WriteLine(StaticState.InitialDynamicState); #endif } HandleChanges(Dynamic, StepNumber); } } else { numStops++; HandleChanges(Dynamic, StepNumber); #if OpenGl if (!Batch) { vis.Visualize(StaticState, StaticState.InitialDynamicState); (vis as OpenGLStateVisualizer).redraw( ); vis.SetStepData((int)Algorithm.Generations, (int)Algorithm.Expansions, total.ElapsedTicks, fullPath.Cost.ToDouble( ) + numStops, ComputationTimes.Count != 0 ? ComputationTimes.Average( ): 0, MaxMemoryUsage, ComputationTimeMax, Expansions.Count != 0 ? Expansions.Average( ): 0); } #endif } Expansions.Add(Algorithm.Expansions - LastExpansions); LastExpansions = Algorithm.Expansions; ComputationTimes.Add(step.ElapsedTicks); if (step.ElapsedTicks > ComputationTimeMax) { ComputationTimeMax = step.ElapsedTicks; } if (Goal.IsSatisfiedBy(StaticState, StaticState.InitialDynamicState)) { break; } long t = refreshRate - step.ElapsedMilliseconds; if (t > 0) { Thread.Sleep((int)t); } Metric maxPathLength = new Metric(computationLimitCeilingRatio * (StaticState.Map != null && StaticState.Map.OptimalSolutionCostSpecified ? StaticState.Map.OptimalSolutionCost : OptimalPathLength.ToDouble( ))); if (maxPathLength.Equals(Metric.Infinity) && fullPath.Cost + new Metric(numStops) >= maxPathLength) { throw new MaxPathLengthExceded( new Results(Alg, ComputationLimit, Algorithm.Generations, Algorithm.Expansions, total.ElapsedTicks, fullPath.Cost.ToDouble( ) + numStops, StaticState.Map != null && StaticState.Map.OptimalSolutionCostSpecified ? StaticState.Map.OptimalSolutionCost : OptimalPathLength.ToDouble( ), File, ComputationTimes.Average( ), MaxMemoryUsage, ComputationTimeMax, Expansions.Average( ))); } StepNumber++; step.Reset( ); step.Start( ); total.Start( ); } total.Stop( ); if (!Batch) { #if OpenGl if (vis != null) { vis.Cleanup( ); } #else new GenericGridWorldPathVisualizer( ).Visualize( Console.Out, fullPath, StaticState, StaticState.InitialDynamicState); #endif } double AverageComputationTime = ComputationTimes.Average( ); return(new Results(Alg, ComputationLimit, Algorithm.Generations, Algorithm.Expansions, total.ElapsedTicks, fullPath.Cost.ToDouble( ) + numStops, StaticState.Map != null && StaticState.Map.OptimalSolutionCostSpecified ? StaticState.Map.OptimalSolutionCost : OptimalPathLength.ToDouble( ), File, AverageComputationTime, MaxMemoryUsage, ComputationTimeMax, Expansions.Average( ))); }