private bool addFittestList(NetCacheEntry entry) { if (entry.fitness <= 0) { return(false); } SortedList <double, NetCacheEntry> fittestList = getFittestList(entry.name); if (fittestList.Count >= SpeciesNetCacheSize && fittestList.Count > 0 && fittestList.Last().Key >= entry.fitness) { // No better than anything in list return(false); } bool fittest = false; if (fittestList.Count == 0 || (fittestList.Count > 0 && entry.fitness > fittestList.First().Key)) { fittest = true; Debug.Log("Fittest " + entry.tag + ": " + entry.fitness); } fittestList.Add(entry.fitness, entry); while (fittestList.Count > SpeciesNetCacheSize) { fittestList.RemoveAt(SpeciesNetCacheSize); } return(fittest); }
private void save() { foreach (KeyValuePair <string, SortedList <double, NetCacheEntry> > entry in fittestCache) { if (entry.Value.Count == 0) { continue; } NetCacheEntry fittest = entry.Value.First().Value; string type = String.Join(".", ((NeuralNet.FeedForward)fittest.net).layerSizes.Select(p => p.ToString()).ToArray()); string filename = fittest.name + ".json"; // Save it NetSaveData save = new NetSaveData(fittest.name, fittest.tag, (NeuralNet.FeedForward)fittest.net); string savePath = Path.Combine(dataDirectory, filename); File.WriteAllText(savePath, JsonUtility.ToJson(save, true)); Debug.Log("Saved as " + savePath); } }
/** * When someone dies update the cache if they were the fittest. */ public void OnDie(GameObject dead) { string tag = dead.tag; MovementNet net = dead.GetComponent <MovementNet>(); if (net != null && net.Net != null && net.Net.Fitness > 0) { string type = String.Join(".", net.Net.layerSizes.Select(p => p.ToString()).ToArray()); string name = tag + "-" + type; NetCacheEntry entry = new NetCacheEntry { name = name, tag = tag, net = net.Net, fitness = net.Net.Fitness }; if (addFittestList(entry)) { save(); } } }