Ploegen - wedstrijdkalender

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Top Low-Code Developer Gezocht!

Bedrijfsomschrijving Unieke Kansen, Uitstekende Arbeidsvoorwaarden & Inspirerend Team Wij zijn een toonaangevende, internationale organisatie die de toekomst van technologie vormgeeft door het creëren van innovatieve en baanbrekende oplossingen. Ons succes is gebaseerd op een hecht en gepassioneerd team van professionals die altijd streven naar het overtreffen van verwachtingen. Als jij deel wilt uitmaken van een dynamische, vooruitstrevende en inspirerende werkomgeving, dan is dit de perfecte kans voor jou! Functieomschrijving Als Low-Code Developer ben je een cruciaal onderdeel van ons team. Je werkt samen met collega's uit verschillende disciplines om geavanceerde applicaties te ontwikkelen en te optimaliseren met behulp van Low-code

Bekijk vacature »

Ruben Vanhoeyveld

Ruben Vanhoeyveld

20/12/2011 00:30:07
Quote Anchor link
Hallo iedereen,

Ik zit met een probleem... Ik probeer het even uit te leggen:

Er zijn in een competitie 16 ploegen. Elk van deze ploegen moet elke week tegen één van de overige 15 ploegen spelen. Logischerwijs duurt dit dan 15 weken (want een ploeg speelt niet tegen zichzelf). Dit deel kan je beschouwen als de thuiswedstrijden. Maar hier komen ook de wedstrijden op verplaatsing bij. Nog eens 15 weken. In het totaal dus 30 weken. Het komt erop neer dat (als voorbeeld) bij ploegen A, B en C de volgende wedstrijden horen:

A - B
A - C
B - A
B - C
C - A
C - B

Maar dit dan voor meer ploegen... Ik probeer een script te schrijven dat dit voor eender't welk aantal ploegen kan genereren. Achteraf worden de waarden gewoon weggeschreven naar de database.

Regels?
- Elke week kan een ploeg maar 1 wedstrijd spelen. (8 wedstrijden per week in het totaal over alle ploegen, in het voorbeeld van 16 ploegen)
- Een ploeg mag maar 1 keer tegen elke andere ploeg spelen gedurende de eerste 15 weken (15 weken in het voorbeeld van 16 ploegen natuurlijk)

Wat bij een oneven aantal ploegen?
Dan wordt er gewoon een extra ploeg "vrij" toegevoegd, wat er dan op duidt dat de tegenstander die week geen wedstrijd hoeft te spelen.


Probeersel 1
Ik had iets uitgedacht dat als volgt zou werken: (de cijfers stellen ploegen voor)
1 - 16
2 - 15
3 - 14
...
8 - 9
Je ziet hierin een rechthoek. De ploegen links spelen tegen de ploegen rechts. Na het opslaan van de wedstrijden, zou elk element doorgeschoven worden volgens de richting van de klok. Maar dan sla je telkens een getal over... Je moet het maar eens een paar keer proberen.. Hier zie je de situatie na de eerste doorschuifbeurt:
2 - 1
3 - 16
4 - 15
...
9 - 10

De code hiervoor, was:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
$array
= array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16); // ploegen

if(count($array)%2 != 0){ //dan is het oneven
    array_push($array,'Vrij');
}


function
schuifDoor(&$array){
    $loopvoorwaarde = (count($array)-1);
    $tmp = $array[0];
    for($k=0; $k < $loopvoorwaarde; $k++){
        $array[$k] = $array[$k+1];
    }

    $array[count($array)-1] = $tmp;
}


for($i = 1; $i <= (2*count($array)); $i++){ // voor het totaal aantal weken (30)
    for($j=1; $j <= (count($array)/2); $j++){ // voor het aantal wedstrijden per week (8)
        $ploeg1 = $array[$j-1]; // 0 1
        $ploeg2 = $array[count($array)-$j]; // 15 14
        echo 'Week '.$i.' '.$ploeg1.' ' .$ploeg2.'<br>';
    }

    echo '<br>';
    schuifDoor($array);
}
?>



Probeersel 2
Ik dacht, ik neem 2 random van elkaar verschillende ploegen uit die reeks van 16 ploegen. Dan kijk ik na of die al in de database staan. Ik kijk of ze eerder (in een andere week) al tegen elkaar gespeeld hebben. Is dit niet zo, kunnen ze deze week tegen elkaar spelen. Dan kijk ik of ze in deze week al voorkomen in een andere wedstrijd. Als dat niet het geval is, kunnen ze tegen elkaar spelen.

Het lijkt een goed idee, maar dat is het niet. De code loopt goed tot ongeveer 2 à 3 weken. Het probleem is dat binnenin een week, bij de laatste wedstrijd, er nog 2 ploegen over zijn die met elkaar kunnen worden gekoppeld. Maar als deze ploegen in het verleden al tegen elkaar hebben gespeeld, gaat het script niet door. Daar blijft de loop verder draaien en krijg ik time-out omdat er toch geen andere oplossing is.

