summaryrefslogtreecommitdiff
path: root/lib/scheduling/round_robin.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/scheduling/round_robin.rb')
-rw-r--r--lib/scheduling/round_robin.rb70
1 files changed, 70 insertions, 0 deletions
diff --git a/lib/scheduling/round_robin.rb b/lib/scheduling/round_robin.rb
new file mode 100644
index 0000000..c0d68d3
--- /dev/null
+++ b/lib/scheduling/round_robin.rb
@@ -0,0 +1,70 @@
+# http://stackoverflow.com/questions/6648512/scheduling-algorithm-for-a-round-robin-tournament
+module Scheduling
+ class RoundRobin
+ include Rails.application.routes.url_helpers
+
+ def initialize(tournament_stage)
+ @tournament_stage = tournament_stage
+ end
+
+ def create_matches
+ # => find the number of matches and teams to create
+ @num_teams = (tournament.players.count/tournament.min_players_per_team).floor
+ @matches_per_round = (@num_teams / tournament.min_teams_per_match).floor
+
+ # => initialize data and status members
+ @team_pairs ||= Array.new
+ if @team_pairs.empty?
+ @matches_finished = 0
+ end
+
+ # => Create new matches
+ @matches_per_round.times do
+ tournament_stage.matches.create(status: 0, submitted_peer_evaluations: 0)
+ end
+
+ # => seed the first time
+ if @team_pairs.empty?
+ tournament_stage.seeding.seed(tournament_stage)
+ tournament_stage.matches.each {|match| match.teams.each {|team| @team_pairs.push team}}
+ else
+ # => Reorder the list of teams
+ top = @team_pairs.shift
+ @team_pairs.push @team_pairs.shift
+ @team_pairs.unshift top
+
+ # => Add the teams to the matches
+ match = tournament_stage.matches[@matches_finished-1]
+ matches = 1
+ (0..@team_pairs.count-1).each do |i|
+ match.teams += @team_pairs[i]
+ if @team_pairs.count.%(tournament.min_teams_per_match).zero?
+ match = tournament_stage.matches[@matches_finished-1 + matches]
+ matches += 1
+ end
+ end
+
+ end
+
+ # => Set the match statuses to ready (1)
+ tournament_stage.matches.each {|match| match.update(status: 1)}
+
+ end
+
+ def finish_match(match)
+ @matches_finished += 1
+ end
+
+ def graph(current_user)
+ end
+
+ private
+ def tournament_stage
+ @tournament_stage
+ end
+
+ def tournament
+ tournament_stage.tournament
+ end
+ end
+end