public virtual void Analyze(TSol[] individuals, double[] qualities, ResultCollection results, IRandom random) { var bestSolutionResultName = "Best Packing Solution"; var numContainersResultName = "Nr of Containers"; var binUtilResultName = "Overall Bin Utilization"; if (!results.ContainsKey(bestSolutionResultName)) { results.Add(new Result(bestSolutionResultName, typeof(Solution))); } if (!results.ContainsKey(numContainersResultName)) { results.Add(new Result(numContainersResultName, typeof(IntValue))); } if (!results.ContainsKey(binUtilResultName)) { results.Add(new Result(binUtilResultName, typeof(DoubleValue))); } // find index of item with max quality int bestIdx = 0; for (int j = 1; j < qualities.Length; j++) { if (qualities[j] > qualities[bestIdx]) { bestIdx = j; } } // update best solution so far var bestSolution = results[bestSolutionResultName].Value as Solution; if (bestSolution == null || bestSolution.Quality.Value < qualities[bestIdx]) { var newBestSolution = Decoder.Decode(individuals[bestIdx], BinShape, Items); newBestSolution.Quality = new DoubleValue(qualities[bestIdx]); results[bestSolutionResultName].Value = newBestSolution; results[numContainersResultName].Value = new IntValue(newBestSolution.NrOfBins); results[binUtilResultName].Value = new DoubleValue(BinUtilizationEvaluator.CalculateBinUtilization(newBestSolution)); // update best known solution var bestKnownQuality = BestKnownQualityParameter.Value; if (bestKnownQuality == null || bestKnownQuality.Value < qualities[bestIdx]) { BestKnownQualityParameter.ActualValue = new DoubleValue(qualities[bestIdx]); BestKnownSolutionParameter.ActualValue = newBestSolution; } } }
protected BinUtilizationEvaluator(BinUtilizationEvaluator original, Cloner cloner) : base(original, cloner) { }