> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Understanding rule weight in matchmaking

> PlayFab マッチメイキング ルールの Weight プロパティが、候補ランキング、マッチ品質、およびマッチング時のチケットの並べ替えをどのように制御するかを理解します。

## 概要

マッチメイキング キューを構成するとき、各ルールに **Weight** 値を割り当てることができます。Weight は、マッチメイキング システムが有資格のチケットをランク付けおよび並べ替えるときに、特定のルールにどれだけの影響力を持たせるかを制御する数値の乗数です。チケットがルールを合格するかどうかは変更されません。マッチに最適な候補チケットを判定する際に、**そのルールが他のルールと比べてどの程度重要か** にのみ影響します。

Weight を理解することは、マッチ品質のチューニングに不可欠です。ルール全体で weight を調整することで、ゲームにとって最も重要なもの (スキル バランス、地理的な近さ、共有コンテンツなど) を優先できます。

## Weight の動作の仕組み

weight をサポートするすべてのルールは、評価される各チケット ペアの **距離** 値を計算します。この距離は、そのルールに従って 2 つのチケットがどの程度似ているか、または異なるかを表します。

* 距離が **0** は、チケットがそのルールで完全にマッチすることを意味します。
* 距離が **1** に近いほど、ルールが許容する境界にチケットがあることを意味します。
* 距離が **無限大** (ハード拒否) の場合、weight に関係なく、チケットはそのルールに従ってマッチできないことを意味します。

マッチメイキング システムは、以下の式を使用して、weight のあるすべてのルールにわたる **合計距離** を計算します。

```
totalDistance = Σ (rule.Weight × rule.Distance)
```

合計距離が低いチケットは、より良い候補と見なされ、マッチを構築するときに最初に試されます。Weight は、各ルールがこの合計に寄与する量に対するスカラー乗数として機能します。

<Info>
  Weight はハード制約を **上書きしません**。ルールが 2 つのチケットは互換性がないと判断した場合、それらのチケットは完全に除外されます。たとえば、これは Difference ルールで値が許容される最大差を超えた場合に発生します。Weight は、すでに資格のあるチケット間の **優先順序** にのみ影響します。
</Info>

## 各ルールが距離を計算する方法

Weight の例を見る前に、weight のある各ルールがどのように距離値を計算するかを理解することが役立ちます。距離は常に 0 から 1 の間の数値で、値が低いほどより近いマッチであることを示します。

| ルールの種類           | 距離の式                                                 | 距離 = 0                    | 距離 = 1                       |
| ---------------- | ---------------------------------------------------- | ------------------------- | ---------------------------- |
| Difference       | `absoluteDifference / maxDifference`                 | プレイヤーの値が同一                | プレイヤーが許可される最大量分だけ異なる         |
| String Equality  | 文字列がマッチする場合は 0、ルールが任意で文字列が異なる場合は 1                   | 文字列が同一                    | ルールが任意で文字列が異なる               |
| Set Intersection | `1 / (1 + sharedItemCount)`                          | 該当なし (共通アイテム 1 個で最小は 0.5) | 共有アイテムなし (`1 / (1 + 0) = 1`) |
| Match Total      | `(maxTotal - (groupTotal + ticketValue)) / maxTotal` | グループがターゲット容量にある           | グループがターゲット合計から遠い             |
| Region Selection | `1 / (1 + Σ qualityTerms)`                           | 低レイテンシの共通リージョンが多数         | 共通リージョンが少ないか低品質              |

## Weight をサポートするルール

Weight は、距離ベースのソートに参加する **標準のルールの種類** に適用されます。以下のルールは Weight プロパティをサポートします。

| ルールの種類           | Weight をサポート |
| ---------------- | :----------: |
| String Equality  |       ✔      |
| Difference       |       ✔      |
| Set Intersection |       ✔      |
| Match Total      |       ✔      |
| Region Selection |       ✔      |

以下の **チーム ルールの種類** は weight を **サポートしません**。これらのルールはバリデーターとして機能します。マッチを合格または不合格にし、距離ベースのソートには参加しません。

| ルールの種類                      | Weight をサポート | 動作                        |
| --------------------------- | :----------: | ------------------------- |
| Team Difference             |       ✘      | チーム平均が許容差の範囲内にあることを検証     |
| Team Size Balance           |       ✘      | チームのプレイヤー数がバランスされていることを検証 |
| Team Ticket Size Similarity |       ✘      | チームが同様のパーティ構成を持つことを検証     |

## 有効な weight 値

Weight は、**0 より大きく**、**1000 まで** (両端を含む) の数値でなければなりません。weight を 0 に設定することはできません。weight が指定されていない場合、デフォルト値は **1** です。

## 例

以下の例では、スキル用の **Difference ルール** と、希望するゲーム マップ用の **Set Intersection ルール** を使用したキューを使用します。3 人のプレイヤー — Alice、Bob、Charlie — がキューに入っています。マッチメイキング システムは、2 人の候補 (Bob または Charlie) のどちらが Alice にとってより良いマッチかを決定する必要があります。

### キュー構成

```json theme={null}
"Rules": [
    {
        "Type": "DifferenceRule",
        "Name": "SkillRule",
        "Attribute": { "Path": "skill", "Source": "User" },
        "MaxDifference": 10,
        "MergeFunction": "Average",
        "Weight": 1
    },
    {
        "Type": "SetIntersectionRule",
        "Name": "MapRule",
        "Attribute": { "Path": "preferredMaps", "Source": "User" },
        "MinIntersectionSize": 1,
        "Weight": 1
    }
]
```

### プレイヤーの属性

| プレイヤー   | Skill | Preferred Maps                   |
| ------- | ----- | -------------------------------- |
| Alice   | 20    | "Dustbowl", "Summit", "Lakeside" |
| Bob     | 24    | "Dustbowl," "Summit"             |
| Charlie | 17    | "Lakeside"                       |

### ステップ 1: ルールごとの距離を計算する

**SkillRule** (Difference ルール) は式 `absoluteDifference / maxDifference` を使用します。

* Alice 対 Bob: `|20 - 24| / 10 = 4 / 10 = 0.4`
* Alice 対 Charlie: `|20 - 17| / 10 = 3 / 10 = 0.3`

**MapRule** (Set Intersection ルール) は式 `1 / (1 + sharedItemCount)` を使用します。

* Alice 対 Bob: 彼らは "Dustbowl" と "Summit" (2 個のアイテム) を共有 → `1 / (1 + 2) = 0.33`
* Alice 対 Charlie: 彼らは "Lakeside" (1 個のアイテム) を共有 → `1 / (1 + 1) = 0.5`

### 例 1: 同じ weight

両方のルールで Weight = 1 の場合、合計距離は次のとおりです。

```
Bob:     totalDistance = (1 × 0.4)  + (1 × 0.33) = 0.73
Charlie: totalDistance = (1 × 0.3)  + (1 × 0.5)  = 0.80
```

**結果:** Bob (0.73) は Charlie (0.80) よりも良いマッチです。Charlie の方がスキルは近いですが、Bob は Alice とより多くのマップを共有し、両方のルールが等しく寄与します。Bob が最初に試されます。

### 例 2: スキルを優先 (SkillRule の Weight = 10)

ゲームが競争的でスキル バランスが最も重要な場合、SkillRule の weight を上げます。

```json theme={null}
{
    "Type": "DifferenceRule",
    "Name": "SkillRule",
    ...
    "Weight": 10
},
{
    "Type": "SetIntersectionRule",
    "Name": "MapRule",
    ...
    "Weight": 1
}
```

これで合計距離が変わります。

```
Bob:     totalDistance = (10 × 0.4)  + (1 × 0.33) = 4.33
Charlie: totalDistance = (10 × 0.3)  + (1 × 0.5)  = 3.50
```

**結果:** Charlie (3.50) が今度はより良いマッチです。スキルの weight が高いことは、Charlie のより近いスキル レベル (差 3 対 4) が、Bob がより多くのマップを共有するという事実を上回ることを意味します。スキルがソート順を支配します。

### 例 3: 共有マップを優先 (MapRule の Weight = 10)

ゲームがカジュアルで、プレイヤーが好きなマップでプレイすることを最も重視する場合は、代わりに MapRule の weight を上げます。

```json theme={null}
{
    "Type": "DifferenceRule",
    "Name": "SkillRule",
    ...
    "Weight": 1
},
{
    "Type": "SetIntersectionRule",
    "Name": "MapRule",
    ...
    "Weight": 10
}
```

これで合計距離は次のようになります。

```
Bob:     totalDistance = (1 × 0.4)  + (10 × 0.33) = 3.70
Charlie: totalDistance = (1 × 0.3)  + (10 × 0.5)  = 5.30
```

**結果:** Bob (3.70) が優先されます。Alice と 2 つのマップを共有することで、Bob は大きなアドバンテージを得ており、Charlie とのスキルの小さな差はほとんど関係ありません。マップの好みがソート順を支配します。

### 例 4: プレイヤーがマッチできない場合 (ハード拒否)

4 人目のプレイヤー、**Dave** を追加します。彼のスキルは Alice から遠く、希望マップを共有していません。

| プレイヤー | Skill | Preferred Maps                   |
| ----- | ----- | -------------------------------- |
| Alice | 20    | "Dustbowl," "Summit," "Lakeside" |
| Dave  | 35    | "Fortress"                       |

**SkillRule:** `|20 - 35| / 10 = 15 / 10 = 1.5` — ただし、差 15 が `MaxDifference` (10) を超えるため、ルールは **無限大の距離** を返します (ハード拒否)。

**MapRule:** Alice と Dave は 0 マップを共有し、`MinIntersectionSize` は 1 であるため、このルールも **無限大の距離** を返します。

```
Dave: totalDistance = infinite  (skill difference 15 > MaxDifference 10 → hard rejection)
```

weight をどのように構成しても、Dave は Alice とマッチできません。1 つのルールだけが無限大の距離を返しても、合計距離全体が無限大となり、チケットは候補リストから除外されます。Weight はハード拒否を上書きできず、すでに資格のあるチケット間の優先度にのみ影響します。Dave のようなプレイヤーが最終的にマッチできるようにするには、時間とともに制約を緩和する [ルール拡張](/services/playfab/multiplayer/matchmaking/config-queues#expansions-and-becoming-optional) を使用します。

### 例のまとめ

以下の表は、同じプレイヤー属性と同じルールを使用し、weight のみが異なる場合に、weight がどの候補を優先するかをどのように変更するかを示しています。

| Weight 構成                    | Bob の合計距離 | Charlie の合計距離 | Dave の合計距離 | Alice にとって最適なマッチ |
| ---------------------------- | :-------: | :-----------: | :--------: | ---------------- |
| Skill = 1, Maps = 1 (同じ)     |    0.73   |      0.80     |   ∞ (拒否)   | Bob              |
| Skill = 10, Maps = 1 (スキル優先) |    4.33   |      3.50     |   ∞ (拒否)   | Charlie          |
| Skill = 1, Maps = 10 (マップ優先) |    3.70   |      5.30     |   ∞ (拒否)   | Bob              |

基となる距離は決して変わりません。各ルールに割り当てられた相対的な重要度のみが変わります。Dave のプレイヤー属性はハード リミットを超えているため、weight に関係なく常に拒否されます。これが weight チューニングの威力です。

## Weight とルール拡張

ルールが ([Seconds until optional](/services/playfab/multiplayer/matchmaking/config-queues#expansions-and-becoming-optional) や拡張を通じて) 任意になった場合、チケットをハード拒否することはなくなります。ただし、拒否されたはずのチケットも 0 以外の距離値を受け取ります。Weight はこの距離をスケーリングし続けるため、任意ルールでもソート順に影響します。ルールを「違反する」チケットを完全に除外するのではなく、優先度で下位に押しやります。

この動作は、時間とともにルールが緩やかになった場合でも、最良のマッチが依然として優先されることを保証するのに有用です。

## ベスト プラクティス

* **同じ weight から開始し**、プレイヤーからのマッチ品質のフィードバックに基づいて調整します。
* ゲーム体験にとって最も重要なルール (競技タイトルのスキル、カジュアル ゲームの共有コンテンツなど) には **より高い weight を使用** します。
* **Weight はソートにのみ影響することを覚えておいてください**。それだけでは、不可能なマッチを可能にすることはできません。ハード制約を時間とともに緩和するには、[拡張](/services/playfab/multiplayer/matchmaking/config-queues#expansions-and-becoming-optional) を使用します。
* 1 つのルールが他のすべてを完全に上回るように意図する場合を除き、**極端な weight 比 (1000:1 など) は避けてください**。

## 関連項目

* [マッチメイキング キューの構成](/services/playfab/multiplayer/matchmaking/config-queues)
* [マッチメイキング シナリオと構成の例](/services/playfab/multiplayer/matchmaking/config-examples)
* [チケットでの属性の指定](/services/playfab/multiplayer/matchmaking/ticket-attributes)


## Related topics

- [How matchmaking works](/ja-jp/services/playfab/multiplayer/matchmaking/how-matchmaking-works.md)
- [EventRuleMatch](/ja-jp/services/playfab/api-references/events/data-types/eventrulematch.md)
- [Using Server Backfill Tickets - REST API](/ja-jp/services/playfab/multiplayer/matchmaking/backfill-tickets.md)
- [PFMultiplayerServerBuildSelectionCriterion](/ja-jp/services/playfab/api-references/c/pfmultiplayerservertypes/structs/pfmultiplayerserverbuildselectioncriterion.md)
- [Specifying attributes with your tickets](/ja-jp/services/playfab/multiplayer/matchmaking/ticket-attributes.md)
