Heim > Web-Frontend > js-Tutorial > Bewertung (historisch optimaler) Fantasy-Feams mit linearer Programmierung

Bewertung (historisch optimaler) Fantasy-Feams mit linearer Programmierung

DDD
Freigeben: 2024-11-25 20:48:16
Original
906 Leute haben es durchsucht

Ich bin Programmierer und Formel-1-Fan. Als ich anfing, die Fantasy-Liga der F1 zu spielen, dachte ich natürlich an Algorithmen.

Das Ziel im F1-Fantasy-Spiel besteht darin, 5 Fahrer und 2 Teams auszuwählen und dabei unter einer Preisobergrenze zu bleiben, sodass basierend auf der Rennleistung eine maximale Punktzahl erreicht wird. Das klingt nach einem ziemlich traditionellen Informatik-Optimierungsproblem mit Einschränkungen, oder?

Genauer gesagt können wir für jedes historische Zeitfenster von Rennen die lineare Programmierung verwenden, um ein optimales Team zu finden. Streng genommen handelt es sich bei dieser Lösung um eine vereinfachte Version des Spiels (im echten Spiel können Sie Woche für Woche Änderungen an Ihrem Team vornehmen und es gibt einige Wildcard-Faktoren), sie ist aber dennoch ein nützlicher Ausgangspunkt.

Um unsere Fähigkeiten zusammenzustellen, waren minimale Abhängigkeiten erforderlich:

  • Daten: Wir beziehen Punkte-/Preisdaten von der hervorragenden F1 Fantasy Tools-Website
  • Lineare Programmierbibliothek: Wir verwenden glpk.js, eine JavaScript/WebAssembly-Portierung des alten, bewährten GLPK-Lösers
  • Plattform: Wir nutzen GitHub-Seiten, auf denen unser Code Open Source unter der MIT-Lizenz ist und hier zu finden ist

Die aktuelle Funktion verfügt über eine einfache Benutzeroberfläche, wie in diesem Screenshot gezeigt.

Evaluating (Historically Optimal) Fantasy Feams with Linear Programming

Der Kern der Funktion ist die Konstruktion der linearen Programme hinter den Kulissen, die dann dem glpk.js-Solver zugeführt werden, der in Ihrem Browser ausgeführt wird. Hier ist ein tatsächliches lineares Programm, das von unserem Tool erstellt wurde (wobei viele Zeilen weggelassen wurden).

{
    "name": "LP",
    "objective": {
        "direction": 2,
        "name": "obj",
        "vars": [
            {
                "name": "VER",
                "coef": 593
            },
            {
                "name": "OCO",
                "coef": 112
            },
   [...18 additional drivers, omitted for brevity]

            {
                "name": "AST",
                "coef": 360
            },
   [...9 additional teams, omitted for brevity]

        ]
    },
    "subjectTo": [
        {
            "name": "cons1",
            "vars": [
                {
                    "name": "VER",
                    "coef": 30
                },
                {
                    "name": "NOR",
                    "coef": 23
                },
[...18 additional drivers, omitted for brevity]

                {
                    "name": "MCL",
                    "coef": 23.2
                },
[...9 additional teams, omitted for brevity]

            ],
            "bnds": {
                "type": 3,
                "ub": 100,
                "lb": 0
            }
        },
        {
            "name": "cons2",
            "vars": [
                {
                    "name": "VER",
                    "coef": 1
                },
                {
                    "name": "OCO",
                    "coef": 1
                },
[...18 additional drivers, omitted for brevity]

            ],
            "bnds": {
                "type": 5,
                "ub": 5,
                "lb": 5
            }
        },
        {
            "name": "cons3",
            "vars": [
                {
                    "name": "RED",
                    "coef": 1
                },
[...9 additional teams, omitted for brevity]
Show quoted text
[...18 additional drivers, omitted for brevity]

        {
            "name": "cons29",
            "vars": [
                {
                    "name": "FER",
                    "coef": 1
                }
            ],
            "bnds": {
                "type": 4,
                "ub": 1,
                "lb": 0
            }
        },
[...9 additional teams, omitted for brevity]

    ],
    "generals": [
        "VER",
        "OCO",
[...18 additional drivers, omitted for brevity]
        "ALP",
[...9 additional teams, omitted for brevity]
    ]
}
Nach dem Login kopieren

Für diejenigen, die mit der umgangssprachlichen F1-Namensgebung nicht vertraut sind: Fahrer werden mit den ersten drei Buchstaben ihres Nachnamens bezeichnet (z. B. VER ist Max Verstappen) und Teams haben jeweils eine aus drei Buchstaben bestehende Mnemonik (z. B. AST ist Aston Martin Motorsports).

In diesen linearen Programmen gibt es also eine Variable pro Fahrer (benannt mit ihrem Drei-Buchstaben-Code) und eine Variable pro Team, die den Wert 1 (in Ihrem Fantasieteam) oder 0 (nicht in Ihrer Fantasie) annehmen muss Team). Und das Ziel des linearen Programms besteht darin, die Punkte zu maximieren, vorausgesetzt, dass die Summe des Preises den Budgetschwellenwert nicht überschreitet und außerdem die Einschränkung besteht, dass die Summe der Fahrervariablen 5 und der Teamvariablen 2 beträgt. Sehr einfach !

Eine Besonderheit besteht darin, dass Sie einen „2x-Fahrer“ auswählen können, der das Doppelte der Punkte erhält, die er in dieser Woche gesammelt hat. Um dieser Nuance Rechnung zu tragen, generieren wir 20 separate lineare Programme (von denen jedes einen anderen Treiber als 2x verwendet) und führen glpk.js für jedes dieser 20 Programme aus, um das Programm mit der maximalen Punktzahl zu finden.

Haftungsausschluss: Wir haben keine Verbindung zur Formel 1 (oder einem ihrer Unternehmen oder Marken). Der Autor dieser Funktion ist einfach ein Fan, der das Fantasy-Spiel gerne spielt. Diese Informationen werden ohne Gewähr für ihre Richtigkeit bereitgestellt. Die Nutzung erfolgt auf eigenes Risiko.

Das obige ist der detaillierte Inhalt vonBewertung (historisch optimaler) Fantasy-Feams mit linearer Programmierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage