マッチメイキングリバランスを理解する
注釈:本資料はAI技術を用いて翻訳されています。
概要
この記事では、AccelByte Gaming Services(AGS)におけるマッチメイキングのリバランスプロセスの概要を説明します。リバランスとは、マッチメイキングが各パーティをどのチームスロットに割り当てるかを決定するプロセスです。パーティのメンバーがチーム間で分割されることは一切ありません。パーティは常に1つのまとまった単位として移動します。競技性の高いゲームにおいて、これはパーティをまとめたまま、MMRなどのチーム全体の統計をバランスさせられるという点で重要です。デフォルトでは、マッチメイキングルールセットで設定されていない場合、マッチメイキングサービスはrebalance設定を有効にします。リバランスプロセスでは、チーム間のメンバー数と、設定されていればMMRなどのマッチメイキング属性が考慮されます。
リバランスが実行されるタイミング
リバランスは、新しいマッチとバックフィルの両方で実行されます。
- 新しいマッチ: すべてのパーティが再配置の対象となります。リバランスは最適な編成を見つけるため、任意のパーティを任意のチームスロットに自由に割り当てます。
- バックフィル: 新しいチケットが既存のセッションに参加する際、マッチメイキングはそのセッションに既に参加しているすべてのパーティをロックし、現在のチームスロットに留まるようにします。新たに参加するチケットのパーティのみがロック解除され、再配置の対象となります。リバランスはその後、新しいパーティをどのチームスロットに割り当てるかを決定します。
パーティの一体性
リバランスは、パーティのメンバーをチーム間で分割することは一切ありません。パーティは常に1つのまとまった単位として移動します。リバランスが決定するのは、パーティがどのチームスロットに入るかのみであり、パーティ内のプレイヤーの配置方法は決定しません。
リバランス方式
現在、マッチメイキングには3種類のリバランス方式があります。
- Permutation(順列)
- Combination(組み合わせ)
- Greedy(貪欲法)
Permutation(順列)
permutation(順列)方式は、マッチメイキングルールセットにおいてゆるい(relax)チーム構成のバックフィルと新しいマッチを作成する際に使用されます。
- 最低1人のプレイヤーメンバーを持つセッションへのバックフィル提案。
min_numberとmax_numberのアライアンスルールの値が異なるマッチルールセットの新しいマッチ。またはplayer_min_numberとplayer_max_numberのアライアンスルールの値が異なるマッチルールセットの新しいマッチ。
マッチメイキングはpermutation方式を使用して、チーム内のパーティシーケンスの集合を生成します。各集合について、パーティを各チームに「水平に」割り当てようとします。つまり、各チームの最大収容能力を考慮しながら、パーティをまず最初のチームに割り当て、続いて次のチームへと順番に割り当てていきます。マッチメイキングはまた、パーティがチームに割り当てられる前に、メンバー数の差とマッチ属性の距離が最小限になるようにします。このステップにより、複数のチーム編成の集合が生成されます。
生成された各チーム編成の集合は、それまでの最良のチーム編成と比較検証されます。チーム間のメンバー数の差と(存在する場合の)マッチング属性(すなわちMMR)の差が最小のチームが、最良のチーム編成として選択されます。最終的な最良のチーム編成が、バランスの取れたマッチ結果として返されます。
例
ルールセット:
{
"auto_backfill": true,
"alliance": {
"min_number": 1,
"max_number": 2,
"player_min_number": 1,
"player_max_number": 3
},
"matching_rule": [
{
"attribute": "mmr",
"criteria": "distance",
"reference": 100,
"max": 3000
}
]
}
1人のメンバー(Player A: Party 1、MMR 70)を持つ、バックフィル可能なアクティブセッション(session 1)が1つあります。そして、以下の構成で3つのパーティがマッチメイキングリクエストを送信しています。
| Player | Party | MMR |
|---|---|---|
| Player B | Party 2 | 60 |
| Player C | Party 3 | 10 |
| Player D | Party 4 | 40 |
| Player E | Party 4 | 40 |
マッチメイキングは、バックフィル提案を作成するために、考えられるチーム編成を生成し比較します。
| 結果 | プレイヤー/パーティのシーケンス | チーム編成 | メンバー数の差 | MMR距離 |
|---|---|---|---|---|
| 1 | [{B},{C},{D,E}] | team[1]:[{A},{C}] team[2]:[{B},{D,E}] | 1 | 6.66 |
| 2 | [{B},{D,E},{C}] | team[1]:[{A},{D,E}] team[2]:[{B},{C}] | 1 | 15 |
| 3 | [{C},{B},{D,E}] | team[1]:[{A},{D,E}] team[2]:[{C},{B}] | 1 | 15 |
| 4 | [{C},{D,E},{B}] | team[1]:[{A},{D,E}] team[2]:[{C},{B}] | 1 | 15 |
| 5 | [{D,E},{C},{B}] | team[1]:[{A},{C},{B}] team[2]:[{D,E}] | 1 | 6.66 |
| 6 | [{D,E},{B},{C}] | team[1]:[{A},{B}, {C}] team[2]:[{D,E}] | 1 | 6.66 |
結果6が、session 1のバックフィル提案を作成するためにマッチメイキングによって使用されます。
Combination(組み合わせ)
combination(組み合わせ)方式は、マッチメイキングルールセットにおいて厳格なチーム構成の新しいマッチを作成する場合のみ使用され、1マッチあたりの合計プレイヤー数が12人未満の場合に適用されます。
min_numberとmax_numberのアライアンスルールの値が同じマッチルールセットの新しいマッチ。かつplayer_min_numberとplayer_max_numberのアライアンスルールの値が同じマッチルールセットの新しいマッチ。かつ- プレイヤーの合計数(チーム数×プレイヤー数)が12人未満であること。
permutation方式と同様に、マッチメイキングはcombination方式を使用して、チーム内のパーティシーケンスの集合を生成します。各集合について、マッチメイキングはパーティを各チームに「垂直に」割り当てます。つまり、最初のチームが最大収容能力に達するまでパーティが割り当てられ、その後次のチームへ移動します。これにより、複数のチーム編成の集合が生成されます。
生成された各チーム編成の集合は、それまでの最良のチーム編成と比較検証されます。アライアンス間のメンバー数の差と(存在する場合の)マッチング属性(すなわちMMR)の差が最小のチームが、最良のチーム編成として選択されます。最終的な最良のチーム編成が、バランスの取れたマッチ結果として返されます。
例
ルールセット:
{
"alliance": {
"min_number": 2,
"max_number": 2,
"player_min_number": 3,
"player_max_number": 3
},
"matching_rule": [
{
"attribute": "mmr",
"criteria": "distance",
"reference": 100,
"max": 3000
}
]
}
以下の構成で5つのパーティがマッチメイキングリクエストを送信しています。
| Player | Party | MMR |
|---|---|---|
| Player A | Party 1 | 70 |
| Player B | Party 2 | 60 |
| Player C | Party 2 | 60 |
| Player D | Party 3 | 40 |
| Player E | Party 4 | 40 |
| Player F | Party 5 | 10 |
マッチメイキングは、新しいマッチを作成するために、考えられるチーム編成を生成し比較します。
| 結果 | プレイヤー/パーティのシーケンス | チーム編成 | メンバー数の差 | MMR距離 |
|---|---|---|---|---|
| 1 | [{A},{B,C},{D},{E},{F}] | team[1]:[{A},{B,C}] team[2]:[{D},{E},{F}] | 0 | 33.34 |
| 2 | [{A},{D},{E},{B,C},{F}] | team[1]:[{A},{D},{E}] team[2]:[{B,C},{F}] | 0 | 6.66 |
| 3 | [{A},{D},{F},{B,C},{E}] | team[1]:[{A},{D},{F}] team[2]:[{B,C},{E}] | 0 | 13.34 |
| 4 | [{A},{E},{F},{B,C},{D}] | team[1]:[{A},{E},{F}] team[2]:[{B,C},{D}] | 0 | 13.34 |
| 5 | [{B,C},{D},{A},{E},{F}] | team[1]:[{B,C},{D}] team[2]:[{A},{E},{F}] | 0 | 13.34 |
| 6 | [{B,C},{E},{A},{D},{F}] | team[1]:[{B,C},{E}] team[2]:[{A},{D},{F}] | 0 | 13.34 |
| 7 | [{B,C},{F},{A},{D},{E}] | team[1]:[{B,C},{F}] team[2]:[{A},{D},{E}] | 0 | 6.66 |
| 8 | [{D},{E},{F},{A},{B,C}] | team[1]:[{D},{E},{F}] team[2]:[{A},{B,C}] | 0 | 33.34 |
結果6が、新しいマッチ(ゲームセッション)を作成するために使用される組み合わせ結果です。
Greedy(貪欲法)
greedy(貪欲法)方式は、マッチメイキングルールセットにおいて厳格なチーム構成の新しいマッチを作成する場合のみ使用され、1マッチあたりの合計プレイヤー数が12人を超える場合に適用されます。
min_numberとmax_numberのアライアンスルールの値が同じマッチルールセットの新しいマッチ。かつplayer_min_numberとplayer_max_numberのアライアンスルールの値が同じマッチルールセットの新しいマッチ。かつ- プレイヤーの合計数(チーム数×プレイヤー数)が12人を超えること。
マッチメイキングは、大人数のプレイヤーをリバランスするためにgreedy partitioning(貪欲分割)方式を使用します。(既存のセッションがある場合)チーム編成を属性値の昇順でソートし、パーティを合計属性値の降順でソートします。その後、最も大きな値を持つパーティから順に(1つずつ)、合計値が最も小さいチームに割り当てていきます。
例
ルールセット:
{
"alliance": {
"min_number": 2,
"max_number": 2,
"player_min_number": 7,
"player_max_number": 7
},
"matching_rule": [
{
"attribute": "mmr",
"criteria": "distance",
"reference": 100,
"max": 3000
}
]
}
以下の構成で8つのパーティがマッチメイキングリクエストを送信しています。
| Player | Party | MMR |
|---|---|---|
| Player A | Party 1 | 70 |
| Player B | Party 2 | 40 |
| Player C | Party 2 | 40 |
| Player D | Party 3 | 40 |
| Player E | Party 4 | 60 |
| Player F | Party 5 | 50 |
| Player G | Party 6 | 70 |
| Player H | Party 6 | 70 |
| Player I | Party 7 | 60 |
| Player J | Party 7 | 60 |
| Player K | Party 7 | 60 |
| Player L | Party 8 | 50 |
| Player M | Party 8 | 50 |
| Player N | Party 8 | 50 |
パーティは合計属性(MMR)値の降順でソートされます。
[ {I,J,K}:180, {L,M,N}:150, {G,H}:140, {B,C}:80, {A}:70, {E}:60, {F}:50, {D}:40 ]
各パーティは以下の手順でチームに割り当てられます。
| ステップ | ソートされたチーム編成 | パーティ | 割り当て先 | チーム編成結果 |
|---|---|---|---|---|
| 1 | team[1]:[]:0 team[2]:[]:0 | {I,J,K} | team[1] | team[1]:[{I,J,K}] team[2]:[] |
| 2 | team[2]:[]:0 team[1]:[{I,J,K}]:180 | {L,M,N} | team[2] | team[1]:[{I,J,K}] team[2]:[{L,M,N}] |
| 3 | team[2]:[{L,M,N}]:150 team[1]:[{I,J,K}]:180 | {G,B} | team[2] | team[1]:[{I,J,K}] team[2]:[{L,M,N},{G,H}] |
| 4 | team[1]:[{I,J,K}]:180 team[2]:[{L,M,N},{G,H}]:290 | {B,C} | team[1] | team[1]:[{I,J,K},{B,C}] team[2]:[{L,M,N},{G,H}] |
| 5 | team[1]:[{I,J,K},{B,C}]:260 team[2]:[{L,M,N},{G,H}]:290 | {A} | team[1] | team[1]:[{I,J,K},{B,C},{A}] team[2]:[{L,M,N},{G,H}] |
| 6 | team[2]:[{L,M,N},{G,H}]:290team[1]:[{I,J,K},{B,C},{A}]:330 | {E} | team[2] | team[1]:[{I,J,K},{B,C},{A}] team[2]:[{L,M,N},{G,H},{E}] |
| 7 | team[1]:[{I,J,K},{B,C},{A}]:330 team[2]:[{L,M,N},{G,H},{E}]:350 | {F} | team[1] | team[1]:[{I,J,K},{B,C},{A},{F}] team[2]:[{L,M,N},{G,H},{E}] |
| 8 | team[2]:[{L,M,N},{G,H},{E}]:350 team[1]:[{I,J,K},{B,C},{A},{F}]:380 | {D} | team[2] | team[1]:[{I,J,K},{B,C},{A},{F}] team[2]:[{L,M,N},{G,H},{E},{D}] |