From e34f620386bb1c898ba790a6ec74224df19cde50 Mon Sep 17 00:00:00 2001 From: mattc-catalyst Date: Thu, 18 Oct 2007 00:40:04 +0000 Subject: [PATCH] groups/autogroup: Allocate members to groups more fairly Author: Matt Clarkson --- group/autogroup.php | 34 +++++++++++++++++++++++++++------- lang/en_utf8/group.php | 2 ++ 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/group/autogroup.php b/group/autogroup.php index 4e0b3fa2ca3..c6a9e49cfff 100644 --- a/group/autogroup.php +++ b/group/autogroup.php @@ -11,6 +11,8 @@ require_once('../config.php'); require_once('autogroup_form.php'); +define('AUTOGROUP_MIN_RATIO', 0.7); + $courseid = required_param('courseid', PARAM_INT); if (!$course = get_record('course', 'id',$courseid)) { @@ -93,37 +95,55 @@ if ($editform->is_cancelled()) { $groups = array(); $i = 0; $cnt = 0; - + + // Plan the allocation if ($data->groupby == 'groups') { $numgrps = $data->number; $userpergrp = ceil($usercnt/$numgrps); } else { - $numgrps = ceil($data->number/$usercnt); - $userpergrp = $data->number; + $numgrps = ceil($usercnt/$data->number); + $userpergrp = $data->number > $usercnt ? $usercnt : $data->number; + + // If there would be one group with a small number of member reduce the number of groups + $remainder = $userpergrp - ($userpergrp * $numgrps - $usercnt); + if ($remainder && $remainder < $userpergrp * AUTOGROUP_MIN_RATIO) { + $numgrps--; + } } + // Do the allocation + $remainggroups = $numgrps; + $remaingusers = $usercnt; + foreach($users as $id => $user) { if (!isset($groups[$i])) { // Create a new group $groups[$i]['name'] = groups_parse_name($data->namingschemegrp['namingscheme'], $i); } @$groups[$i]['members'][] = &$users[$id]; $cnt++; - if ($cnt == $userpergrp) { + + if ($cnt >= round($usercnt / $remainggroups)) { + $usercnt -= $cnt; $cnt = 0; $i++; + $remainggroups--; } } if (isset($data->preview)) { /// Print the groups preview - $preview = '