/// <summary> /// Implementation to generate the ranking list for the provided set /// of votes for a specific task. /// </summary> /// <param name="task">The task that the votes are grouped under.</param> /// <returns>Returns a ranking list of winning votes.</returns> protected override RankResults RankTask(GroupedVotesByTask task) { var groupVotes = GroupRankVotes.GroupByVoteAndRank(task); var rankedVotes = from vote in groupVotes select new { Vote = vote.VoteContent, Rank = RankVote(vote.Ranks) }; var orderedVotes = rankedVotes.OrderByDescending(a => a.Rank); RankResults results = new RankResults(); results.AddRange(orderedVotes.Select(a => new RankResult(a.Vote, $"BordaRank: [{a.Rank}]"))); return(results); }
/// <summary> /// Implementation to generate the ranking list for the provided set /// of votes for a specific task. /// </summary> /// <param name="task">The task that the votes are grouped under.</param> /// <returns>Returns a ranking list of winning votes.</returns> protected override RankResults RankTask(GroupedVotesByTask task) { // Can calculating the score easily by having all the rankings for // each vote grouped together. var groupVotes = GroupRankVotes.GroupByVoteAndRank(task); var rankedVotes = from vote in groupVotes select new { Vote = vote.VoteContent, Rank = RankScoring.LowerWilsonScore(vote.Ranks) }; var orderedVotes = rankedVotes.OrderByDescending(a => a.Rank); RankResults results = new RankResults(); results.AddRange(orderedVotes.Select(a => new RankResult(a.Vote, $"Wilson: [{a.Rank:f5}]"))); return(results); }
/// <summary> /// Implementation to generate the ranking list for the provided set /// of votes for a specific task. /// </summary> /// <param name="task">The task that the votes are grouped under.</param> /// <returns>Returns a ranking list of winning votes.</returns> protected override RankResults RankTask(GroupedVotesByTask task) { Debug.WriteLine(">>Normalized Borda Counting<<"); //var voterCount = task.SelectMany(t => t.Value).Distinct().Count(); var groupVotes = GroupRankVotes.GroupByVoteAndRank(task); var rankedVotes = from vote in groupVotes select new { Vote = vote.VoteContent, Rank = RankVote(vote.Ranks) }; var orderedVotes = rankedVotes.OrderBy(a => a.Rank); RankResults results = new RankResults(); results.AddRange(orderedVotes.Select(a => new RankResult(a.Vote, $"BordaNorm: [{a.Rank:f5}]"))); return(results); }
/// <summary> /// Gets the winning options in order of preference, based on the winning paths. /// </summary> /// <param name="winningPaths">The winning paths.</param> /// <param name="listOfChoices">The list of choices.</param> /// <returns>Returns a list of </returns> private RankResults GetResultsInOrder(int[,] winningPaths, List <string> listOfChoices) { int count = listOfChoices.Count; var availableIndexes = Enumerable.Range(0, count); var pathCounts = from index in availableIndexes select new { Index = index, Choice = listOfChoices[index], Count = GetPositivePathCount(winningPaths, index, count), Sum = GetPathSum(winningPaths, index, count) }; var orderPaths = pathCounts.OrderByDescending(p => p.Count).ThenByDescending(p => p.Sum).ThenBy(p => p.Choice); RankResults results = new RankResults(); results.AddRange(orderPaths.Select(path => new RankResult(listOfChoices[path.Index], $"Schulze: [{path.Count}/{path.Sum}]"))); return(results); }