private void InitProbabilisticCombinations(Dictionary <int, Combination> combinations) { foreach (var comb in combinations) { float totalWeight = 0; int probabilisticCount = 0; int determinedCount = 0; comb.Value.WeightedPackages.ForEach( x => { totalWeight += x.Weight; if (x.Weight == 0) { determinedCount++; } else { probabilisticCount++; } }); var probabilisticComb = new ProbabilisticCombination(); probabilisticComb.Id = comb.Key; probabilisticComb.DeterminedPackages = new ProbabilisticPackage[determinedCount]; probabilisticComb.ProbabilisticPackages = new ProbabilisticPackage[probabilisticCount]; int currentWeight = 0; int d = 0, p = 0; foreach (var pac in comb.Value.WeightedPackages) { var probPac = new ProbabilisticPackage(); probPac.Id = pac.Id; probPac.DeterminedResourceItems = _packages[pac.Id].DeterminedResourceItems; probPac.ProbabilisticResourceItems = _packages[pac.Id].ProbabilisticResourceItems; if (pac.Weight == 0) { probPac.Probability = 1; probabilisticComb.DeterminedPackages[d] = probPac; d++; } else { currentWeight += pac.Weight; probPac.Probability = currentWeight / totalWeight; probabilisticComb.ProbabilisticPackages[p] = probPac; p++; } } _combinations.Add(comb.Key, probabilisticComb); } }
private void InitProbabilisticPackages(Dictionary <int, Package> packages) { foreach (var pac in packages) { float totalWeight = 0; int probabilisticCount = 0; int determinedCount = 0; pac.Value.WeightedResourceItems.ForEach( x => { totalWeight += x.Weight; if (x.Weight == 0) { determinedCount++; } else { probabilisticCount++; } }); var probabilisticPac = new ProbabilisticPackage(); probabilisticPac.Id = pac.Key; probabilisticPac.DeterminedResourceItems = new ProbabilisticResourceItem[determinedCount]; probabilisticPac.ProbabilisticResourceItems = new ProbabilisticResourceItem[probabilisticCount]; int currentWeight = 0; int d = 0, p = 0; foreach (var item in pac.Value.WeightedResourceItems) { var resourceItem = new ProbabilisticResourceItem(); resourceItem.Id = item.Id; resourceItem.Number = item.Number; if (item.Weight == 0) { resourceItem.Probability = 1; probabilisticPac.DeterminedResourceItems[d] = resourceItem; d++; } else { currentWeight += item.Weight; resourceItem.Probability = currentWeight / totalWeight; probabilisticPac.ProbabilisticResourceItems[p] = resourceItem; p++; } } _packages.Add(pac.Key, probabilisticPac); } }
private void PackageGeneration(ProbabilisticPackage package, Dictionary <int, DeterminedResourceItem> result) { foreach (var item in package.DeterminedResourceItems) { var id = _genrerationId++; result.Add(id, new DeterminedResourceItem { Id = id, ResourceItemId = item.Id, Number = item.Number }); } double r = _randomizer.NextDouble(); foreach (var item in package.ProbabilisticResourceItems) { if (r < item.Probability) { var id = _genrerationId++; result.Add(id, new DeterminedResourceItem { Id = id, ResourceItemId = item.Id, Number = item.Number }); break; } } }