private void Pick(decimal max, IKnapsackItem[] items, int index, KnapsackResult current) { if (current.Weight >= max) { return; } // picked weight > result and lower value than result. if (index >= items.Length && current.Weight <= max) { if (current.Value > best.Value) { best = current.Clone() as KnapsackResult; } else if (current.Value == best.Value && current.Weight < best.Weight) { best = current.Clone() as KnapsackResult; } return; } //Pick current.Items.Add(items[index]); Pick(max, items, index + 1, current); //Not pick current.Items.Remove(items[index]); Pick(max, items, index + 1, current); }
public KnapsackResult Solve(KnapsackInstance instance) { BestConfiguration = new KnapsackConfiguration { Price = 0, Weight = 0, ItemVector = new bool[instance.ItemCount].ToList() }; FindBestConfiguration(0, new KnapsackConfiguration { Price = 0, Weight = 0, ItemVector = new List <bool>() }, instance.GetPriceOfAllItems(), instance); var result = new KnapsackResult { KnapsackInstance = instance, Configuration = BestConfiguration }; return(result); }
public IList <KnapsackResult> SolveWithPerformanceTest(IList <KnapsackInstance> instances, AnnealingOptions options) { PreparePerformanceTest(instances); var stopWatch = new Stopwatch(); var results = new List <KnapsackResult>(); foreach (var instance in instances) { Console.WriteLine($"Processing instance no. {instance.Id}"); KnapsackResult result = null; //The algorithm must run repeat at least the set amount of times; for (int i = 0; i < REPEAT_COUNT; i++) { var solver = new SimulatedAnnealingSolver(instance, options); GC.Collect(); GC.WaitForPendingFinalizers(); //GC.TryStartNoGCRegion(200000000); stopWatch.Start(); result = solver.Solve(); stopWatch.Stop(); //GC.EndNoGCRegion(); } var averageRuntime = stopWatch.Elapsed.TotalMilliseconds / REPEAT_COUNT; //Save only the last result if (result != null) { var optimalConfiguration = GetOptimalConfiguration(instance); result.RunTimeMs = averageRuntime; result.OptimalConfiguration = optimalConfiguration; result.Epsilon = GetEpsilonOfSolution(result.Configuration.Price, optimalConfiguration.Price); results.Add(result); } RaiseInstanceCalculationFinished(); stopWatch.Reset(); } return(results); }
public KnapsackResult Pick(decimal max, params IKnapsackItem[] items) { best = new KnapsackResult(); Pick(max, items, 0, new KnapsackResult()); return(best); }