コード例 #1
0
        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);
        }
コード例 #2
0
            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);
            }