Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
 public KnapsackResult Pick(decimal max, params IKnapsackItem[] items)
 {
     best = new KnapsackResult();
     Pick(max, items, 0, new KnapsackResult());
     return(best);
 }