Wedstrijdschema genereren
Om een wedstrijdschema te generen heb ik het volgende script:
Resultaat:
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?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];
}
}
}
?>
/*
$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:
Code (php)
1
2
3
4
5
2
3
4
5
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
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.
Gewijzigd op 08/07/2012 16:04:50 door Ger van Steenderen
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.
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.
Gewijzigd op 09/07/2012 14:55:40 door Ger van Steenderen
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 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.
Hoi,
De werkwijze is juist. Deze methode word took in schaken/dammen en vele andere sporten van systeem volgens all-play-all.
Zelf heb ik een vb.net programma geschreven. dus stand alone.
Je kan dit vinden op: http://www.janr.be/#wintabel Er staat wel niet de laatste versie.
Een lijst van deze paring kan je vinden op: http://www.janr.be/sc_post-gent/parings_lijsten_4-50.pdf ene http://www.janr.be/sc_post-gent/parings_lijsten_50-150.pdf
Jan
De werkwijze is juist. Deze methode word took in schaken/dammen en vele andere sporten van systeem volgens all-play-all.
Zelf heb ik een vb.net programma geschreven. dus stand alone.
Je kan dit vinden op: http://www.janr.be/#wintabel Er staat wel niet de laatste versie.
Een lijst van deze paring kan je vinden op: http://www.janr.be/sc_post-gent/parings_lijsten_4-50.pdf ene http://www.janr.be/sc_post-gent/parings_lijsten_50-150.pdf
Jan
Ik heb hier wel interesse in Ger!




