> ## 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를 지원하는 모든 규칙은 평가되는 각 티켓 쌍에 대해 **distance** 값을 계산합니다. 이 distance는 그 규칙에 따라 두 티켓이 얼마나 유사하거나 다른지를 나타냅니다.

* distance **0**은 티켓이 그 규칙에 대해 완벽하게 일치함을 의미합니다.
* distance가 **1**에 가까울수록 티켓이 규칙이 허용하는 범위의 경계에 있음을 의미합니다.
* distance가 **infinite**(하드 거부)이면 가중치와 관계없이 그 규칙에 따라 티켓이 매치될 수 없음을 의미합니다.

매치메이킹 시스템은 다음 공식을 사용하여 모든 가중 규칙에 걸친 **total distance**를 계산합니다.

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

total distance가 낮은 티켓이 더 나은 후보로 간주되어 매치를 구성할 때 먼저 시도됩니다. Weight는 이 total에 대한 각 규칙의 기여도에 대한 스칼라 승수 역할을 합니다.

<Info>
  Weight는 하드 제한을 **재정의하지 않습니다**. 규칙이 두 티켓이 호환되지 않는다고 판단하면 티켓은 완전히 제외됩니다. 예를 들어, 값이 허용된 최대 차이를 초과하는 Difference Rule에서 이런 일이 발생합니다. Weight는 이미 적격인 티켓 간의 **우선순위 순서**에만 영향을 미칩니다.
</Info>

## 각 규칙이 distance를 계산하는 방식

가중치 예시를 보기 전에 각 가중 규칙이 distance 값을 계산하는 방식을 이해하는 것이 도움이 됩니다. distance는 항상 0과 1 사이의 숫자이며, 값이 낮을수록 더 가까운 매치를 나타냅니다.

| 규칙 유형            | Distance 공식                                          | Distance = 0                | Distance = 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는 distance 기반 정렬에 참여하는 **표준 규칙 유형**에 적용됩니다. 다음 규칙은 Weight 속성을 지원합니다.

| 규칙 유형            | Weight 지원 |
| ---------------- | :-------: |
| String Equality  |     ✔     |
| Difference       |     ✔     |
| Set Intersection |     ✔     |
| Match Total      |     ✔     |
| Region Selection |     ✔     |

다음 **팀 규칙 유형**은 weight를 **지원하지 않습니다**. 이 규칙들은 검증자(validator) 역할을 합니다. 매치를 통과시키거나 실패시키며 distance 기반 정렬에는 참여하지 않습니다.

| 규칙 유형                       | Weight 지원 | 동작                        |
| --------------------------- | :-------: | ------------------------- |
| Team Difference             |     ✘     | 팀 평균이 허용된 차이 내에 있는지 검증합니다 |
| Team Size Balance           |     ✘     | 팀 플레이어 수가 균형을 이루는지 검증합니다  |
| Team Ticket Size Similarity |     ✘     | 팀이 유사한 파티 구성을 가지는지 검증합니다  |

## 유효한 Weight 값

Weight는 **0보다 크고** **1000 이하**(포함)의 숫자여야 합니다. Weight 0은 허용되지 않습니다. Weight를 지정하지 않으면 기본값은 **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
    }
]
```

### 플레이어 특성

| 플레이어    | Skill | Preferred Maps                   |
| ------- | ----- | -------------------------------- |
| Alice   | 20    | "Dustbowl", "Summit", "Lakeside" |
| Bob     | 24    | "Dustbowl," "Summit"             |
| Charlie | 17    | "Lakeside"                       |

### 1단계: 규칙별 distance 계산

**SkillRule**(Difference Rule)은 `absoluteDifference / maxDifference` 공식을 사용합니다.

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

**MapRule**(Set Intersection Rule)은 `1 / (1 + sharedItemCount)` 공식을 사용합니다.

* Alice 대 Bob: "Dustbowl"과 "Summit"(두 항목)을 공유 → `1 / (1 + 2) = 0.33`
* Alice 대 Charlie: "Lakeside"(한 항목)를 공유 → `1 / (1 + 1) = 0.5`

### 예시 1: 동등한 가중치

두 규칙 모두 Weight = 1일 때, total distance는 다음과 같습니다.

```
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
}
```

이제 total distance가 다음과 같이 변경됩니다.

```
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
}
```

이제 total distance는 다음과 같이 됩니다.

```
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: 플레이어가 매치될 수 없을 때(하드 거부)

이제 실력이 Alice와 크게 차이나고 선호하는 맵을 공유하지 않는 네 번째 플레이어 **Dave**를 추가합니다.

