まず、問題の一般化がNP-Hardであり、ナップザック問題から即座に還元可能であることは簡単にわかります。
ナップザックの問題: が与えられた場合weight=W, costs_of_items=C, weight_of_items=X
、プレイヤー数に制限のないこの問題に問題を減らします (一般化は、プレイヤーが選択した最大k
プレイヤー数になりk
ます)。
したがって、問題に対する既知の多項式時間解はないと結論付けることができます。
しかし、ナップザック疑似多項式解に基づいて解を開発できます。
簡単にするために、スモール フォワードの数だけに制限があるとしましょう (回答の原則を適用して、さらに制限を追加できます)。
次に、次の再帰的アプローチで問題を解決できます。
if i is not a forward, same as the original knapsack, while maintaining the #forwards
f(i,points,forwards) = max {
f(i-1,points-C[i],forwards)
f(i-1,points,forwards)
}
if i is a forward:
f(i,points,forwards) = max {
//We used one of the forwards if we add this forward to the team
f(i-1,points-C[i],forwards-1)
f(i-1,points,forwards)
}
ベースはすべてゼロで、次元の 1 つがゼロです: f(0,_,_)=f(_,0,_)=0
(通常のナップザックと同じ) およびf(_,_,-1)=-infnity
(無効なソリューション)
答えはf(2,W,n)
(転送数が 2 で、異なる場合はそれも変更する必要があります) です。W
はサラリーキャップで、n
は選手数です。
DP ソリューションは、再帰ボトムアップを表す行列を埋めて、疑似多項式時間ソリューションを取得します (制限が一定の場合にのみ疑似多項式です)。
このプロセスを繰り返し、各基準にディメンションを追加することで、この問題は DP ソリューションによって最適に解決されます。
得られる複雑さは次のとおりですO(B^p * W * n)
- ここで:
B
は「分岐係数」です - ポジションごとのプレーヤー数 + 1 (ゼロの場合)B=3
です。
W
= サラリーキャップ
n
= 選択する選手の数
最適解に時間がかかりすぎると感じた場合は、ヒル クライミングや遺伝的アルゴリズムなどのヒューリスティック ソリューションを使用することをお勧めします。これは、可能な限り結果を最適化しようとしますが、グローバルな最大値を見つける保証はありません。