Exemple #1
0
        /// <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( ) );
        }