ホームページ > ウェブフロントエンド > jsチュートリアル > 線形計画法を使用した (歴史的に最適な) ファンタジー チームの評価

線形計画法を使用した (歴史的に最適な) ファンタジー チームの評価

DDD
リリース: 2024-11-25 20:48:16
オリジナル
951 人が閲覧しました

私はプログラマーであり、F1 ファンです。 F1 のファンタジー リーグをプレイし始めたとき、私の頭は自然にアルゴリズムに向かいました。

F1 ファンタジー ゲームの目標は、レースパフォーマンスに基づいて最大ポイントを獲得する価格上限を維持しながら、5 人のドライバーと 2 つのチームを選択することです。これは、制約を伴うかなり伝統的なコンピューター サイエンスの最適化問題のように思えますよね?

より正確には、レースのあらゆる歴史的ウィンドウに対して、線形計画法を使用して最適なチームを見つけることができます。厳密に言えば、この解決策はゲームの簡略化されたバージョンに対するものですが (実際のゲームではチームを週ごとに変更でき、いくつかのワイルドカード要素もあります)、それでも出発点としては役立ちます。

私たちの機能をまとめるには、最小限の依存関係が必要でした:

  • データ: 優れた F1 Fantasy Tools サイトからポイント/価格データを取得します
  • 線形プログラミング ライブラリ: glpk.js を使用します。これは、古い信頼できる GLPK ソルバーの JavaScript/WebAssembly ポートです
  • プラットフォーム: GitHub ページを使用します。コードは MIT ライセンスの下でオープンソース化されており、ここで見つけることができます。

このスクリーンショットに示すように、現在の機能にはシンプルなインターフェイスがあります。

Evaluating (Historically Optimal) Fantasy Feams with Linear Programming

この機能の核心は、舞台裏での線形プログラムの構築であり、それがブラウザーで実行されている glpk.js ソルバーに供給されます。これは、私たちのツールによって構築された実際の線形プログラムです (多くの行が省略されています)。

{
    "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]
    ]
}
ログイン後にコピー

F1 の口語的な命名に慣れていない人のために説明すると、ドライバーは姓の最初の 3 文字で呼ばれ (例: VER はマックス フェルスタッペン)、各チームには 3 文字のニーモニックがあります (例: AST はアストン マーティン モータースポーツ)。

これらの線形プログラムには、ドライバーごとの変数 (3 文字のコードで名前が付けられています) とチームごとの変数があり、値は 1 (ファンタジー チームの場合) または 0 (ファンタジー チームではない場合) を取る必要があります。チーム)。そして、線形プログラムの目的は、価格の合計が予算のしきい値を超えないことを条件とし、ドライバー変数の合計が 5 でチーム変数が 2 であるという制約も条件として、ポイントを最大化することです。非常に簡単です。 !

ニュアンスとしては、その週に獲得したポイントの 2 倍を獲得する「2x ドライバー」を選択できるということです。このニュアンスに対応するために、20 個の個別の線形プログラム (それぞれが 2x として異なるドライバーを使用します) を生成し、それらの 20 個のプログラムのそれぞれで glpk.js を実行して、最大のポイントを持つプログラムを見つけます。

免責事項: 当社は F1 (またはその会社やブランド) とは一切関係がありません。この機能の作成者は、単にファンタジー ゲームのプレイを楽しむファンです。この情報は正確性を保証するものではなく、ご自身の責任でご利用ください。

以上が線形計画法を使用した (歴史的に最適な) ファンタジー チームの評価の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート