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()); }
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(); }