Exemple #1
0
        private PurchaseOrderLine[][] GetAllPremutations(IRequirement requirement, IList <Stock> stocks)
        {
            var vendors      = new PurchaseOrderLine[stocks.Count][];
            var maxAvailable = 0;

            for (int i = 0; i < stocks.Count; i++)
            {
                vendors[i]    = GetLines(requirement.Quantity, stocks[i]);
                maxAvailable += stocks[i].Quantity;
            }
            if (maxAvailable == 0)
            {
                return(new PurchaseOrderLine[0][]);
            }
            var premuter = new Premuting <PurchaseOrderLine>(vendors);
            var result   = new List <PurchaseOrderLine[]>();
            var target   = Math.Min(maxAvailable, requirement.Quantity);

            premuter.Premute((x, y, z) =>
            {
                if (IsValidCombination(x, target))
                {
                    result.Add(x.Where(y => y.Quantity > 0).ToArray());
                }
            });
            return(result.ToArray());
        }
Exemple #2
0
        protected override void AllocateAll(IRequirementBatch batch)
        {
            Reset();
            var requirements = batch.Unallocated
                               .Select(x => GetAllPremutations(x, batch.GetAvailableStock(x.Product).ToList()))
                               .ToArray();

            var premuter = new Premuting <PurchaseOrderLine[]>(requirements);

            premuter.Premute((combination, current, total) => ProcessPo(batch, combination, current, total));
            foreach (var item in _cheapest)
            {
                batch.AddPurchaseOrderLine(item);
            }
            ;
            OnProgress(true);
            Console.WriteLine();
            Console.WriteLine($"{nameof(BestCombinationAllocator)} - Cheapest {_lowestTotal} Most expensive: {_highestTotal}");
        }
        static void PreMute()
        {
            var data1 = new string[3][];

            data1[0] = new string[] { "1", "2", "3", "4", "5", "6" };
            data1[1] = new string[] { "a", "b", "c", "d", "e" };
            data1[2] = new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I" };


            var premuter = new Premuting <string>(data1);
            //var stopwatch = new Stopwatch();
            //stopwatch.Start();
            //var mutations = premuter.GetPremutations();
            //stopwatch.Stop();


            //using (var progress = new ProgressBar())
            //{
            //    for (int i = 0; i <= 1000; i++)
            //    {
            //        progress.Report((double)i / 100);
            //        Thread.Sleep(20);
            //    }
            //}
            //Console.WriteLine("Done.");
            var progress = new ProgressBar();


            premuter.Premute((x, y, z) =>
            {
                //Console.WriteLine($"{string.Join('-', x)}");
                progress.Report(z / y);
            });
            progress.Dispose();

            Console.ReadKey();
        }