最佳化的目標
每個推薦目標對應一個數值,搜尋讓這個數值盡可能大:撃奏ライブ和自由ライブ是所選歌曲、難度的期望分數;刷活動 PT 是每局的期望活動 PT;綜合力最高是隊伍綜合力。
期望分數:每局開始時,5 名成員的技能發動順序會被隨機打亂。我們把 5 人的 120 種順序視為等機率,每種順序都完整模擬一整局(技能、Snap 效果,撃奏ライブ還包括激走區間與名次加分),再取平均。技能或任務帶抽籤時,按遊戲中的機率對抽籤結果求期望。
演奏條件:預設是理論最佳打法,全部 Perfect,撃奏ライブ中能判 Just 的音符全部 Just。在「演奏假設」裡調整 Great 率或 Just 率後,按比例把 Great 和非 Just 的判定均勻分布到整張譜面上再計算。它描述的是一份聲明的演奏,不是對你實際表現的預測。
一支隊伍由隊長、其餘 4 名成員和每人搭配的 Snap 組成。4 名成員之間換站位不影響分數,所以結果裡的站位只是展示。
候選範圍
候選範圍 D 是你卡池裡所有合法的隊伍:滿足遊戲的編成規則,以及你在「卡牌限制」裡設定的必選和排除。不同的隊長、成員組合和 Snap 搭配都是不同的候選。
計算使用你登錄的卡牌養成(等級、特訓、卡階、技能等級)和玩家加成。卡池中缺少的數值會先列出來請你補齊;結果沒有涵蓋全部持有卡時,頁面會註明。
「已證明最優」的定義
「已證明最優」表示:在完整的合法候選範圍 D 中,列出的結果恰好是按「目標值降序 → 綜合力降序 → 規範 ID 順序」排列的前 min(K, |D|) 支隊伍,K 是頁面回傳的數量(5)。隊伍的選擇、名次和同分時的先後都已確定。
證明不需要逐一計算每支隊伍。每個候選要麼和結果精確比較過,要麼被可靠的上界排除:它能達到的最好值已經低於第 K 名的精確值。這不是抽樣,也不是近似。
如果 D 為空,「已證明」表示在這些條件下沒有可行的隊伍。
這是相對於聲明的計算模型的演算法證明,依賴模型、上界和程式都正確。沒有登錄的卡、填錯的養成、實際演奏中的失誤都不在計算之內。
- 目標值
- 所選推薦目標的精確值,例如 120 種順序的平均分。
- 上界
- 保證不低於真實值的估計。上界已經低於門檻的候選,真實值只會更低,可以直接排除。
- 規範 ID 順序
- 目標值和綜合力都相同時,按卡牌編號的固定順序排列,同一輸入總是得到同一結果。
「未證明」與目前最佳
「未證明」表示精確搜尋尚未完成最優性證明;已有結果可能最優,也可能不是。
到達你選的最長計算時間或手動停止時會出現這種情況。頁面列出目前找到的最好隊伍,它們的數值都經過精確計算;同時給出「目前最好」和「最優不超過」兩個數。任何隊伍都不會超過後者,所以真正的最優落在兩者之間,差距越小,離最優越近。
想要證明,可以把最長計算時間調長或選「不限」,再算一次。
搜尋策略
隊伍數量隨卡池成長得極快,逐一模擬不可行。搜尋採用分支定界:把候選一步步展開(先定隊長,再加成員和 Snap),給每個尚未完整的部分隊伍估一個上界。只要上界已經低於目前第 K 名的精確值,這一整枝都不可能進入結果,直接剪掉。
上界分兩層。部分隊伍用預先算好的表估計,計算很快,並且只會高估;只有完整的 5 人隊伍才做整局模擬。120 種順序和抽籤也先用區間夾住,只有區間分不出名次時才細化到精確值。
門檻越高,剪掉的越多。搜尋會盡早找到強隊並精確計算,作為門檻;之後每找到更好的隊伍,門檻隨之抬高。
候選按隊長分成互不重疊的組分別搜尋,最後合併。分組不改變結果:同樣的輸入總是得到同樣的隊伍和名次。
到達時間上限時,搜尋停下並回報目前最好的隊伍和剩餘候選的上界,也就是「未證明」時看到的兩個數。
怎麼讀結果
每個結果顯示目標值、綜合力、遊戲原生樣式的編成,以及每個位置的成員卡、養成和搭配的 Snap。
目標值有時顯示為區間,表示精確值落在其中,例如帶抽籤的技能還沒有細化時。
計算完成後,每支隊伍還會列出 120 種順序中分數最低、居中和最高的順序,用來了解技能順序帶來的波動。
原始碼
計算模型(crates/ournotes-sim)與搜尋演算法(crates/ournotes-search)都在 GitHub 的 empty-sekai/ournotes-deck 儲存庫公開,組卡頁頂部有直達連結。