Dit is de code hiervoor:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?php
include('../../config.php');

$array = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16); // ploegen

for($i = 1; $i <= (2*(count($array)-1)); $i++){
    
    if($i <= 15){ // heenwedstrijden (ik ga er hier van uit dat het er 15 zijn, volgens het voorbeeld van 16 ploegen)
        
        do{
            do{
                $ploeg1 = $array[rand(0,(count($array)-1))]; // kies random ploeg
                do{
                    $ploeg2 = $array[rand(1,(count($array)-1))]; // kies random ploeg
                }while($ploeg1 == $ploeg2); // zolang ploeg2 gelijk is aan ploeg 1
                
                //check in database of één van deze ploegen deze week al speelt.
                //... WAAR (p1 of p2 deze week al spelen) OF (p1 en p2 al tegen elkaar spelen)

                $checkdb = mysql_query("
                SELECT *
                FROM edc_wedstrijden WHERE ((ploeg1="
.$ploeg1." OR ploeg2=".$ploeg1." OR ploeg1=".$ploeg2." OR ploeg2=".$ploeg2.") AND week=".$i.") OR ((ploeg1=".$ploeg1." AND ploeg2=".$ploeg2.") OR (ploeg1=".$ploeg2." AND ploeg2=".$ploeg1."))") or die(mysql_error());
                
            }
while(mysql_num_rows($checkdb) != 0); // zolang het resultaat niet nul is, blijven we twee ploegen zoeken.
            
            //als we twee ploegen gevonden hebben, voegen we ze hier toe.

            mysql_query("INSERT INTO edc_wedstrijden SET week=".$i.", ploeg1=".$ploeg1.", ploeg2=".$ploeg2."");
            
            //tel aantal wedstrijden
            $countdb = mysql_num_rows(mysql_query("SELECT * FROM edc_wedstrijden WHERE week=".$i.""));
        }
while($countdb != (count($array)/2)); // zolang aantal wedstrijden niet gelijk is aan de helft van aantal ploegen (zodat iedereen dus speelt)
        
    }elseif($i <= 30){ // terugwedstrijden
        
        do{
            do{
                $ploeg1 = $array[rand(0,(count($array)-1))]; // kies random ploeg
                do{
                    $ploeg2 = $array[rand(1,(count($array)-1))];// kies random ploeg
                }while($ploeg1 == $ploeg2); // zolang ploeg2 gelijk is aan ploeg 1
                
                //check in database of één van deze ploegen deze week al speelt.
                //... WAAR (p1 of p2 deze week al spelen) OF (p1 en p2 al TWEE KEER tegen elkaar spelen)

                $checkdb = mysql_query("SELECT * FROM edc_wedstrijden WHERE ((ploeg1=".$ploeg1." OR ploeg2=".$ploeg1." OR ploeg1=".$ploeg2." OR ploeg2=".$ploeg2.") AND week=".$i.") OR ((ploeg1=".$ploeg1." AND ploeg2=".$ploeg2.") AND (ploeg1=".$ploeg2." AND ploeg2=".$ploeg1."))") or die(mysql_error());
                
            }
while(mysql_num_rows($checkdb) != 0); // zolang het resultaat niet nul is, blijven we twee ploegen zoeken.
            
            //als we twee ploegen gevonden hebben, voegen we ze hier toe.

            mysql_query("INSERT INTO edc_wedstrijden SET week=".$i.", ploeg1=".$ploeg1.", ploeg2=".$ploeg2."");
            
            //tel aantal wedstrijden
            $countdb = mysql_num_rows(mysql_query("SELECT * FROM edc_wedstrijden WHERE week=".$i.""));
        }
while($countdb != (count($array)/2)); // zolang aantal wedstrijden niet gelijk is aan de helft van aantal ploegen (zodat iedereen dus speelt)
        
    }
    
}
?>


Dit krijg je dan in de database te zien:
Afbeelding
Hier is het duidelijk dat de enige overblijvende waarden in week 2: 1 en 3 zijn. ploegen 1 en 3 speelden in week 1 al tegen elkaar. Daarom werkt dit script dus niet.


Wie kan me verder helpen? Vindt iemand hier misschien een bestaand script voor? Ik vond niets.

Vriendelijke groeten
Ruben
Gewijzigd op 20/12/2011 00:30:58 door Ruben Vanhoeyveld
 
PHP hulp

PHP hulp

24/11/2024 09:16:04
 
Erwin H

Erwin H

20/12/2011 08:11:55
Quote Anchor link
Leuk probleem :-)

Optie 3: begin als in optie 1, maar mix aan het eind de weken door elkaar. Dit kan door random de weken te kiezen, of via een klein algoritme, bijvoorbeeld je maakt de volgorde: 1, n, 2, n-1, 3,.... Etc

Anders dan dat vraag ik me een beetje af wat je vraag is. :-)
 
