Beispiel #1
0
        /// <summary>
        /// Chack for correct memory at all
        /// </summary>
        /// <param name="netStructure"></param>
        /// <param name="memoryFolderPath"></param>
        /// <param name="defaultMemoryFilePath"></param>
        /// <returns>State of memory integrity</returns>
        public static bool CheckMemoryIntegrity(NetworkStructure netStructure = null, string memoryFolderPath = "Memory", string defaultMemoryFilePath = "memoryClear.txt")
        {
            if (memoryFolderPath == "" || defaultMemoryFilePath == "")
            {
                return(false);
            }

            DefaultMemoryFilePath = defaultMemoryFilePath;
            MemoryFolderPath      = memoryFolderPath;

            // Check for existing memory folder:
            if (!Directory.Exists(MemoryFolderPath))
            {
                Directory.CreateDirectory(MemoryFolderPath);
            }

            // Запуск процесса генерации памяти в случае ее отсутствия:
            if (!File.Exists(MemoryFolderPath + "//.clear//" + DefaultMemoryFilePath))
            {
                Logger.LogError(ErrorType.MemoryMissing);

                Directory.CreateDirectory(MemoryFolderPath + "//.clear");

                Console.WriteLine("Start generating process...");
                ServiceWeightsGenerator weightsGenerator = new ServiceWeightsGenerator();

                if (netStructure != null)
                {
                    weightsGenerator.GenerateMemory(MemoryFolderPath + "//.clear//" + DefaultMemoryFilePath, netStructure.InputVectorLength, netStructure.NeuronsByLayers);
                }
                else
                {
                    weightsGenerator.GenerateMemory(MemoryFolderPath + "//.clear//" + DefaultMemoryFilePath);
                }

                return(true);
            }
            else
            {
                // Дополнительная проверка, если файл памяти существует, но не подходит по структуре
                MemoryChecker memoryChecker = new MemoryChecker();

                if (!memoryChecker.IsValid(MemoryFolderPath + "//.clear//" + DefaultMemoryFilePath, netStructure))
                {
                    Logger.LogError(ErrorType.MemoryInitializeError);
                    return(false);
                }

                return(true);
            }
        }
        /// <summary>
        /// Generate new random population
        /// </summary>
        /// <param name="chromosomesCount"></param>
        /// <returns></returns>
        private List <List <double> > GeneratePopulation(int chromosomesCount)
        {
            List <List <double> > generation = new List <List <double> >();

            ServiceWeightsGenerator serviceWeightsGenerator = new ServiceWeightsGenerator();
            Random rnd = new Random(DateTime.Now.Millisecond);

            Parallel.For(0, chromosomesCount, i =>
            {
                lock (_sync)
                {
                    generation.Add(serviceWeightsGenerator.GenerateMemoryWeights(NetworkStructure, rnd));
                }
            });

            return(generation);
        }
        /// <summary>
        /// Cataclysm operation
        /// </summary>
        /// <param name="generation"></param>
        /// <param name="removingPercent"></param>
        /// <returns></returns>
        private List <List <double> > DoCataclysm(List <List <double> > generation, double removingPercent = 0.5)
        {
            // Thanos snap:
            int generationRemovedResultCount = (int)(generation.Count * removingPercent);

            ShuffleList(generation);

            // Creating queue by generation list:
            Queue <List <double> > generationInQueue = new Queue <List <double> >(generation);

            ServiceWeightsGenerator serviceWeightsGenerator = new ServiceWeightsGenerator();
            Random rnd = new Random(DateTime.Now.Millisecond);

            for (int i = 0; i < generationRemovedResultCount; i++)
            {
                generationInQueue.Dequeue();
                generationInQueue.Enqueue(serviceWeightsGenerator.GenerateMemoryWeights(NetworkStructure, rnd));
            }

            return(generationInQueue.ToList());
        }
Beispiel #4
0
        /// <summary>
        /// Полноценная проверка файла памяти в соответствии с представленной структурой
        /// </summary>
        /// <param name="memoryPath"></param>
        /// <param name="networkStructure"></param>
        /// <returns>Validity of memory</returns>
        public bool IsValid(string memoryPath, NetworkStructure networkStructure)
        {
            // Если файл не поврежден при прошлой записи, запуск полной проверки в соответствии со структурой:
            if (IsValidQuickCheck(memoryPath, networkStructure))
            {
                ServiceWeightsGenerator serviceWeightsGenerator = new ServiceWeightsGenerator();

                List <double> memoryFromStructure = serviceWeightsGenerator.GenerateEmptyMemoryWeights(networkStructure);
                List <double> memoryFromFile      = LoadWholeMemoryFile(memoryPath);

                // Проверка количества значений весов по структуре с количеством значений весов, полученной после фактической загрузки:
                if (memoryFromStructure.Count != memoryFromFile.Count)
                {
                    return(false);
                }
            }
            else
            {
                return(false);
            }

            return(true);
        }