Don't duplicate SA-only judges for all rounds for all special awards (only duplicate them enough to satisfy their special awards requests in the specific rounds the award is judges). Fix a bug where the last jduges would get replcaed by a duplicate of the 2nd last judge for multi-round special awards.

This commit is contained in:
dave 2010-04-03 23:10:05 +00:00
parent 8f063c1ec1
commit 0661224a0b

View File

@ -172,13 +172,11 @@ function judges_cost_function($annealer, $bucket_id, $ids)
} }
/* Huge penalty for a team without a willing chair, but only if the min judges per team >1 */ /* Huge penalty for a team without a willing chair, but only if the min judges per team >1 */
if(!$have_chair && $config['min_judges_per_team']>1) if(!$have_chair && $config['min_judges_per_team']>1) $cost += 40;
$cost += 40;
/* Huge penalty for not having a round2 person on the team */ /* Huge penalty for not having a round2 person on the team */
if($round_divisional2 != NULL) { if($round_divisional2 != NULL) {
if($have_div2 == false) if($have_div2 == false) $cost += 40;
$cost += 40;
} }
/* Small penalty for a jteam with no experience whatsoever */ /* Small penalty for a jteam with no experience whatsoever */
@ -471,6 +469,7 @@ set_status("Loading Judges");
$judges = judges_load_all(); $judges = judges_load_all();
foreach($judges as &$j) { foreach($judges as &$j) {
if($j['judge_active'] == 'no') { if($j['judge_active'] == 'no') {
TRACE(" {$j['name']} has their judge profile deactivated, skipping.\n"); TRACE(" {$j['name']} has their judge profile deactivated, skipping.\n");
@ -540,7 +539,7 @@ foreach($judges as &$j) {
* round2 judge per team */ * round2 judge per team */
$j['available_for_divisional2'] = judge_available_for_round($j, $round_divisional2); $j['available_for_divisional2'] = judge_available_for_round($j, $round_divisional2);
} }
unset($j);
TRACE("Loaded ".count($judges)." judges\n"); TRACE("Loaded ".count($judges)." judges\n");
$jteam[0]['max_judges'] = count($judges); $jteam[0]['max_judges'] = count($judges);
@ -900,13 +899,6 @@ function judges_sa_cost_function($annealer, $bucket_id, $ids)
if($bucket_id == 0) { if($bucket_id == 0) {
/* This is the placeholder */ /* This is the placeholder */
$cost = count($ids) * 50; $cost = count($ids) * 50;
/* But check for judges who should be on a special award */
for($x=0; $x<count($ids); $x++) {
$j =& $judges[$ids[$x]];
if($j['special_award_only'] == 'yes') {
$cost += 500;
}
}
return $cost; return $cost;
} }
@ -964,6 +956,7 @@ function judges_sa_cost_function($annealer, $bucket_id, $ids)
return $cost; return $cost;
} }
if($config['scheduler_enable_sa_scheduling'] == 'yes') { if($config['scheduler_enable_sa_scheduling'] == 'yes') {
TRACE("Finding judges for special award round(s)\n"); TRACE("Finding judges for special award round(s)\n");
@ -973,17 +966,14 @@ if($config['scheduler_enable_sa_scheduling'] == 'yes') {
$total_judges = 0; $total_judges = 0;
foreach($judges as &$j) { foreach($judges as &$j) {
TRACE(" {$j['firstname']} {$j['lastname']}\n");
foreach($round_special_awards as &$r) { foreach($round_special_awards as &$r) {
if(judge_available_for_round($j, $r) == true) { if(judge_available_for_round($j, $r) == true) {
if($j['special_award_only'] == 'yes') { TRACE(" {$r['name']} yes\n");
for($i=0;$i<count($j['special_awards']);$i++) { $r['available_judge_ids'][] = $j['id'];
$r['available_judge_ids'][] = $j['id']; $total_judges++;
$total_judges++; /* It's ok to count the same judge twice */ } else {
} TRACE(" {$r['name']} no\n");
} else {
$r['available_judge_ids'][] = $j['id'];
$total_judges++; /* It's ok to count the same judge twice */
}
} }
} }
} }
@ -1091,7 +1081,6 @@ if($config['scheduler_enable_sa_scheduling'] == 'yes') {
} }
} }
} }
} }
/* If there are no SA-only judges, skip the pre-assignment */ /* If there are no SA-only judges, skip the pre-assignment */
@ -1116,7 +1105,10 @@ if($config['scheduler_enable_sa_scheduling'] == 'yes') {
/* If the max judges for the jteam is less than the max, update the max, /* If the max judges for the jteam is less than the max, update the max,
* this prevents the scheduler from trying to remove sa-only judges * this prevents the scheduler from trying to remove sa-only judges
* from the jteam because of the over-max cost penalty */ * from the jteam because of the over-max cost penalty */
if($jt['max_judges'] < count($sa_judges)) $jt['max_judges'] = count($sa_judges); if($jt['max_judges'] < count($sa_judges)) {
TRACE(" Changing max_judges to ". count($sa_judges)." to accomodate all SA-only judge requests.\n");
$jt['max_judges'] = count($sa_judges);
}
} }
unset($jt); unset($jt);
@ -1149,6 +1141,41 @@ if($config['scheduler_enable_sa_scheduling'] == 'yes') {
$round_special_awards[$highest_offset]['assigned_judges'] += $jt['min_judges']; $round_special_awards[$highest_offset]['assigned_judges'] += $jt['min_judges'];
TRACE("Assigned Team {$jt['name']} to Round {$round_special_awards[$highest_offset]['name']}\n"); TRACE("Assigned Team {$jt['name']} to Round {$round_special_awards[$highest_offset]['name']}\n");
} }
unset($jt);
/* Now that teams have been assigned to rounds, search for all the
* SA only judges again, and duplicate the available judge id if they are signed
* up to judge more than one award in the round */
foreach($judges as &$j) {
if($j['special_award_only'] == 'no') continue;
foreach($round_special_awards as &$r) {
$count = 0;
if(judge_available_for_round($j, $r) == false) continue;
/* Find out how many of their special awards are in this round. */
foreach($sa_jteam as $jt_id=>&$jt) {
/* Is the team in this round? */
if(!in_array($jt_id, $r['jteam_ids'])) continue;
/* Is this SA judge requsing an award judged by this team? */
foreach($jt['award_ids'] as $aid) {
if(in_array($aid, $j['special_awards']))
$count++;
}
}
unset($jt);
while($count > 1) {
$r['available_judge_ids'][] = $j['id'];
$count--;
TRACE(" Duplicate {$j['firstname']} {$j['lastname']} for multiple SA-only request in round {$r['name']}\n");
}
}
unset($r);
}
unset($j);
/* Now, anneal in each special award round */ /* Now, anneal in each special award round */
foreach($round_special_awards as $r) { foreach($round_special_awards as $r) {
@ -1156,6 +1183,7 @@ if($config['scheduler_enable_sa_scheduling'] == 'yes') {
$current_jteam_ids = $r['jteam_ids']; $current_jteam_ids = $r['jteam_ids'];
$judge_ids = $r['available_judge_ids']; $judge_ids = $r['available_judge_ids'];
$e = $config['effort']; $e = $config['effort'];
$a = new annealer(count($r['jteam_ids']), 25, $e, 0.98, $a = new annealer(count($r['jteam_ids']), 25, $e, 0.98,
judges_sa_cost_function, $judge_ids); judges_sa_cost_function, $judge_ids);
@ -1167,6 +1195,7 @@ if($config['scheduler_enable_sa_scheduling'] == 'yes') {
unset($t); unset($t);
unset($tid); unset($tid);
foreach($r['jteam_ids'] as $tid) { foreach($r['jteam_ids'] as $tid) {
if($tid == 0) { if($tid == 0) {
$x++; $x++;