Toon posts:

[PHP] Duels schedulen voor X spelers

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben momenteel bezig aan een script dat gegeven X spelers, X-1 speeldagen scheduled. Op elke dag speelt een speler dus tegen een ander spelen. Totaal zijn er dus X*(X-1)/2 partijen over X-1 dagen.

Voor 8 spelers heb ik het volgende schema:
code:
1
2
3
4
5
6
7
(1 8)(2 7)(3 6)(4 5)
(1 7)(2 8)(3 5)(4 6)
(1 5)(2 6)(3 7)(4 8)
(1 6)(2 5)(3 8)(4 7)
(1 4)(2 3)(5 6)(7 8)
(1 3)(2 4)(5 8)(7 6)
(1 2)(3 4)(5 7)(6 8)

Een groepje van 2 stelt dus een partij voor, en een lijn is een speeldag. Mijn probleem is echter dat ik geen geldig algoritme vind om deze (X-1)*X matrix op te stellen.

Zoeken op het internet levert me wel algoritmes op om permutaties te maken, maar het is veel te onefficient om alle X! permutaties te maken, en dan te kijken welke er geldig zijn. Ik kan natuurlijk 1 keer een run doen om voor een bepaalde X zo een matrix op te stellen, en die dan hard-coded in het programma te zetten, maar dat is geen mooie oplossing vind ik :)

Ik wilde het eens in Prolog proberen, want ik ben er zeker van dat het daar makkelijk in is, maar ik vind m'n cursus van 2 jaar geleden helaas niet meer... :(

Is er dus iemand die me hiermee kan helpen of nuttige tips heeft ?

  • tomato
  • Registratie: November 1999
  • Niet online
Stel je hebt team[1] t/m team[X] en ieder team heeft wedstrijd[1] t/m wedstrijd[X-1].

De tegenstander van team[A] op speeldag[B] wordt dan team[A+B], behalve als A+B > X, dan wordt het team[A+B-X].

Alle teams[C] voor C is oneven spelen op een de oneven speeldagen en alle teams[D] voor D is even spelen op de even speeldagen.

[edit]
Dit is uiteraard maar een voorbeeld

Verwijderd

Topicstarter
Ik snap het algoritme, maar kennelijk klopt het niet (of doe ik het fout) want dit krijg ik:
code:
1
2
3
4
5
6
7
SPEELDAG 1: (1 2) (3 4) (5 6) (7 8) 
SPEELDAG 2: (2 4) (4 6) (6 8) (8 2) 
SPEELDAG 3: (1 4) (3 6) (5 8) (7 2) 
SPEELDAG 4: (2 6) (4 8) (6 2) (8 4) 
SPEELDAG 5: (1 6) (3 8) (5 2) (7 4) 
SPEELDAG 6: (2 8) (4 2) (6 4) (8 6) 
SPEELDAG 7: (1 8) (3 2) (5 4) (7 6)

De even speeldagen zijn dus verkeerd. Dit is de PHP code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?
$size=8;
//Speeldag
for($i=1;$i<$size;$i++) {
    echo "SPEELDAG $i: ";
    //Team
    for($j=1;$j<=$size;$j++) {
        if (($i%2==0 &amp;&amp; $j%2==0) || ($i%2!=0 &amp;&amp; $j%2!=0)) {
            $k=$j+$i;
            if ($k>$size)
                $k-=$size;
            echo "($j $k) ";
        }
    }
    echo "<br>";
}
?>

Verwijderd

Topicstarter
*dubbelpost*

Verwijderd

ik denk dat ik wel iets heb.

je maakt 2 'rijen': 1 t/m 4 & 5 t/m 8, die set je tegenover elkaar:

1 5
2 6
3 7
4 8

dan schuif je de 2e rij 1 naar boven:

1 6
2 7
3 8
4 5

etc, etc. totdat je 4 rijen hebt, vervolgens doe je het zelfde met deze rijen:

1 2
3 4
5 6
7 8

en tada, je hebt alle matches. :)

kdenk dus dat je met arrays moet werken, ben er niet zo goe din, maar ik denk dat je me idee wel snapt.

Verwijderd

hier is een oplossing: de getallen in ketting ronddraaien, maar 1 getal vast laten staan (bvb. de 1).

voor ne groep van 6 krijgde dan (elke kolom een matchweek)

16 15 14 13 12
25 64 53 42 36
34 23 62 51 45

Verwijderd

Topicstarter
Tnx voor de moeite iedereen. Shi jouw oplossing is dus niet de goede zoals we al weten :)

Ik zal dat algoritme van smurf es verder testen, maar ik denk dat dat wel een goede oplossing geeft. Tnx again !

Verwijderd

Dit is ff mijn ID, hoe en of het mogeljik is in PHP moet ge zelf maar proberen. De denkwijze is dacht ik wel correct.

Neem gewoon alle mogelijkheden, verwijder gelijke combo's (x-x)
igv een even aantal spelers zijn er slechts (aant spelers/2) combo's per week mogelijk.
Per week begin je met een bepaalde combo, zoek verder op combo's die geen reeds gebruikte x bevatten. Op een gegeven moment heb je uw (aant spelers/2) combo's voor die week.
Verwijder deze gebruikte combo's uit uw lijst.
Begin opnieuw voor de volgende week met een nieuwe combo en de geupdate lijst.

Dit systeem heeft terugmatches ook ingebouwd, vermits 1-2 en 2-1 als verschillend beschouwd worden.
Om zonder terugmatches te spelen, moeten deze gefilterd worden.

Voor een oneven aantal spelers zit je met 1 speler per week die "rust" heeft.
Hier moet je na (aant spelers/2) resultaten bekomen te hebben de overblijvende speler op rust zetten.

Verwijderd

Topicstarter
http://www.gunpower.be/gs.php

Godsmurf zijn idee is dus juist :)
Pagina: 1