private Bee GetMinimalBee(Bee[] beesArray) { Bee minBee = beesArray[0]; for (int i = 1; i < beesArray.Length; i++) { if (Bee.Compare(minBee, beesArray[i]) > 0) { minBee = beesArray[i]; } } return(minBee); }
public List <int> costs = new List <int>(); // koszty dla poszczegolnych iteracji private void Init() { // tablica z liczbami dla kazdej pszczoly int[] initialTable = new int[n]; for (int i = 0; i < n; i++) { initialTable[i] = i; } // tworzymy pszczoly bees = new Bee[nb]; for (int i = 0; i < nb; i++) { bees[i] = new Bee((int[])initialTable.Clone()); // kazda pszczola otrzymuje swoja kopie tablicy liczb bees[i].FindSomeSite(n); // i ja losowo permutuje } // sortujemy pszczoly wedlug kosztu wyliczonego z posiadanych przez nie permutacji Array.Sort <Bee>(bees, Bee.Compare); SaveBestResult(); }
// komparator przydatnosci pszczol public static int Compare(Bee b1, Bee b2) { return(b1.Value - b2.Value); }
public void ReleaseTheBees() { Init(); neighbourhoodSize = (int)Math.Round(n * ngh); // wyliczamy rozmiar sasiedztwa for (int iter = 0; iter < imax; iter++) { // przetwarzamy najlepsze pszczoly for (int bestSites = 0; bestSites < e; bestSites++) { Bee[] nepBees = new Bee[nep]; for (int i = 0; i < nep; i++) { nepBees[i] = new Bee(bees[bestSites].Data); nepBees[i].FindSomeSite(neighbourhoodSize); } Bee minimalBee = GetMinimalBee(nepBees); if (minimalBee.Value < bees[bestSites].Value) { bees[bestSites] = minimalBee; } } // pozostale wybrane pszczoly for (int selectedSites = e; selectedSites < m; selectedSites++) { Bee[] nspBees = new Bee[selsit]; for (int i = 0; i < selsit; i++) { nspBees[i] = new Bee(bees[selectedSites].Data); nspBees[i].FindSomeSite(neighbourhoodSize); } Bee minimalBee = GetMinimalBee(nspBees); if (minimalBee.Value < bees[selectedSites].Value) { bees[selectedSites] = minimalBee; } } // pozostale wysylamy losowo for (int randomSites = m; randomSites < nb; randomSites++) { bees[randomSites].FindSomeSite(n); } // sortujemy Array.Sort <Bee>(bees, Bee.Compare); if (minimalCost > bees[0].Value) { SaveBestResult(); } //jeśli został przypisany background worker to notyfikuje go if (_backgroundWorker != null) { _backgroundWorker.ReportProgress(minimalCost); } if (cancel) { break; } } finished = true; }