Ruben Vanhoeyveld

Ruben Vanhoeyveld

20/12/2011 11:46:53
Quote Anchor link
Hiermee lukt het. Elke ploeg speelt 1 keer tegen elke andere ploeg, telkens afwisselend van locatie (ploeg 1 zal afwisselend links en rechts staan). Na de "heenwedstrijden", worden de terugwedstrijden gespeeld. Eerst kwam ploeg 1 telkens in de eerste wedstrijd van de 8 wedstrijden te staan. Dit heb ik dan geshuffled :)


Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
37
38
<?php

include('../../config.php');

$array = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16); // ploegen

if(count($array)%2 != 0){
    array_push($array,'Vrij');
}

function
schuifDoor(&$array){
    $a = array_shift($array);
    $b = array_shift($array);
    $array[] = $b;
    array_unshift($array,$a);
}


srand(time(0));

for($i = 1; $i <= 2*(count($array)-1); $i++){ // voor het totaal aantal weken (30)
    for($j=0; $j <= (count($array)/2); $j++){ // voor het aantal wedstrijden per week (8)
        do{
            $volgnr = rand(1,8);
            $volgnrquery = mysql_query("SELECT * FROM edc_wedstrijden WHERE week=".$i." AND volgnr=".$volgnr."");
        }
while(mysql_num_rows($volgnrquery) == 1);
        $team1 = $array[$j-1];
        $team2 = $array[count($array)-$j];
        if($i%2==1){
            //echo 'Week '.$i.' '.$team1.' ' .$team2."<br>";
            mysql_query("INSERT INTO edc_wedstrijden SET volgnr=".$volgnr.", week=".$i.", ploeg1=".$team1.", ploeg2=".$team2."");
        }
else{
            //echo 'Week '.$i.' '.$team2.' ' .$team1."<br>";
            mysql_query("INSERT INTO edc_wedstrijden SET volgnr=".$volgnr.", week=".$i.", ploeg1=".$team2.", ploeg2=".$team1."");
        }
    }

    //echo "<br>";
    schuifDoor($array);
}
?>
 
- SanThe -

- SanThe -

20/12/2011 13:16:56
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?php
$ploegletter
= range('A', 'P');
$ploegen = count($ploegletter);
$wedstrijden = $ploegen*($ploegen-1);
$perweek = $ploegen/2;
$weken = $wedstrijden/$perweek;

echo 'Totaal aantal ploegen: ' . $ploegen . '<br />';
echo 'Totaal aantal wedstrijden: ' . $wedstrijden . '<br />';
echo 'Wedstrijden per week: ' . $perweek . '<br />';
echo 'Totaal aantal weken: ' . $weken . '<br /><br />';

$array = array();
for($i=0; $i<$ploegen; $i++)
{

    for($j=0; $j<$ploegen; $j++)
    {

        if($i != $j)
        {

            $array[] = $ploegletter[$i] . ' - ' . $ploegletter[$j];
            $array[] = $ploegletter[$j] . ' - ' . $ploegletter[$i];
        }
    }
}


$array = array_unique($array);
sort($array);
$count = count($array);
$indeling = array('');

for($k=0; $k<$count; $k++)
{

    if(!in_array($array[$k], $indeling))
    {

        $j = $k-1;
        for($i=$k; $i<$count; $i++)
        {

            $zoek = array();
            for($z=1; $z<=$perweek; $z++)
            {

                do
                {
                    $j++;
                    $j%=$count;
                }
while(in_array($array[$j], $indeling) or (in_array($array[$j][0], $zoek) or in_array($array[$j][4], $zoek)));
                $zoek[] = $array[$j][0];
                $zoek[] = $array[$j][4];
                $indeling[] = $array[$j];
            }

            $indeling[] = '';
            break;
        }
    }
}


$week = 1;
foreach($indeling as $value)
{

    if($value == '')
    {

        echo '<br />Week ' . $week;
        $week++;
    }

    echo $value . '<br />';
}


?>
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

20/12/2011 16:05:10
Quote Anchor link
Bij komend probleem: een ploeg moet om en om thuis en uit spelen (voor zover mogelijk)

Toevoeging op 20/12/2011 17:16:18:

Ben toevallig met een soort gelijk iets bezig. Zover ben ik inmiddels:
Omdat het genereren van een competitie programma een 'eenmalig' iets is dacht ik om met temp tables te gaan werken. De eerste stap is simpel, we maken een eerst een temp tabel met alle wedstrijden en die vullen we als volgt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
$sql
= "INSERT INTO temp_comp (home_team, away_team) VALUES ";
for ($i=1, $i <= 16, $i++) {
     for ($j=1, $j<=16), $j++) {
        if ($j != $i) {
            $sql .= "('" . $i . "','" . $j . "'),":
        }
    }
}

