public static new bool Equals(object obj1, object obj2) { BestEntry be1 = (BestEntry)obj1; BestEntry be2 = (BestEntry)obj2; return(be1.Neighbour == be2.Neighbour); }
public void reportFitness(RocketEvaluator evaluator, double fitness, int index) { totalFitness += fitness; --chromosomesInEvaluation; Chromosome chromosome = population.getChromosomes()[index]; chromosome.setFitness(fitness); if (currentBest == null || chromosome.getFitness() > currentBest.getFitnessScore()) { print("recording best fitness as: " + chromosome.getFitness()); BestEntry newBest = new BestEntry(population.getCurrentGenerationNumber(), new List <double>(chromosome.getWeights()), chromosome.getFitness()); currentBest = newBest; bests.Add(newBest); } // print("current index: " + currentChromosomeIndex); if (currentChromosomeIndex < populationSize - 1) { if (currentChromosomeIndex + chromosomesInEvaluation < populationSize - 1) { evaluateChromosome(currentChromosomeIndex + chromosomesInEvaluation + 1, evaluator); } ++currentChromosomeIndex; } else { // print("restart generation"); startNextGeneration(); } }
public int CompareTo(object obj) { BestEntry be = (BestEntry)obj; if (distSq < be.distSq) { return(-1); } else if (distSq > be.distSq) { return(1); } return(0); }
public List <Match> Matchmake( int matchmakeNum, List <Matching.IBattleEntry> entries, int minMatchmakeEntriedPlayersNumber ) { var ret = new List <Match>(); // count entriedPlayers var entriedPlayersCnt = 0; foreach (var entry in entries) { entriedPlayersCnt += entry.Players.Count; } if (entriedPlayersCnt < minMatchmakeEntriedPlayersNumber) { return(ret); } var subEntries = new List <Matching.IBattleEntry>(); while (true) { if (matchmakeNum <= ret.Count) { break; } if (entries.Count <= 0) { break; } // Current entry. var currentEntry = entries[0]; entries.RemoveAt(0); // Create candidates list. var candidatesList = new List <Matching.IBattleEntry>(); foreach (var entry in entries) { if (MaxCandidatesNum <= candidatesList.Count) { break; } if (CheckForCandidates(currentEntry, entry)) { candidatesList.Add(entry); } } foreach (var entry in subEntries) { if (MaxCandidatesNum <= candidatesList.Count) { break; } if (CheckForCandidates(currentEntry, entry)) { candidatesList.Add(entry); } } var removeEntries = new Dictionary <ulong, int>(); var sideA = new Side(); var sideB = new Side(); sideA.Add(currentEntry); while (true) { var bestEntry = new BestEntry(); bestEntry.score = float.MinValue; var currentSide = (sideA.PlayersCount < sideB.PlayersCount) ? sideA : sideB; var opponetSide = (currentSide == sideA) ? sideB : sideA; for (int i = 0; i < candidatesList.Count; i++) { var targetEntry = candidatesList[i]; if (!currentSide.CanAdd(targetEntry)) { continue; } var distance = 0f; // distance += MathF.Pow( Func_DiffGroupSize(opponetSide.MaxGroupSize - targetEntry.Players.Count), 2 ); // distance += MathF.Pow( Func_DiffMatchRatingAvg( (currentSide.RatingSum + targetEntry.RatingSum) / (currentSide.PlayersCount + targetEntry.Players.Count) - opponetSide.RatingSum / opponetSide.PlayersCount), 2 ); // //distance += MathF.Pow( // Func_DiffMatchPingAvg(matchPingAvg - targetEntry.PingAvg), // 2); // distance -= MathF.Pow( Func_ElapsedTimeValue((float)targetEntry.WaitingTime.TotalSeconds), 2 ); var score = -distance; if (bestEntry.score < score) { bestEntry.entry = targetEntry; bestEntry.index = i; bestEntry.score = score; } } if (bestEntry.entry == null) { break; } currentSide.Add(bestEntry.entry); candidatesList.RemoveAt(bestEntry.index); if (evolib.Battle.MatchPlayersNum <= (sideA.PlayersCount + sideB.PlayersCount)) { // establishment var m = new Match { Elements = new List <Match.Element>(), }; sideA.ForEach(e => { m.Elements.Add(new Match.Element { Side = evolib.Battle.Side.Earthnoid, Entry = e, }); removeEntries[e.EntryId] = 0; }); sideB.ForEach(e => { m.Elements.Add(new Match.Element { Side = evolib.Battle.Side.Spacenoid, Entry = e, }); removeEntries[e.EntryId] = 0; }); ret.Add(m); break; } } for (int i = 0; i < entries.Count;) { if (removeEntries.ContainsKey(entries[i].EntryId)) { entries.RemoveAt(i); continue; } i++; } for (int i = 0; i < subEntries.Count;) { if (removeEntries.ContainsKey(subEntries[i].EntryId)) { subEntries.RemoveAt(i); continue; } i++; } if (!removeEntries.ContainsKey(currentEntry.EntryId)) { //because match not establishment subEntries.Add(currentEntry); } } return(ret); }