コード例 #1
0
ファイル: ConwayGame.cs プロジェクト: cyacedev/conway
        public void RunPredefinedGame(IEnumerable<PredefinedPosition> livingCells, InputCsvFile input)
        {
            _cells.Clear();
            _stats.Clear();
            _repetitionList.Clear();
            setPredefinedCells(livingCells);
            Run(input, true);

        }
コード例 #2
0
        static void Main(string[] args)
        {
            ConwayGame conwayGame = new ConwayGame();

            runList = new List <List <int> >();
            if (args.Length > 0)
            {
                String       conditionFileLocation = args[0];
                StreamReader reader        = new StreamReader(conditionFileLocation);
                var          csvConditions = new CsvReader(reader, CultureInfo.InvariantCulture);

                if (args.Length > 1)
                {
                    IEnumerable <InputCsvFile> conditionRecords = csvConditions.GetRecords <InputCsvFile>();
                    InputCsvFile firstEntry = new InputCsvFile();
                    using (IEnumerator <InputCsvFile> enumer = conditionRecords.GetEnumerator())
                    {
                        if (enumer.MoveNext())
                        {
                            firstEntry = enumer.Current;
                        }
                    }
                    string       predefinedInputLocation = args[1];
                    StreamReader predefinedInputReader   = new StreamReader(predefinedInputLocation);
                    var          csvPredefinedPositions  = new CsvReader(predefinedInputReader, CultureInfo.InvariantCulture);
                    IEnumerable <PredefinedPosition> predefinedCellRecords = csvPredefinedPositions.GetRecords <PredefinedPosition>();
                    conwayGame.RunPredefinedGame(predefinedCellRecords, firstEntry);
                }
                else
                {
                    IEnumerable <InputCsvFile> records = csvConditions.GetRecords <InputCsvFile>();

                    foreach (InputCsvFile record in records)
                    {
                        Console.WriteLine($"input Data: \nsize({record.FieldSize}), prob({record.ProbabilityForLife}), it({record.NumberOfIterations}), sim({record.NumberOfSimulations})");
                        conwayGame.Run(record, false);
                    }
                }


                return;
            }
        }
コード例 #3
0
ファイル: ConwayGame.cs プロジェクト: cyacedev/conway
        public void Run(InputCsvFile input, bool predefinedPosition)
        {
            int fieldSize = input.FieldSize;
            int probability = input.ProbabilityForLife;
            int numberOfIterations = input.NumberOfIterations;
            int numberOfSimulations = input.NumberOfSimulations;
            bool writeStats = input.SaveStatistics;
            string statsName = input.NameStatisticFile;
            string endStateName = input.NameEndStateFile;
            if (fieldSize == -1) fieldSize = _defaultStarterSize;
            if (probability == -1) probability = _defaultProbability;
            if (numberOfIterations == -1) numberOfIterations = _defaultIterations;
            if (numberOfSimulations == -1) numberOfSimulations = _defaultNumOfSimulations;
            if (predefinedPosition) numberOfSimulations = 1; //only the predefined game has to be run
            for (int simulation = 0; simulation < numberOfSimulations; simulation++)
            {
                Console.WriteLine("--------------------------");
                if (!predefinedPosition)
                {
                    _cells.Clear();
                }
                _repetitionList.Clear();
                _stats.Clear();
                if (!predefinedPosition)
                {
                    GenerateCellsWithProbability(probability, fieldSize);
                    Console.WriteLine($"Generated Cells: {_cells.Count}");
                    Console.WriteLine($"Field Size: {fieldSize} x {fieldSize}");
                }
                else
                {
                    Console.WriteLine($"Predefined Generated Cells: {_cells.Count}");
                }
                FillChangedPositionsOnStart();
                int checkStarted = 0;
                bool iterationRepeated = false;
                bool iterationDead = false;
                for (int i = 0; i < numberOfIterations; i++)
                {
                    _currentIteration = i + 1;
                    IterateSimulation();

                    //For average stats, simulation must add the dead iterations
                    if(_cells.Count == 0 && !input.AverageStats){
                        iterationDead = true;
                        break;
                    }

                    //For average stats, repetition is not enabled
                    if(!input.AverageStats){
                        if (i % _checkAfterIterations == 0)
                        {
                            checkStarted = i;
                        }
                        if (checkStarted != 0)
                        {

                            if (i - checkStarted <= _checkForIterations)
                            {
                                if (IsCurrentIterationRepetition())
                                {
                                    iterationRepeated = true;
                                    Console.WriteLine($"Iterations: {i + 1}");
                                    break;
                                }
                                AddDictionaryToCheckList();
                            }
                            else if (i - checkStarted == _checkForIterations + 1)
                            {
                                _repetitionList.Clear();
                            }
                        }
                    }
                }
                if (iterationRepeated)
                {
                    Console.WriteLine("Field repeated - simulation terminated");
                }
                else if(iterationDead)
                {
                    Console.WriteLine("Field dead - simulation terminated");
                }
                else
                {
                    Console.WriteLine($"Alive after 1000 iterations: {_cells.Count}");
                }

                if (writeStats)
                {

                    IterationStats endStats = new IterationStats();
                    endStats.CellCount = _cells.Count;
                    _stats.Add(endStats);
                    if (iterationRepeated)
                    {
                        IterationStats.WriteStats(_stats, $"./{ statsName }-{ simulation }-terminated.csv");
                    }
                    else
                    {
                        IterationStats.WriteStats(_stats, $"./{ statsName }-{ simulation }.csv");
                        
                        if(input.AverageStats){
                            IterationStats.AddAverageStats(_stats, $"./{ statsName }-cache.csv");    
                        }
                        
                    }

                }
                if (input.SaveEndState)
                {
                    IterationEndPosition.WriteEndPosition(_cells, $"./{ endStateName }-{ simulation }.csv");
                }
                
            }
            if(input.AverageStats){
                IterationStats.CalculateAndWriteAverageStats(input.NumberOfSimulations, $"./{ statsName }-cache.csv", $"./{ statsName }-average.csv");
            }
            Console.WriteLine("--------------------------");
        }