我是一名程式設計師和一級方程式賽車迷。當我開始玩F1的夢幻聯賽時,我的心思自然就轉向了演算法。
F1 奇幻遊戲的目標是挑選 5 名車手和 2 支車隊,同時保持價格上限,並根據比賽表現獲得最高分。這聽起來像是一個相當傳統的有約束的計算機科學優化問題,對吧?
更準確地說,對於任何歷史比賽窗口,我們都可以使用線性規劃來找到最佳團隊。嚴格來說,這個解決方案是遊戲的簡化版本(真正的遊戲允許你每週對你的團隊進行更改,並且有一些通配符因素),但仍然是一個有用的起點。
整合我們的能力需要最少的依賴:
目前功能有一個簡單的介面,如螢幕截圖所示。
此功能的關鍵是線性程式的幕後構造,然後將其輸入瀏覽器中運行的 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 命名口語的人來說,車手是透過姓氏的前三個字母來稱呼的(例如VER 是Max Verstappen),每個車隊都有一個3 個字母的助記符(例如AST 是阿斯頓馬丁賽車運動)。
因此,在這些線性程序中,每個車手都有一個變量(以他們的三個字母代碼命名),每個團隊都有一個變量,該變量的值必須為1(在您的幻想車隊中)或0(不在您的幻想車隊中)團隊)。而線性規劃的目標是最大化積分,受限於價格總和不超過預算門檻,也受限於車手變數總和為5,車隊變數總和為2。非常簡單!
一個細微差別是,你可以選擇一名“2x 車手”,他的得分是他們當週獲得的積分的兩倍。為了適應這種細微差別,我們產生20 個獨立的線性程式(每個程式採用不同的驅動程式作為2x),並在這20 個程式中的每一個上執行glpk.js,以找到具有最大分數的程式.
免責聲明:我們與一級方程式(或其任何公司或品牌)沒有任何隸屬關係。此功能的作者只是一個喜歡玩奇幻遊戲的粉絲。所提供的資訊不保證其準確性,您需自行承擔使用風險。 '
以上是使用線性規劃評估(歷史最優)Fantasy Feams的詳細內容。更多資訊請關注PHP中文網其他相關文章!