

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 自定义匹配算法
<a name="match-rulesets-components-algorithm"></a>

FlexMatch 优化了大多数游戏的默认算法，以最少的等待时间让玩家进入可接受的对战。您可以自定义算法并调整游戏的对战。

以下是默认的 FlexMatch 对战算法：

1. FlexMatch 将所有未完成的对战票证和回填票证放入票池中。

1. FlexMatch 将池中的票证随机分组为一个或多个批次。随着票池的增大，FlexMatch 会形成额外的批次以保持最佳的批次大小。

1. FlexMatch 在每个批次中按年龄对票证进行排序。

1. FlexMatch 根据每批中最旧的票证建立匹配项。

要自定义匹配算法，请在您的规则集架构中添加一个 `algorithm` 组件。有关完整参考信息，请参阅[FlexMatch 规则集架构](match-ruleset-schema.md)。

使用以下可选自定义项来影响对战过程的不同阶段。
+ [添加批处理前排序](#match-rulesets-components-algorithm-presort)
+ [根据 batchDistance 属性形成批次](https://docs.amazonaws.cn//gameliftservers/latest/flexmatchguide/match-rules-reference-ruletype.html#match-rules-reference-ruletype-batchdistance)
+ [优先考虑回填工单](#match-rulesets-components-algorithm-backfill)
+ [偏爱带有扩展版的旧票证](#match-rulesets-components-algorithm-expansion)

## 添加批处理前排序
<a name="match-rulesets-components-algorithm-presort"></a>

您可以在形成批次之前对票池进行排序。这种类型的自定义对于拥有大量票证池的游戏最为有效。预批次排序可以帮助加快对战过程并提高玩家在定义特征上的统一性。

使用算法属性 `batchingPreference` 定义批处理前的排序方法。默认设置为 `random`。

自定义批处理前排序的选项包括：
+ **按玩家属性排序。**提供玩家属性列表以对票证池进行预排序。

  要按玩家属性排序，`batchingPreference` 请设置为 `sorted`，然后在 `sortByAttributes` 中定义您的玩家属性列表。要使用属性，请先在规则集的 `playerAttributes` 组件中声明该属性。

  在以下示例中，FlexMatch 根据玩家的首选游戏地图，然后按玩家技能对票证池进行排序。生成的批次更有可能包含想要使用相同地图的技能相似的玩家。

  ```
  "algorithm": {
      "batchingPreference": "sorted",
      "sortByAttributes": ["map", "player_skill"],
      "strategy": "exhaustiveSearch"
  },
  ```
+ **按延迟排序。**以最低的可用延迟创建匹配项，或者以可接受的延迟快速创建匹配项。此自定义对于形成超过 40 名玩家的大型对战的规则集非常有用。

  将算法属性 `strategy` 设置为 `balanced`。平衡策略限制了规则语句的可用类型。有关更多信息，请参阅 [设计 FlexMatch 大型对战规则集](match-design-rulesets-large.md)。

  FlexMatch 通过以下方式之一，根据玩家报告的延迟数据对票证进行排序：
  + *延迟最低的位置。*票证池按玩家报告最低延迟值的位置进行预先排序。然后，FlexMatch 在相同的位置以低延迟对票证进行批处理，从而创造更好的游戏体验。它还减少了每批票证的数量，因此对战可能需要更长的时间。要使用此自定义设置，请将 `batchingPreference` 设置为 `fastestRegion`，如以下示例所示。

    ```
    "algorithm": {
        "batchingPreference": "fastestRegion",
        "strategy": "balanced"
    },
    ```
  + *可接受的延迟很快就会匹配。*票证池按玩家报告可接受延迟值的位置进行预先排序。这会形成更少的批次，包含更多的票证。每批票证越多，就能更快地找到可接受的匹配项。要使用此自定义设置，请将属性 `batchingPreference` 设置为 ` largestPopulation`，如以下示例所示。

    ```
    "algorithm": {
        "batchingPreference": "largestPopulation",
        "strategy": "balanced"
    },
    ```
**注意**  
平衡策略的默认值为 `largestPopulation`。

## 优先考虑回填工单
<a name="match-rulesets-components-algorithm-backfill"></a>

如果您的游戏实现了自动回填或手动回填，则可以根据请求类型自定义 FlexMatch 处理对战票证的方式。请求类型可以是新的匹配请求或回填请求。默认情况下，FlexMatch 对两种类型的请求都一视同仁。

回填优先级会影响 FlexMatch 在对票证进行批处理后的处理方式。回填优先级要求规则集使用详尽的搜索策略。

FlexMatch 不会将多张回填票证匹配在一起。

要更改回填票证的优先级，请设置属性 `backfillPriority`。
+ **先匹配回填票证。**在创建新的匹配项之前，此选项会尝试匹配回填票证。这意味着新玩家加入现有游戏的几率更高。

  如果您的游戏使用自动回填功能，则最好使用此选项。自动回填通常用于游戏会话短、玩家周转率高的游戏。自动回填可以帮助这些游戏形成最低限度的可行匹配并开始对战，而 FlexMatch 则会搜索更多玩家来填补空缺位置。

  将 `backfillPriority` 设置为 `high`。

  ```
  "algorithm": {
      "backfillPriority": "high",
      "strategy": "exhaustiveSearch"
  },
  ```
+ **最后匹配回填票证。**此选项会忽略回填票证，直到它评估所有其他票证。这意味着，当 FlexMatch 无法将新玩家匹配到新游戏时，它会将他们重新填充到现有游戏中。

  当您想使用回填作为最后机会让玩家进入游戏时，例如当没有足够的玩家来组建新的对战时，这个选项很有用。

  将 `backfillPriority` 设置为 `low`。

  ```
  "algorithm": {
      "backfillPriority": "low",
      "strategy": "exhaustiveSearch"
  },
  ```

## 偏爱带有扩展版的旧票证
<a name="match-rulesets-components-algorithm-expansion"></a>

当对战难以完成时，扩展规则会放宽匹配标准。当完成部分对战的票证达到一定年龄时，Amazon GameLift Servers 会应用扩展规则。票证的创建时间戳决定了 Amazon GameLift Servers 何时应用规则；默认情况下，FlexMatch 会跟踪最近匹配的票证的时间戳。

要更改 FlexMatch 应用扩展规则的时间，请按以下方式设置 `expansionAgeSelection` 属性：
+ **根据最新票证进行扩展。**此选项根据添加到潜在匹配项中的最新票证来应用扩展规则。每当 FlexMatch 匹配新票证时，时钟都会重置。使用此选项，结果匹配的质量往往更高，但匹配时间更长；如果匹配请求需要太长时间才能匹配，则匹配请求可能会在完成之前超时。将 `expansionAgeSelection` 设置为 `newest`。`newest` 为默认值。
+ **根据最旧的票证进行扩展。**此选项根据潜在匹配中最旧的票证应用扩展规则。使用此选项，FlexMatch 可以更快地应用扩展，从而缩短最早匹配的玩家的等待时间，但会降低所有玩家的对战质量。将 `expansionAgeSelection` 设置为 `oldest`。

```
"algorithm": {
    "expansionAgeSelection": "oldest",
    "strategy": "exhaustiveSearch"
},
```