マッチメイキングリバランスを理解する
注釈:本資料はAI技術を用いて翻訳されています。
概要
この記事では、Accelbyte Gaming Services(AGS)におけるマッチメイキングリバランスプロセスの概要を提供します。リバランスは、マッチメイキングがすでに一緒にマッチングされたプレイヤーをバランスの取れたチームに配置するプロセスです。競技ゲームでは、ゲームプレイが公平であり、チーム間で全体的なプレイヤー統計(MMR、キル数など)が類似していることを確認するために、リバランスプロセスが重要です。デフォルトでは、マッチメイキングルールセットで設定されていない場合、マッチメイキングサービスはrebalance設定を有効にします。リバランスプロセスは、チーム間のメンバー数と(ある場合)マッチメイキング属性を考慮します。例えば、MMRです。さらに、マッチメイキングは常にパーティを持つプレイヤーを同じチームに配置します。
現在、マッチメイキングには3種類のリバランス方法があります:
- Permutation(順列)
- Combination(組み合わせ)
- Greedy(貪欲法)
Permutation
_permutation_方法は、マッチメイキングルールセットの緩い(ルーズな)チーム構成のバックフィルと新しいマッチを作成するために使用されます:
- 最低1人のプレイヤーメンバーを持つセッションへのバックフィル提案。
min_numberとmax_numberのアライアンスルール間で異なる値を持つマッチルールセットの新しいマッチ。またはplayer_min_numberとplayer_max_numberのアライアンスルール間で異なる値を持つマッチルールセットの新しいマッチ。
マッチメイキングは、順列方法を使用してチーム内のパーティシーケンスのセットを生成します。各セットについて、各チームの最大能力を考慮しながら、パーティを各チームに「水平に」割り当てようとします。これは、パーティが最初のチームに割り当てられ、次に次のチームに順次割り当てられることを意味します。マッチメイキングは、パーティがチームに割り当てられる前に、メンバー数の差とマッチ属性の距離ができるだけ小さいことを確認します。このステップにより、チーム構成のセットが生成されます。
各チーム構成のセットは、以前の最良のチーム構成と比較されます。チーム間のメンバー数と(ある場合)マッチング属性(例:MMR)の差が最も小さいチームが最良のチーム構成として選択されます。最終的な最良のチーム構成がバランスの取れたマッチ結果として返されます。
Example
Ruleset:
{
"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つのアクティブなバックフィル可能なセッション(セッション1)があり、1人のメンバー(Player A: Party 1、MMR 70)がいます。そして、以下の構成で3つのパーティがマッチメイキングリクエストを送信しています:
| Player | Party | MMR |
|---|---|---|
| Player B | Party 2 | 60 |
| Player C | Party 3 | 10 |
| Player D | Party 4 | 40 |
| Player E | Party 4 | 40 |
マッチメイキングは、バックフィル提案を作成するために可能なチーム構成を生成し、比較します:
| Result | Player/Party Sequence | Team Composition | Member Count Diff | MMR Distance |
|---|---|---|---|---|
| 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 |
Result 6がマッチメイキングによって使用され、セッション1のバックフィル提案が作成されます。
Combination
_combination_方法は、マッチメイキングルールセットの厳格なチーム構成で新しいマッチを作成するためにのみ使用され、1つのマッチの合計プレイヤー数が12人未満の場合に使用されます:
min_numberとmax_numberのアライアンスルール間で同じ値を持つマッチルールセットの新しいマッチ。かつplayer_min_numberとplayer_max_numberのアライアンスルール間で同じ値を持つマッチルールセットの新しいマッチ。かつ- プレイヤーの合計数(チーム数 * プレイヤー数)< 12。
順列方法と同様に、マッチメイキングは組み合わせ方法を使用してチーム内のパーティシーケンスのセットを生成します。各セットについて、マッチメイキングはパーティを各チームに「垂直に」割り当てます。これは、パーティが最大能力に達するまで最初のチームに割り当てられ、その後次のチームに移動することを意味します。これにより、チーム構成のセットが生成されます。
各チーム構成のセットは、以前の最良のチーム構成と比較されます。アライアンス間のメンバー数と(ある場合)マッチング属性(例:MMR)の差が最も小さいチームが最良のチーム構成として選択されます。最終的な最良のチーム構成がバランスの取れたマッチ結果として返されます。
Example
Ruleset:
{
"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 |
マッチメイキングは、バックフィル提案を作成するために可能なチーム構成を生成し、比較します:
| Result | Player/Party Sequence | Team Composition | Member Count Diff | MMR Distance |
|---|---|---|---|---|
| 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 |
Result 7は、新しいマッチ(ゲームセッション)を作成するために使用される組み合わせ結果です。
Greedy
_greedy_方法は、マッチメイキングルールセットの厳格なチーム構成で新しいマッチを作成するためにのみ使用され、1つのマッチの合計プレイヤー数が12人を超える場合に使用されます:
min_numberとmax_numberのアライアンスルール間で同じ値を持つマッチルールセットの新しいマッチ。かつplayer_min_numberとplayer_max_numberのアライアンスルール間で同じ値を持つマッチルールセットの新しいマッチ。かつ- プレイヤーの合計数(チーム数 * プレイヤー数)> 12。
マッチメイキングは、大量のプレイヤーのリバランスのために貪欲分割法を使用します。チーム構成を属性値の昇順でソートし(セッションが存在する場合)、パーティを合計属性値の降順でソートします。その後、最大値を持つパーティから順に、合計値が最も小さいチームに割り当てます。
Example
Ruleset:
{
"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 ]
各パーティは以下のステップでチームに割り当てられます:
| Step | Sorted team composition | Party | Assign to | Team composition result |
|---|---|---|---|---|
| 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}] |