Announcement

Collapse
No announcement yet.

Spielpaarungen berechnen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Spielpaarungen berechnen

    Ich möchte für einen Fussballmanager bei Spielbeginn 34 Spielpaarungen (17 Hin- und 17 Rückrunden) generieren.

    Ich habe bestimmt schon 20 Zettel weggeworfen, weil ich schon so viel ausprobiert habe... gibt es eine Formel, nach dem diese Paarungen generiert werden können?
    z.B.:

    <b>Spieltag 1:</b><br>
    Mannschaft 1 - Mannschaft 18<br>
    Mannschaft 2 - Mannschaft 17<br>
    Mannschaft 3 - Mannschaft 16<br>
    Mannschaft 4 - Mannschaft 15<br>
    Mannschaft 5 - Mannschaft 14<br>
    Mannschaft 6 - Mannschaft 13<br>
    Mannschaft 7 - Mannschaft 12<br>
    Mannschaft 8 - Mannschaft 11<br>
    Mannschaft 9 - Mannschaft 10<br><br>

    Hat jemand einen Ansatz für mich?

    Schöne Grüße aus dem Odenwald,

    Alexander Lohnes

  • #2
    Ich verstehe nicht ganz, und vermute das deine Spielpaarungen zufällig erfolgen sollen, richtg ?

    Dann einfach ein Array[1..34] of Integer von 1 bis 34 befüllt. Nun wird per Zufall immer zwei Elemente des Arrays ausgetauscht. Dann liesst man das array nacheinander aus und erzeugt die Paarungen. Oder man nimmt per Zufall immer ein Eintrag aus dem array raus, und erzeugt diese Paarungen. Ich glaube hier im Forum habe ich schon mal einen Algo. gepostet der sich mit Urnen udn 6 aus 49 beschäftigte. Dieser Algo. arbeitete ohne Arrays.

    Gruß Hage

    Comment


    • #3
      erst mal vielen dank.

      Ich habe ein Zufallsarray 1..18 bereits erstellt. Mir geht es hauptsächlich um die Logik, die Spielpaarung zu generieren.

      Habe schon verschiedene Kombonationen versucht... jedoch benötige ich bei jeder mehr als 34 Spieltage... oder ich habe 2 Mannschaften, die am gleichen Spieltag 2x spielen müssen, damit es hinhaut

      Comment


      • #4
        sorry, aber man glaubts kaum ich bin absoluter Fussball-Anti-Experte und kenne mich mit dem Regelwekr wie die Spieltage verlaufen und welche Paarungen gegeneinander spielen müssen. So viel wie ich weiß wird aber im ersten Zug per Urne, also Zufaällig, die ersten Paarungen gebildet.

        Gruß Hage

        Comment


        • #5
          Hallo Alex,

          nach einigem tüffteln habe ich jetzt eine Lösung:
          <pre>
          procedure TForm1.Button1Click(Sender: TObject);
          var
          il_Verein: integer;
          il_Spieltag: integer;
          il_Gegner: integer;
          il_temp: integer;
          il_Mannschaften: integer;
          begin
          il_Mannschaften := 18;
          il_Spieltag := 1;
          while il_Spieltag < (il_Mannschaften * 2 - 1) do
          begin
          Memo1.lines.add('');
          Memo1.Lines.Add(inttostr(il_Spieltag) + '. Spieltag');
          Memo1.Lines.Add('');
          il_temp := 0;
          while il_temp < (il_Mannschaften div 2) do // Schleife für alle Spiele eines Spieltages
          begin
          il_Verein := (il_Spieltag + il_temp - 1) mod (il_Mannschaften - 1) + 1;
          if il_temp = 0 then il_Gegner := il_Mannschaften
          else
          begin
          il_Gegner := (il_Mannschaften - il_temp - 2 + il_Spieltag) mod 17 +1;
          end;
          if (il_Spieltag mod 2 = 1) and (il_Spieltag < il_Mannschaften) then // sicherstellen das Heim/Auswärtsspiel sich i.d.R. abwechseln
          // sowie Hin/Rückrunde berücksichtigt wird
          memo1.Lines.Add(inttostr(il_Verein) + ' - ' + inttostr(il_Gegner))
          else
          memo1.Lines.Add(inttostr(il_Gegner) + ' - ' + inttostr(il_Verein));
          inc(il_temp);
          end;
          Memo1.Lines.Add('');
          inc(il_Spieltag);
          end;
          end;
          </pre>

          Dabei liegt folgendes System zu Grunde
          <pre>
          Spieltag 1 Spieltag 2 Spieltag 3
          Mannschaften
          1 10 2 11 3 12
          2 11 3 12 4 13
          3 12 4 13 5 14
          4 13 5 14 6 15
          5 14 6 15 7 16
          6 15 7 16 8 17
          7 16 8 17 9 1
          8 17 9 1 10 2
          9 18 10 18 11 18

          Spiele
          1 - 18 2 - 18 3 - 18
          2 - 17 3 - 1 4 - 2
          3 - 16 4 - 17 5 - 1
          4 - 15 5 - 16 6 - 17
          5 - 14 6 - 15 7 - 16
          6 - 13 7 - 14 8 - 15
          7 - 12 8 - 13 9 - 14
          8 - 11 9 - 12 10 - 13
          9 - 10 10 - 11 11 - 12
          </pre>

          Wie Du siehst wird für jeden Spieltag die position der jeweiligen Mannschaft um 1 erhöht. Nur die mannschaft 18 ist immer an letzter Stelle. Die Paarungen ergeben sich dann aus der linken Spalte umgekehrt zur rechten Spalte.

          Tschüß

          Torste

          Comment


          • #6
            Das ist absolut genial. Vielen Dank

            Comment


            • #7
              Hallo Alex,

              ich habe gerade noch eine kleine Unkorrektheit gefunden.

              statt <b> il_Gegner := (il_Mannschaften - il_temp - 2 + il_Spieltag) mod 17 +1;
              </b>

              sollte <b>il_Gegner := (il_Mannschaften - il_temp - 2 + il_Spieltag) mod (il_Mannschaften - 1) + 1;</b>

              verwendet werden.

              Sonst würde es nur mit 18 Mannschaften korrekt funktionieren. Das Beispiel ist auch nur für eine gerade Anzahl von Mannschaften ausgelegt.

              Tschau

              Torste

              Comment


              • #8
                Habs gerade integriert und es funktioniert wunderbar (auch mit dem Zufallsarray)

                Nochmals vielen Dank. Wie viele Stunden hast du denn für diese Formel vorm Rechner getüftelt? ;

                Comment


                • #9
                  Hallo Alex,

                  ich denke so 4-6 Stunden. Als ich Deine Frage gelesen habe, dachte ich ist doch ganz einfach. Habe es vor dem Antworten dann doch erst einmal getestet und siehe da es hat nicht funktioniert. Dann habe ich im Internet gesucht und einen Thread zu diesem Thema gefunden. Allerdings wurde dort auch keine korrekte Lösung gefunden sondern mehr auf die Bundesliga und die ganzen Sonderfälle eingegangen (z.B. Bayern und 1860).

                  Als kleine Anregung konnte ich es aber verwenden. Gestern Abend hatte ich es dann vorerst aufgegeben und wollte schauen ob jemand Anders eine Antwort hat.

                  Nachdem von Hagen kein(e) Lösung/Lösungsweg präsentiert wurde war ich voll motiviert. Denn so wie ich Hagen kenne macht er solche Denksportaufgaben sehr gern.

                  Schöne Grüße aus dem Kaiserstuhl

                  Torste

                  Comment


                  • #10
                    <I>Nachdem von Hagen kein(e) Lösung/Lösungsweg präsentiert wurde war ich voll motiviert </i>

                    bäh, musste mir das nochmal auf die Stulle schmieren ?? <br>

                    Aber ich gebe es zu, nachdem ich deine Lösung analysiert habe verstand ich auch das eigentliche Problem, was ja nicht's mit den Zufallspaarungen zu tun hatte.

                    z.Z. habe ich noch drei andere knifflige Denksportaufgaben zu lösen, da war mir obiges Problem einfach zu mühsig.<br>
                    Nur soviel zu meine dummen Ausrede.

                    Gruß Hage

                    Comment


                    • #11
                      Hallo Hagen,

                      viel Erfolg bei Deinen offenen 3 Denksportaufgaben.

                      Du bist so fleissig hier mit antworten, da will ich Dir das nachsehen.

                      Den Seitenhieb konnte ich mir aber nicht verkneifen, der war zu verlockend.

                      Schönes Wochenende

                      Torste

                      Comment


                      • #12
                        <i>Als ich Deine Frage gelesen habe, dachte ich ist doch ganz einfach...</i>

                        das dachte ich auch ;-

                        Comment


                        • #13
                          Moin Leute,

                          erst mal großes Kompliment an Torsten...
                          Habe schon mit mehreren Leuten den Kopf drüber zerbrochen

                          Allerdings habe ich mir die Ausgabe mal genauer angeschaut...

                          Es sind Spieltage doppelt...
                          Und zwar:
                          <PRE>
                          2. Spieltag = 19. Spieltag (komplett dasselbe?!?!)
                          4. Sp = 21. Sp
                          6. Sp = 23. Sp
                          8. Sp = 25. Sp
                          10. Sp = 27. Sp
                          u.s.w.
                          </PRE>
                          Also jeder gerade Hinrunden Spieltag ist absolut identisch mit dem dazugehörigen Rückrunden Spieltag...

                          Da du selbst deinen Source Code am besten kennst ( *g* ) wollte ich Fragen, ob du da nochmal drüberschauen kannst...

                          Vielleicht haben auch die anderen beteiligten einen passablen Vorschlag...

                          MfG

                          Michael Brotrüc

                          Comment


                          • #14
                            Hallo Michael,

                            das habe ich offenichtlich übersehen. Ich habe jetzt einen kleinen Teil auskommentiert und nun dürfte es wie gewünscht funktionieren.

                            <pre>
                            procedure TForm1.Button1Click(Sender: TObject);
                            var
                            il_Verein: integer;
                            il_Spieltag: integer;
                            il_Gegner: integer;
                            il_temp: integer;
                            il_Mannschaften: integer;
                            begin
                            il_Mannschaften := 18;
                            il_Spieltag := 1;
                            while il_Spieltag < (il_Mannschaften * 2 - 1) do
                            begin
                            Memo1.lines.add('');
                            Memo1.Lines.Add(inttostr(il_Spieltag) + '. Spieltag');
                            Memo1.Lines.Add('');
                            il_temp := 0;
                            while il_temp < (il_Mannschaften div 2) do // Schleife für alle Spiele eines Spieltages
                            begin
                            il_Verein := (il_Spieltag + il_temp - 1) mod (il_Mannschaften - 1) + 1;
                            if il_temp = 0 then il_Gegner := il_Mannschaften
                            else
                            begin
                            il_Gegner := (il_Mannschaften - il_temp - 2 + il_Spieltag) mod 17 +1;
                            end;
                            if (il_Spieltag mod 2 = 1) {and (il_Spieltag < il_Mannschaften)} then // sicherstellen das Heim/Auswärtsspiel sich i.d.R. abwechseln
                            // sowie Hin/Rückrunde berücksichtigt wird
                            memo1.Lines.Add(inttostr(il_Verein) + ' - ' + inttostr(il_Gegner))
                            else
                            memo1.Lines.Add(inttostr(il_Gegner) + ' - ' + inttostr(il_Verein));
                            inc(il_temp);
                            end;
                            Memo1.Lines.Add('');
                            inc(il_Spieltag);
                            end;
                            end;
                            </pre>

                            Gruß

                            Torste

                            Comment


                            • #15
                              Hallo,

                              diese Problematik war vor ungefähr 25 Jahren mal eine Aufgabe beim Bundeswettbewerb für Mathematik, bei dem ich mitgemacht habe. Eine Lösung ist folgende:

                              Gehen wir mal von einer ungeraden Anzahl n von Mannschaften aus. Wir zeichnen einen Kreis und verteilen auf dem Kreis gleichmäßig für jede Mannschaft einen Punkt und nummerieren sie von 1 bis n durch. Am x-ten Spieltag hat Mannschaft x spielfrei. Wenn wir eine gerade Anzahl n von Mannschaften haben, kommen die Mannschaften von 1 bis n-1 auf den Kreis. Am x-ten Spieltag hat Mannschaft x dann nicht frei, sondern spielt gegen Mannschaft n. Ausgehend von Mannschaft x zeichnen wir nun eine Linie vom linken Nachbarn zum rechten Nachbarn von x, eine vom zweiten links von x zum zweiten rechts von x usw. Die Linien entsprechen den Begegnungen. Bei fünf Mannschaften erhält man so

                              1 Spielfrei
                              2-5
                              3-4

                              2 Spielfrei
                              1-3
                              4-5

                              3 Spielfrei
                              2-4
                              1-5

                              4 Spielfrei
                              3-5
                              2-1

                              5 Spielfrei
                              1-4
                              2-3

                              Die Problematik von gleichmäßig verteilten Heim- und Auswärtsspielen ist hierbei noch nicht berücksichtigt. Da auf dem Kreis am Ende offensichtlich jeder Punkt mit jedem durch genau eine Linie verbunden ist, ist nachgewiesen, das jede Begegnung stattfindet.

                              Viele Grüße,
                              Norber

                              Comment

                              Working...
                              X