$sql = substr($sql, 0, -1);
?>

So far, so good maar nu moet natuurlijk alles worden ingedeeld op datum.
Daar loop ik nu een beetje mee te worstelen, niet zozeer in sql maar in de app
 
Ruben Vanhoeyveld

Ruben Vanhoeyveld

20/12/2011 18:13:49
Quote Anchor link
(Reactie op Ger van Steenderen)

Ger van Steenderen op 20/12/2011 16:05:10:
Bij komend probleem: een ploeg moet om en om thuis en uit spelen (voor zover mogelijk)

Toevoeging op 20/12/2011 17:16:18:

Ben toevallig met een soort gelijk iets bezig. Zover ben ik inmiddels:
Omdat het genereren van een competitie programma een 'eenmalig' iets is dacht ik om met temp tables te gaan werken. De eerste stap is simpel, we maken een eerst een temp tabel met alle wedstrijden en die vullen we als volgt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
$sql
= "INSERT INTO temp_comp (home_team, away_team) VALUES ";
for ($i=1, $i <= 16, $i++) {
     for ($j=1, $j<=16), $j++) {
        if ($j != $i) {
            $sql .= "('" . $i . "','" . $j . "'),":
        }
    }
}

$sql = substr($sql, 0, -1);
?>

So far, so good maar nu moet natuurlijk alles worden ingedeeld op datum.
Daar loop ik nu een beetje mee te worstelen, niet zozeer in sql maar in de app


Het "probleem" van afwisselend thuis en op verplaatsing spelen, pakte ik al aan met behulp van dit stukje code in mijn eerder gepost script:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
        if($i%2==1){
            mysql_query("INSERT INTO edc_wedstrijden SET volgnr=".$volgnr.", week=".$i.", ploeg1=".$team1.", ploeg2=".$team2."");
        }
else{
            mysql_query("INSERT INTO edc_wedstrijden SET volgnr=".$volgnr.", week=".$i.", ploeg1=".$team2.", ploeg2=".$team1."");
        }

?>
Gewijzigd op 20/12/2011 18:14:35 door Ruben Vanhoeyveld
 
Erwin H

Erwin H

20/12/2011 18:26:09
Quote Anchor link
@Ger,
Ik had het Ruben al via PM gemeld, maar zal het nu hier ook even doen, omdat het nu toch wel interessant begint te worden. Het maken van een speelschema zoals dit in zijn simpelste vorm (zoals Ruben nu heeft) is niet erg complex. Zodra je echter verdere restricties gaat opleggen loopt het snel uit de hand. Je komt dan met problemen te werken waar je letterlijk hogere wiskunde voor nodig hebt.
Als je bijvoorbeeld afwisselend wil uitspelen en thuisspelen, ploegen elkaar niet twee keer achter elkaar mogen tegenkomen, ploegen in hetzelfde stadion spelen waardoor niet beide ploegen op dezelfde dag thuis mogen spelen, etc etc. Dit kan je bijna niet meer met de hand oplossen. Een methode uit de Operations Research (zeg maar optimaliserings wiskunde) die je er wel op kan los laten is lineair programmeren. Nu wil het feit dat ik dit ooit heb gestudeerd en ik wil me er wel weer eens op storten. Simpel is het niet, maar te doen wel. Alleen moet ik even zoeken of er ergens een script beschikbaar is met de oplossingsmethode (Simplex methode), want die ga ik niet zelf tikken.
 
Ruben Vanhoeyveld

Ruben Vanhoeyveld

02/03/2012 17:27:36
Quote Anchor link
@Erwin H,
Ik zou graag wat meer te weten komen over hoe ik dit volledig kan instellen met verschillende parameters... Ik heb je reeds een bericht gestuurd. Zou je me kunnen helpen?

Of is er iemand anders met de juiste ervaring om dit voor mekaar te krijgen?
 
Koen Vlaswinkel

Koen Vlaswinkel

02/03/2012 18:05:18
Quote Anchor link
Je wilt dus net zoiets als op Online Soccer Manager. Mail ze anders even of je hun systeem zou mogen gebruiken. Misschien mag het wel.
 
Ruben Vanhoeyveld

Ruben Vanhoeyveld

02/03/2012 18:31:42
Quote Anchor link
Ik ken "Online Soccer Manager" niet en wil ook niet meteen een ander zijn systeem blindelings overnemen.

Ik zou het graag zelf, met jullie hulp of samen met jullie opbouwen.

Toch bedankt voor je reactie, Koen V.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.