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