public void TrimToMaxSize(Type type) { var newItems = GetNewItemsByType(type); var currentItems = GetItemsByType(type); foreach (var curItem in currentItems) { var existingItem = newItems.FirstOrDefault(it => it.Node.Equals(curItem.Node)); if (existingItem != null) { if (curItem.GetFitness() < existingItem.GetFitness()) { newItems.Remove(existingItem); newItems.Add(curItem); } } else { newItems.Add(curItem); } } currentItems.Clear(); if (newItems.Count > MaxSizePerType) { newItems.Sort(); currentItems.Clear(); var selector = new RankBasedPoolItemSelector <PoolItem>(); while (currentItems.Count < MaxSizePerType && newItems.Count > 0) { var item = selector.DrawFromList(newItems); var existingItem = FindNode(item.Node); if (existingItem == null) // no duplicates { currentItems.Add(item); } else if (item.GetFitness() < existingItem.GetFitness()) { currentItems.Remove(existingItem); currentItems.Add(item); } newItems.Remove(item); } } else { currentItems.AddRange(newItems); } currentItems.Sort(); newItems.Clear(); }
public RecordBasedSubTreePool(int maxDepth = -1) : base(maxDepth) { Selector = new RankBasedPoolItemSelector <PoolItem>(); }