public override Multiset <long> SampleElectorate(int voteCount) { var result = new HashMultiset <long>(); var electorateOffset = new double[Dimensions.Length]; for (int j = 0; j < Dimensions.Length; j++) { electorateOffset[j] = Rand.SampleNormal(0.0, Dimensions[j] / (2 * Math.Sqrt((double)this.DistrictMagnitude))); } for (int i = 0; i < voteCount; i++) { var voterCoords = new double[Dimensions.Length]; for (int j = 0; j < Dimensions.Length; j++) { voterCoords[j] = Rand.SampleNormal(electorateOffset[j], Dimensions[j]); } List <Tuple <double, int> > distancesByPartyIndex = new List <Tuple <double, int> >(); for (int p = 0; p < PartyCount; p++) { double x = 0.0; for (int j = 0; j < Dimensions.Length; j++) { x += Math.Pow(parties[p].Coords[j] - voterCoords[j], 2.0); } distancesByPartyIndex.Add(new Tuple <double, int>(Math.Sqrt(x), p)); } var prefOrder = (from x in distancesByPartyIndex orderby x.Item1 ascending select x.Item2).ToList(); var index = DiscreteMath.GetIndexByPermutation(prefOrder); result[index]++; } return(result); }
public HashMultiset <Int64> ToMultiset(int totalVotes) { var result = new HashMultiset <Int64>(); for (int i = 0; i < PartyCount; i++) { for (int j = 0; j < PartyCount; j++) { for (int k = 0; k < PartyCount; k++) { if (i != j && j != k && i != k) { result[DiscreteMath.GetIndexByPermutation(GetRandPermutation(i, j, k))] += (int)(VotesByParty[i, j, k] * (double)totalVotes); } } } } return(result); }