Om een wedstrijdschema te generen heb ik het volgende script:

<?php
/*
$resCompetitors = mysql_query("SELECT
			competitor_id
		FROM
			" . $table_prefix . "competitors
		ORDER BY RAND()");
$arrCompetitors = array();
while ($row = mysql_fetch_row($resCompetitors)) {
	$arrCompetitors[] = $row[0];
}
*/
$arrCompetitors = array(1,2,3,4,5,6,7,8,9);
if (count($arrCompetitors) % 2 != 0) {
	//maak een fake deelnemer
	$arrCompetitors[] = 0;
}
$n = count($arrCompetitors); //aantal ronden
$rounds = $n - 1;
$shedule = array();
for ($r = 1; $r <= $rounds; $r++) {
	for ($i = 1; $i <= $n / 2; $i++) {
		if ($i == 1) $shedule[$r] = array();
		$homeindex = ($i==1)? 1 : (($r+$i-2) % ($n-1) +2);
		$awayindex = ($n - 1 + $r - $i) % ($n -1) +2 ;
		if ($r % 2 == 0) {
			$swap = $homeindex;
			$homeindex = $awayindex;
			$awayindex = $swap;
		}
		if ($arrCompetitors[$homeindex-1] != 0 && $arrCompetitors[$awayindex-1] != 0) {
			$shedule[$r][] =  $arrCompetitors[$homeindex-1] . ' - ' . $arrCompetitors[$awayindex-1];
		}
	}
}
?>

Resultaat:

Ronde 1 Ronde 2 Ronde 3 Ronde 4 Ronde 5 Ronde 6 Ronde 7 Ronde 8 Ronde 9
1 - 2   3 - 1   1 - 4   5 - 1   1 - 6   7 - 1   1 - 8   9 - 1   2 - 9
4 - 9   2 - 4   5 - 3   4 - 6   7 - 5   6 - 8   9 - 7   7 - 2   3 - 8
5 - 8   9 - 6   6 - 2   3 - 7   8 - 4   5 - 9   2 - 5   6 - 3   4 - 7
6 - 7   8 - 7   8 - 9   2 - 8   9 - 3   3 - 2   3 - 4   5 - 4   5 - 6

Op zich een vrij redelijk resultaat (in ieder geval kloppend), maar bv deelnemer 5 speelt 2x twee thuiswedstrijden achter elkaar, dus ik vroeg me af of er misschien een betere methode is dan deze.
Ben zelf ook nog wat aan het zoeken geweest, maar tot op heden niks beters gevonden.
Nu is deze methode (round robin) waterdicht en op zich vrij straight forward dus heb ik naar andere manieren gezocht (en gevonden) om het resultaat te verbeteren.
Bij een oneven aantal deelnemers 'voeg' ik de fake deelnemer aan het begin van de array in, waardoor deze het draaipunt wordt en dus de opeenvolgende thuiswedstrijden in de eerste helft van het (halve) speelschema komen te vervallen.
Bij een even aantal deelnemers bewerkstellig ik dat zelf door de laatse wedstrijd van een even speelronde alleen te swappen indien die in de eerste helft plaats vind.
Even een bump naar aanleiding van een ander topic.
Ik pas dit inmiddels al vaker toe en heb het ook gekoppeld aan een invoer in een database.
Als er interesse hiervoor bestaat zal ik het plaatsen in scripts lib.
Ik heb hier wel interesse in Ger!

Reageren