/// <summary> /// A felderítő méhek által talált virágokhoz kirendelni keresőket /// </summary> private void UpdateFollowerSizes() {//A felderitő méhek által talált virágokhoz mennyi keresőt kell rendelni Flowers = new int[EliteBees.Count]; var count = NumberOfElements - ExBeeCount; EliteBees.Sort(); for (int i = 0; EliteBees.Count != 0 && count / EliteBees.Count > 0; i++) { Flowers[i % EliteBees.Count] += (int)Math.Round((double)count / EliteBees.Count); count -= Flowers[i % EliteBees.Count]; } if (Flowers.Length >= 1) { Flowers[0] += count; //A fennmaradt egyedeket a legjobb kereséséhez állitja be Flowers[0] += (NumberOfElements - ExBeeCount) - Flowers.Sum(); //Az osztás miatt keletkezett veszteségeket a legjobbnak adja } }
protected override void CreateNextGeneration() { //Kivétel kezelés if (NumberOfElements < ExBeeCount) { throw new ArgumentException("Elite parameter cannot be greater than NumberOfElements", "original"); } if (EliteBees == null) { EliteBees = new ArrayList(); } for (int i = 0; i < ExBeeCount; i++) { Exploratory((BaseElement)Elements[i], i); //Felderítés } if (EliteBees.Count > ExBeeCount) {// Ha több felderített pont van mint az előírt akkor a legrosszabbakat törli EliteBees.Sort(); EliteBees.RemoveRange(ExBeeCount, EliteBees.Count - ExBeeCount); } UpdateFollowerSizes();//Kereső méhek kiosztása int EliteIndex = ExBeeCount; int BeeGroupI = 0; for (int k = 0; k < Flowers.Length; k++) { double OldFitness = ((BaseElement)EliteBees[EliteBees.Count - 1]).Fitness; for (int i = 0; i < Flowers[k]; i++) { BeeGroupI = EliteIndex + i;//A keresési csoporton belüli méh indexe var parameter = new ArrayList(); for (int p = 0; p < InitialParameters.Count; p++) { parameter.Add(((BaseElement)Elements[BeeGroupI])[p]); // a kereső méhet a kezdőpontól a megfelelő sugáron belülre mozgatja. parameter[p] = (double)parameter[p] + ((double)parameter[p] - (double)((BaseElement)EliteBees[k])[p]) * (RNG.NextDouble() * 2 - 1); if ((double)parameter[p] > (double)UpperParamBounds[p]) { parameter[p] = UpperParamBounds[p]; } else if ((double)parameter[p] < (double)LowerParamBounds[p]) { parameter[p] = LowerParamBounds[p]; } if (Integer[p]) { parameter[p] = Math.Round((double)parameter[p]); } } Elements[BeeGroupI] = GetNewElement(FitnessFunction, parameter); if (((BaseElement)Elements[BeeGroupI]).Fitness < OldFitness) { EliteBees[k] = Elements[BeeGroupI]; } } EliteIndex += Flowers[k];//Tovább lépés a következő kereső csoportra } for (int i = 0; i < EliteBees.Count && EliteBees.Count > 1; i++) { if (((BaseElement)EliteBees[i]).Fitness > ((BaseElement)EliteBees[1]).Fitness - ((BaseElement)EliteBees[0]).Fitness) { EliteBees.RemoveAt(i); } } Elements.Sort(); }