Maison > interface Web > js tutoriel > Évaluation des feams fantastiques (historiquement optimales) avec la programmation linéaire

Évaluation des feams fantastiques (historiquement optimales) avec la programmation linéaire

DDD
Libérer: 2024-11-25 20:48:16
original
952 Les gens l'ont consulté

Je suis programmeur et fan de Formule 1. Quand j'ai commencé à jouer à la ligue fantastique de F1, mon esprit s'est naturellement tourné vers les algorithmes.

Le but du jeu fantastique de F1 est de sélectionner 5 pilotes et 2 équipes, tout en restant sous un plafond de prix, qui, basé sur les performances en course, marque un nombre maximum de points. Cela ressemble à un problème d'optimisation informatique assez traditionnel avec des contraintes, n'est-ce pas ?

Plus précisément, pour toute fenêtre historique de courses, nous pouvons utiliser la Programmation Linéaire, pour trouver une équipe optimale. À proprement parler, cette solution consiste en une version simplifiée du jeu (le jeu réel vous permet d'apporter des modifications à votre équipe de semaine en semaine, et comporte également certains facteurs génériques), mais constitue néanmoins un point de départ utile.

La mise en place de nos capacités nécessitait des dépendances minimales :

  • données : nous récupérons les données de points/prix de l'excellent site F1 Fantasy Tools
  • bibliothèque de programmation linéaire : nous utilisons glpk.js, qui est un portage JavaScript/WebAssembly de l'ancien fidèle solveur GLPK
  • Plateforme : nous utilisons les pages GitHub, où notre code est open source sous licence MIT et peut être trouvé ici

La fonctionnalité actuelle a une interface simple, comme le montre cette capture d'écran.

Evaluating (Historically Optimal) Fantasy Feams with Linear Programming

Le nœud de cette fonctionnalité réside dans la construction en coulisses des programmes linéaires, qui sont ensuite transmis au solveur glpk.js exécuté dans votre navigateur. Voici un véritable programme linéaire construit par notre outil (avec de nombreuses lignes omises).

{
    "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]
    ]
}
Copier après la connexion

Pour ceux qui ne connaissent pas le langage familier de la dénomination F1, les pilotes sont désignés par les trois premières lettres de leur nom de famille (par exemple, VER est Max Verstappen) et les équipes ont chacune un mnémonique à 3 lettres (par exemple, AST est Aston Martin Motorsports).

Et donc dans ces programmes linéaires, il y a une variable par pilote (nommée avec leur code à trois lettres) et une variable par équipe, qui doit prendre la valeur de 1 (sur votre équipe fantasy) ou 0 (pas sur votre équipe fantasy équipe). Et l'objectif du programme linéaire est de maximiser les points, sous réserve que la somme du prix ne dépasse pas le seuil budgétaire, et également sous la contrainte que la somme des variables du pilote soit de 5, et celle des variables de l'équipe soit de 2. Très simple !

Une nuance est que vous pouvez choisir un « pilote 2x », qui marque le double des points qu'il a gagnés cette semaine-là. Pour tenir compte de cette nuance, nous générons 20 programmes linéaires distincts (chacun prenant un pilote différent comme 2x) et exécutons glpk.js sur chacun de ces 20 programmes, pour trouver celui avec le maximum de points.

Avertissement : nous n'avons aucune affiliation avec la Formule 1 (ou l'une de leurs sociétés ou marques). L'auteur de cette fonctionnalité est simplement un fan qui aime jouer au jeu fantastique. Ces informations sont fournies sans garantie quant à leur 'exactitude, utilisez-les à vos propres risques.'

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal