> ## 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.

# 了解匹配中的规则权重

> 了解 PlayFab 匹配规则上的 Weight 属性如何控制候选者排名、对局质量,以及匹配过程中如何对工单进行排序。

## 概览

配置匹配队列时,你可以为每条规则分配一个 **Weight** 值。权重是一个数值乘数,控制某条规则在匹配系统对符合条件的工单进行排名和排序时的影响程度。它不会改变工单是否通过或未通过某条规则——它只影响**该规则相对于其他规则的重要程度**,以确定哪些工单是对局的最佳候选者。

理解权重对于调优对局质量至关重要。通过在规则之间调整权重,你可以优先考虑对你的游戏最重要的因素——无论是技能平衡、地理接近度还是共享内容。

## 权重如何工作

每条支持权重的规则,都会为正在评估的每对工单计算一个**距离**值。此距离表示两个工单根据该规则的相似或不同程度:

* 距离 **0** 表示这些工单在该规则上完美匹配。
* 距离接近 **1** 表示这些工单处于该规则允许的边缘。
* 距离**无穷大**(硬拒绝)表示无论权重如何,这些工单根据该规则都无法匹配。

匹配系统使用以下公式计算所有加权规则的**总距离**:

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

总距离越低的工单被视为更佳的候选者,在构建对局时会被优先尝试。权重作为标量乘数作用于每条规则对该总和的贡献。

<Info>
  权重**不会**覆盖硬性限制。如果某条规则确定两个工单不兼容,则完全排除这些工单。例如,当 Difference Rule 中的值超过最大允许差异时会发生这种情况。权重只影响已经符合条件的工单之间的**优先顺序**。
</Info>

## 每条规则如何计算距离

在查看权重示例之前,理解每条加权规则如何计算其距离值会有帮助。距离始终是 0 到 1 之间的数字,数值越低表示匹配越接近。

| 规则类型             | 距离公式                                                 | 距离 = 0              | 距离 = 1                   |
| ---------------- | ---------------------------------------------------- | ------------------- | ------------------------ |
| Difference       | `absoluteDifference / maxDifference`                 | 玩家值相同               | 玩家相差最大允许量                |
| String Equality  | 字符串匹配时为 0;若规则可选且字符串不同则为 1                            | 字符串相同               | 规则可选且字符串不同               |
| Set Intersection | `1 / (1 + sharedItemCount)`                          | 不适用(共享一个项目时最小为 0.5) | 无共享项目(`1 / (1 + 0) = 1`) |
| Match Total      | `(maxTotal - (groupTotal + ticketValue)) / maxTotal` | 组已达到目标容量            | 组远离目标总数                  |
| Region Selection | `1 / (1 + Σ qualityTerms)`                           | 有许多低延迟共同区域          | 共同区域少或质量差                |

## 哪些规则支持权重

权重适用于参与基于距离排序的**标准规则类型**。以下规则支持 Weight 属性:

| 规则类型             | 支持权重 |
| ---------------- | :--: |
| String Equality  |   ✔  |
| Difference       |   ✔  |
| Set Intersection |   ✔  |
| Match Total      |   ✔  |
| Region Selection |   ✔  |

以下**团队规则类型\*\*\*\*不**支持权重。这些规则作为验证器——它们要么通过要么拒绝对局,不参与基于距离的排序:

| 规则类型                        | 支持权重 | 行为                 |
| --------------------------- | :--: | ------------------ |
| Team Difference             |   ✘  | 验证团队平均值是否在允许的差异范围内 |
| Team Size Balance           |   ✘  | 验证团队玩家数量是否平衡       |
| Team Ticket Size Similarity |   ✘  | 验证团队是否具有相似的队伍组成    |

## 有效的权重值

权重必须是**大于 0** 且**最大为 1000**(含)的数字。不允许权重为 0。如果未指定权重,默认值为 **1**。

## 示例

以下示例使用了一个具有针对技能的 **Difference Rule** 和针对首选游戏地图的 **Set Intersection Rule** 的队列。三名玩家——Alice、Bob 和 Charlie——都在队列中。匹配系统需要决定两个候选者(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
    }
]
```

### 玩家属性

| 玩家      | 技能 | 首选地图                           |
| ------- | -- | ------------------------------ |
| Alice   | 20 | "Dustbowl"、"Summit"、"Lakeside" |
| Bob     | 24 | "Dustbowl"、"Summit"            |
| Charlie | 17 | "Lakeside"                     |

### 步骤 1:计算每条规则的距离

**SkillRule**(Difference Rule)使用公式 `absoluteDifference / maxDifference`:

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

**MapRule**(Set Intersection Rule)使用公式 `1 / (1 + sharedItemCount)`:

* Alice vs Bob:他们共享 "Dustbowl" 和 "Summit"(两项)→ `1 / (1 + 2) = 0.33`
* Alice vs Charlie:他们共享 "Lakeside"(一项)→ `1 / (1 + 1) = 0.5`

### 示例 1:相同权重

两条规则的 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 权重:

```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)是更佳的匹配。技能上更高的权重意味着 Charlie 更接近的技能水平(3 差距对 4)胜过 Bob 共享更多地图的事实。技能主导了排序顺序。

### 示例 3:优先考虑共享地图(MapRule 上 Weight = 10)

如果你的游戏是休闲游戏,玩家最关心在自己喜爱的地图上游戏,则改为提高 MapRule 的权重:

```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 共享两张地图给了 Bob 显著的优势,与 Charlie 的小幅技能差距几乎不重要。地图偏好主导了排序顺序。

### 示例 4:当玩家无法匹配时(硬拒绝)

现在添加第四名玩家 **Dave**,他的技能远离 Alice,且不共享任何首选地图:

| 玩家    | 技能 | 首选地图                           |
| ----- | -- | ------------------------------ |
| 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)
```

无论权重如何配置,Dave 都无法与 Alice 匹配。即使只有一条规则返回无穷大距离,整个总距离都会变为无穷大,该工单将从候选列表中排除。权重无法覆盖硬拒绝——它只能影响已符合条件的工单之间的优先级。要让像 Dave 这样的玩家最终能匹配,请使用[规则扩展](/services/playfab/multiplayer/matchmaking/config-queues#expansions-and-becoming-optional)随时间放宽限制。

### 示例摘要

下表显示了使用相同的玩家属性和相同的规则——仅权重不同——权重如何改变哪个候选者被优先选择。

| 权重配置                 | Bob 的总距离 | Charlie 的总距离 | Dave 的总距离 | Alice 的最佳匹配 |
| -------------------- | :------: | :----------: | :-------: | ----------- |
| 技能 = 1,地图 = 1(相等)    |   0.73   |     0.80     |   ∞(已拒绝)  | Bob         |
| 技能 = 10,地图 = 1(技能优先) |   4.33   |     3.50     |   ∞(已拒绝)  | Charlie     |
| 技能 = 1,地图 = 10(地图优先) |   3.70   |     5.30     |   ∞(已拒绝)  | Bob         |

底层距离从不改变——只有分配给每条规则的相对重要性发生变化。无论权重如何,Dave 始终被拒绝,因为玩家属性超过了硬性限制。这就是权重调优的强大之处。

## 权重与规则扩展

当规则变为可选时(通过 [Seconds until optional](/services/playfab/multiplayer/matchmaking/config-queues#expansions-and-becoming-optional) 或扩展),它不再硬性拒绝工单。然而,原本会被拒绝的工单仍会收到非零的距离值。权重会继续对此距离进行缩放,这意味着可选规则仍会影响排序顺序——它们将“违规”工单在优先级中推后,而不是完全排除。

此行为对于确保即使规则随时间放宽,最佳匹配仍受青睐非常有用。

## 最佳实践

* **从相同的权重开始**,根据玩家的对局质量反馈进行调整。
* 对对游戏体验最重要的规则(例如竞技类游戏的技能,或休闲游戏的共享内容)**使用更高的权重**。
* **记住权重只影响排序**——它无法使不可能的匹配成为可能。使用[扩展](/services/playfab/multiplayer/matchmaking/config-queues#expansions-and-becoming-optional)随时间放宽硬性限制。
* **避免极端的权重比率**(例如 1000:1),除非你有意让一条规则完全压倒所有其他规则。

## 另请参阅

* [配置匹配队列](/services/playfab/multiplayer/matchmaking/config-queues)
* [匹配场景和配置示例](/services/playfab/multiplayer/matchmaking/config-examples)
* [使用工单指定属性](/services/playfab/multiplayer/matchmaking/ticket-attributes)


## Related topics

- [配置匹配队列](/zh-CN/services/playfab/multiplayer/matchmaking/config-queues.md)
- [匹配扩容](/zh-CN/services/playfab/multiplayer/matchmaking/matchmaking-partition.md)
- [在 Partner Center 中配置匹配](/zh-CN/services/xbox-services/multiplayer/matchmaking/config/live-matchmaking-config.md)
- [匹配的工作原理](/zh-CN/services/playfab/multiplayer/matchmaking/how-matchmaking-works.md)
- [匹配](/zh-CN/services/playfab/multiplayer/matchmaking/index.md)