| 플레이어  | Skill | Preferred Maps                   |
| ----- | ----- | -------------------------------- |
| Alice | 20    | "Dustbowl," "Summit," "Lakeside" |
| Dave  | 35    | "Fortress"                       |

**SkillRule:** `|20 - 35| / 10 = 15 / 10 = 1.5` — 그러나 차이 15가 `MaxDifference`(10)를 초과하므로 규칙은 **infinite distance**(하드 거부)를 반환합니다.

**MapRule:** Alice와 Dave는 0개의 맵을 공유하고 `MinIntersectionSize`가 1이므로 이 규칙 역시 **infinite distance**를 반환합니다.

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

가중치가 어떻게 구성되든 Dave는 Alice와 매치될 수 없습니다. 단 하나의 규칙만 infinite distance를 반환하더라도 전체 total distance가 infinite가 되어 티켓이 후보 목록에서 제외됩니다. Weight는 하드 거부를 재정의할 수 없으며 이미 적격인 티켓 간의 우선순위에만 영향을 미칠 수 있습니다. Dave 같은 플레이어가 결국 매치될 수 있도록 하려면 [rule expansion](/services/playfab/multiplayer/matchmaking/config-queues#expansions-and-becoming-optional)을 사용하여 시간이 지남에 따라 제한을 완화하세요.

### 예시 요약

아래 표는 동일한 플레이어 특성과 동일한 규칙을 사용하여 가중치만 다를 때 어떤 후보가 선호되는지를 보여줍니다.

| 가중치 구성                       | Bob의 total distance | Charlie의 total distance | Dave의 total distance | 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              |

기본 distance는 결코 변경되지 않으며, 각 규칙에 부여된 상대적 중요도만 변경됩니다. 가중치와 관계없이 플레이어의 특성이 하드 제한을 초과하므로 Dave는 항상 거부됩니다. 이 접근 방식이 가중치 튜닝의 힘입니다.

## Weight 및 규칙 확장(expansion)

규칙이 ([Seconds until optional](/services/playfab/multiplayer/matchmaking/config-queues#expansions-and-becoming-optional) 또는 expansion을 통해) 선택적이 되면 더 이상 티켓을 하드 거부하지 않습니다. 그러나 거부되었을 티켓도 여전히 0이 아닌 distance 값을 받습니다. Weight는 계속해서 이 distance를 조정하며, 이는 선택적 규칙이 여전히 정렬 순서에 영향을 미친다는 것을 의미합니다. 이러한 규칙은 “위반하는” 티켓을 완전히 제외하는 대신 우선순위에서 더 낮은 위치로 밀어냅니다.

이 동작은 규칙이 시간이 지남에 따라 완화되어도 여전히 최상의 매치가 선호되도록 하는 데 유용합니다.

## 모범 사례

* **동등한 가중치로 시작**하고 플레이어의 매치 품질 피드백을 기반으로 조정하세요.
* 게임 경험에 가장 중요한 규칙(예: 경쟁 타이틀의 경우 실력, 캐주얼 게임의 경우 공유 콘텐츠)에 **더 높은 가중치를 사용**하세요.
* **Weight는 정렬에만 영향을 미친다는 점을 기억**하세요. 불가능한 매치를 성사시킬 수는 없습니다. 시간이 지남에 따라 하드 제한을 완화하려면 [expansion](/services/playfab/multiplayer/matchmaking/config-queues#expansions-and-becoming-optional)을 사용하세요.
* 하나의 규칙이 다른 모든 규칙을 완전히 압도하기를 의도하지 않는 한 (예: 1000:1과 같은) **극단적인 가중치 비율은 피하세요**.

## 함께 보기

* [Configuring matchmaking queues](/services/playfab/multiplayer/matchmaking/config-queues)
* [Matchmaking scenario and configuration examples](/services/playfab/multiplayer/matchmaking/config-examples)
* [Specifying attributes with your tickets](/services/playfab/multiplayer/matchmaking/ticket-attributes)


## Related topics

- [Actions & Rules](/ko/services/playfab/data-analytics/acting-data/action-rules-overview.md)
- [Actions & Rules quickstart](/ko/services/playfab/data-analytics/acting-data/action-rules-quickstart.md)
- [파트너 센터에서 매치메이킹 구성](/ko/services/xbox-services/multiplayer/matchmaking/config/live-matchmaking-config.md)
- [Understanding How PlayFab Party chat works](/ko/services/playfab/community/voice-communications/concepts-chat.md)
- [매치메이킹 작동 방식](/ko/services/playfab/multiplayer/matchmaking/how-matchmaking-works.md)
