sortieren auf die andere art

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • sortieren auf die andere art

    hi ich bin gerade dabei ein tunierscript zu programmieren. soweit kein problem doch ergibt sich für mich folgendes problem. der tunierbaum soll so gestaltet werden, dass der stärkste gegen den schwächsten spielt. wer stark und wer schwach ist geht aus den punkten die, die manschaft hat hervor. dies kann ich ja auch recht einfach abfragen, indem ich mit max und min arbeite. nun soll es aber so sein, dass der stärkste ganz oben im tunierbaum ist und der 2. stärkste ganz unten. ich ermittle den 2. stärksten ebenfalls über max und min, indem ich dem stärken vorher schon die position 1 geben. alle anderen teilnehmer haben ja somit noch keine position und somit kann ich immer schön mit max, min meinen aktuell stärksten und schwächsten ermitteln. das problem ist jetzt, dass der 3. stärkste ja in der mitte sein muss, damit die wahrscheinlichkeit, dass die stärksten zuletzte gegeneinander spielen am größten ist.

    die frage ist wie berechne ich, welche position der aktuell stärkste/schwächste bekommen sollen?

    ich hab schon versucht, ob es sich eventuell mit einer formel berechnen lässt aber dem war nicht der fall, zumindest bin ich nicht drauf gekommen.

    wie würdet ihr an die sache ran gehen?

    kleines beispiel wie es aussehen müsste (für 16 teilnehmer):

    begegnung: 1,2,3,4,5,6,7,8 (per max,min ermitteln wer begegnung 1 ist)
    positionen: 1,8,4,5,2,7,3,6

    für mich ist nur die erste begegnung wichtig, da ich alle weiteren positionen mit + 1 berechnen kann

    beispiel:

    runde1:
    position 1.1

    runde 2:
    position 2.1

    hoffe ihr könnt mir bei dem kleinen logik/matheproblem weiterhelfen

  • #2
    qucik'n'dirty
    PHP-Code:
    /*
    Alle Teams auslesen, nach Stärke absteigend sortiert

    stärkstes Team:     Team 1
    schwächstes Team:     Team 8
    */
    $teams = array('Team 1''Team 2''Team 3''Team 4',
        
    'Team 5''Team 6''Team 7''Team 8''Team 9');

    //Anzahl Teams bestimmen
    $count count($teams);
    //Freilos bei ungerader Anzahl
    if ($count 2) {
        
    $teams array_merge(
            
    array_slice($teams0floor($count 2) + 1), 
            array(
    NULL), 
            
    array_slice($teamsfloor($count 2) + 1));
        
    $count++;
    }

    //Umsortieren
    for ($i 0$i $count$i++)
        
    $spieler[$i 2][] = $teams[$i];

    //Zusammenfügen
    $spieler array_merge($spieler[0], $spieler[1]);

    //Array für Begegnungen
    $begegnungen = array();

    //Solange noch mindestens 2 Teams in Liste sind...
    $count $count 2;
    for (
    $i 0$i $count$i++)
        
    //Erstes und letztes Team als neue Begegnung eintragen
        
    $begegnungen[] = array(
            
    array_shift($spieler), 
            
    array_pop($spieler));
        
    //Ausgabe
    echo '<hr />';
    foreach (
    $begegnungen as $begegnung => $spieler)
        echo (
    $begegnung 1).' Spiel: '.$spieler[0].' - '.$spieler[1].'<br />';
    echo 
    '<hr />'
    Ergibt:
    Code:
    1 Spiel: Team 1 - Team 9
    2 Spiel: Team 3 - Team 7
    3 Spiel: Team 5 -
    4 Spiel: Team 6 - Team 4
    5 Spiel: Team 8 - Team 2
    So?
    Zuletzt geändert von mrhappiness; 06.06.2005, 08:39.
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3
      hmm ja so ähnlich hatte ich das auch doch dann viel mir auf, dass in der 2. begegnung ja der stärkste schon gegen den 3. stärksten spielen würde

      Kommentar


      • #4
        Du musst dich halt am Anfang auf Initialpartien festlegen, danach entscheidet der Zufall.

        Wenn du nicht willst, dass in Runde 2 die folgenden Partien gespielt werden (angenommen, die stärkere Mannschaft gewinnt immer):
        1 - 3
        5
        4 - 2
        dann musst du logischerweise Runde 1 anders aufbauen
        Ich denke, also bin ich. - Einige sind trotzdem...

        Kommentar


        • #5
          ja leider und das lässt mein logisches denken im moment nicht so richtig zu :P

          Kommentar


          • #6
            Ich habs leider noch nicht ganz verstanden:
            Du suchst eine Zuordnung der n Spieler auf n/2 Spiele, so daß der stärkste gegen den schwächsten, der zweitstärkste gegen den zweitschwächsten usw. spielt?

            Wenn es das sein soll, dann sortiere den Array der Spieler nach deren Stärke und weise in einer Schleife von i=0 bis n/2 jeweils Spieler i und n-i einem Spiel zu. Die Liste der n/2 Spiele wird über eine Schleife von k=0 bis n/4 ausgegeben - und zwar immer Spiel k und Spiel k+n/4.

            Aber ganz allgemein halte ich den Ansatz für wenig prickelnd, denn du machst es den Besten sehr leicht, den Schlechten sehr schwer und somit wird sich ab einer gewissen Einspielphase in der Liga nur noch im Mittelfeld etwas verschieben. Das wird langweilig.

            In der Spieltheorie gibt es sehr viele Ansätze, einer ist aber besonders einfach und trotzdem gut:
            Minimale und maximale Stärke aus dem Spielerfeld ermitteln.
            Spieler werden beliebig gepaart, wenn sie mindestens x Prozent Leistungsdifferenz haben. Liste der Paarungen wird nach Summe der Stärken der beteiligten Spieler sortiert und wie oben schon beschrieben ausgegeben.
            (Ich kann das auch nochmal ausführlicher beschreiben, wenn du willst.)
            Zuletzt geändert von onemorenerd; 06.06.2005, 11:20.

            Kommentar


            • #7
              naja es ist sicher eine zweiseitige münze. auf der einen seite hast du recht. die starken haben ihren vorteil, doch sehe ich lieber die 2 stärksten im finale als in der ersten runde gegeneinander zu spielen. so könnte es dann sein, dass ein "schwacher" verein sich ins finale durch günstige auslosung bis ins finale "schummeln" kann, wo hingegen ein relativ starker gegner direkt am anfang von einem stärkeren gegner auf die mütze bekommt.

              naja ich wollte es auch so machen, dass es für jede runde eine art multiplikator gibt. sprich in der ersten runde bekommt der gewinner nur 1*3 punkte in runde 3 allerdings 3*3 punkte. somit ziehen die starken zwar immernoch den schwachen davon aber im mittelfeld geht es interessanter zu.
              Zuletzt geändert von fanity; 06.06.2005, 11:39.

              Kommentar


              • #8
                Original geschrieben von fanity
                somit ziehen die starken zwar immernoch den schwachen davon aber im mittelfeld geht es interessanter zu.
                Da kannst du multiplizieren wie du willst. Die Zahlen werden so nur größer, aber das multipliziert doch nur die Schwäche des Systems. Starke werden gestärkt, Schwache geschwächt und im Mittelfeld gibts keine Chance nach oben zu kommen, und keine Gefahr abzurutschen. Das ist nicht interessanter, ganz im Gegenteil. Spiele es mal in Gedanken durch, dann wirst du sehen, daß dein Multiplikator den Effekt des Einspielens nur beschleunigt und somit die Langeweile schon einige Spieltage früher einsetzen läßt.

                Naja, langsam weichts vom Problem ab. Hast du es denn inzwischen hinbekommen, die Paarungen zu erzeugen?

                Kommentar


                • #9
                  nein noch nicht, da ich mir auch gerne andere vorschläge zu dem thema anhöre. speziell um es so zu gestalten, dass es für alle interessant ist.

                  und das mit dem multiplizieren macht schon sinn, da nicht bei jedem tunier die selben leute mitspielen. die tabelle hingegen umschließt alle tuniere. somit haben die mittleren sehr wohl die chance ihre platzierung zu verbessern. denn wenn nicht viele starke mitmachen sind sie somit die starken. aber höre mir da gern auch andere vorschläge an bzw. lass mich vom gegenteil überzeugen

                  Kommentar


                  • #10
                    Du willst mich nur kirre machen oder?
                    Original geschrieben von fanity
                    denn wenn nicht viele starke mitmachen sind sie somit die starken.
                    "Treffen sich zwei Kühe, sagt die eine zur anderen 'lass mich mal in die Mitte'" oder was?

                    Nein mal im Ernst, wenn "die Starken" mal nicht dabei sind, ist doch der Effekt immer noch derselbe. Er wirkt sich dann eben mal auf andere aus.
                    Mag sein, dass dadurch "die Anderen" (eigentlich mittelmäßigen, aber jetzt relativ starken (muuh)) dadurch insgesamt eine Chance haben. Aber eben nur, wenn - und wie willst du sicherstellen, dass das mal eintritt?
                    Klar, es findet sich immer ein Weg, macht die Liga aber auch nicht spannender, wenn man gelegentlich die größten Fans mal aussperren muß.

                    Kommentar


                    • #11
                      Sehr guter Schnipsel, sowas hab ich atm auch probiert, nur bin ich irgendwie nicht drauf gekommen THX :P

                      Aber noch ne andere Frage:

                      Wie sieht das denn aus, wenn ich die Teams aus der Datenbank hole? Da steht ich gerade etwas aufm Schlauch

                      Kommentar

                      Lädt...
                      X