public int CompareTo(MemoryNetwork <T> other) { return(Mathf.RoundToInt(other.Fitness - Fitness)); }
/// <summary> /// Transform the current network into a child of multiple other networks /// </summary> /// <param name="parents"></param> public void Transform(List <MemoryNetwork <T> > parents) { int parentsCount = parents.Count, eventTypesCount = eventTypes.Count, inputSize = data.inputSize, similarEventTypesCount; MemoryNetwork <T> root = parents[data.random.Next(0, parentsCount)]; List <EventType> similarEventTypes = new List <EventType>(parentsCount); EventType eventType, rootEventType; Random random = data.random; double[] instance; Fitness = 0; for (int i = eventTypesCount - 1; i >= 0; i--) { RemoveEventType(eventTypes[i]); } eventTypesCount = root.eventTypes.Count; for (int i = 0; i < eventTypesCount; i++) { eventType = AddEventType(); rootEventType = root.eventTypes[0]; similarEventTypes.Clear(); similarEventTypes.Add(rootEventType); // Get all similarly structured EventTypes foreach (MemoryNetwork <T> parent in parents) { if (parent != root) { foreach (EventType similarEvent in parent.eventTypes) { if (rootEventType.GetOffset(similarEvent.instances[0]) < data.maximumOffset) { similarEventTypes.Add(similarEvent); } break; } } } similarEventTypesCount = similarEventTypes.Count; // Set offset to random in eventtypes for (int j = 0; j < inputSize; j++) { eventType.offsetMultipliers[j] = similarEventTypes[data.random.Next(0, similarEventTypesCount)].offsetMultipliers[j]; } // Add a single comparable instance instance = GetAvailableInstance(); for (int j = 0; j < inputSize; j++) { instance[j] = rootEventType.instances[0][j]; } eventType.Add(instance); } }