Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 67 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,49 +121,90 @@ gh workflow run match.yml
|-----|------|
| **2인 1조** | 기본적으로 2명씩 매칭 |
| **중복 방지** | 최근 4회 이력 내 같은 조합 불가 |
| **공정한 무작위** | 모든 참여자에게 동등한 매칭 기회 |
| **적게 만난 사람 우선** | 과거에 적게 만난 사람일수록 매칭 확률 증가 |
| **경험 믹싱** | 신규 멤버와 경험 많은 멤버가 섞이도록 유도 |

### 점수 기반 매칭

모든 가능한 페어에 대해 점수를 계산하고, 점수가 높을수록 매칭 확률이 높아집니다.

**종합 점수 = 만남 횟수 점수 (60%) + 경험 믹싱 점수 (40%)**

#### 만남 횟수 점수

```
점수 = 1 / (1 + 만남 횟수)
```

| 만남 횟수 | 점수 |
|----------|------|
| 0회 | 1.0 |
| 1회 | 0.5 |
| 2회 | 0.33 |
| 3회 | 0.25 |

#### 경험 믹싱 점수

참여자의 경험 수준을 3단계로 분류합니다:

- **Newcomer**: 하위 25% (참여 횟수 적음)
- **Regular**: 중간 50%
- **Veteran**: 상위 25% (참여 횟수 많음)

| A \ B | Newcomer | Regular | Veteran |
|-------|----------|---------|---------|
| Newcomer | **0.3** | 0.8 | **1.0** |
| Regular | 0.8 | 0.6 | 0.8 |
| Veteran | **1.0** | 0.8 | 0.5 |

→ 신규+신규 = 낮은 점수 (0.3), 신규+베테랑 = 높은 점수 (1.0)

### 매칭 과정

```mermaid
flowchart TD
A[참여자 목록] --> B[무작위 셔플]
A[참여자 목록] --> B[경험 통계 계산]
B --> C{홀수 인원?}
C -->|Yes| D[1명 랜덤 선택 후 별도 보관]
C -->|No| E[2명씩 매칭 시작]
C -->|No| E[점수 매트릭스 생성]
D --> E

E --> F{최근 4회 이력에<br/>같은 조합 있음?}
F -->|Yes| G[재셔플]
G --> F
F -->|No| H[매칭 확정]
H --> I{남은 인원 있음?}
I -->|Yes| E
I -->|No| J{홀수였음?}

J -->|Yes| K[보관된 1명을<br/>랜덤 조에 추가]
J -->|No| L[매칭 완료]
K --> L
E --> F[최근 4회 중복 조합 필터링]
F --> G[소프트맥스 확률 변환]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ㅎㅎ 멋지군요

G --> H[가중 무작위 선택]
H --> I[선택된 페어 확정]
I --> J{남은 인원 있음?}
J -->|Yes| E
J -->|No| K{홀수였음?}

K -->|Yes| L[보관된 1명을<br/>최적 점수 조에 추가]
K -->|No| M[매칭 완료]
L --> M
```

### 예시

**짝수 인원 (6명)**
**점수 계산 예시**

```
참여자: A, B, C, D, E, F
↓ 셔플
결과: [A-D] [B-F] [C-E]
(2인조 × 3)
참여자: A(베테랑), B(신규), C(레귤러), D(신규)

A-B 점수: 만남0회(1.0×0.6) + 베테랑-신규(1.0×0.4) = 1.0
A-C 점수: 만남1회(0.5×0.6) + 베테랑-레귤러(0.8×0.4) = 0.62
B-D 점수: 만남0회(1.0×0.6) + 신규-신규(0.3×0.4) = 0.72

→ A-B 매칭 확률이 가장 높음
```

**홀수 인원 (5명)**

```
참여자: A, B, C, D, E
C를 랜덤 선택 후 보관
↓ 나머지 4명 매칭
중간: [A-E] [B-D]
C를 랜덤 조에 추가
결과: [A-E-C] [B-D]
E를 랜덤 선택 후 보관
↓ 나머지 4명 점수 기반 매칭
중간: [A-B] [C-D]
E를 점수가 가장 높은 조에 추가
결과: [A-B-E] [C-D]
(3인조 × 1, 2인조 × 1)
```

Expand All @@ -184,8 +225,10 @@ flowchart TD
```

위 이력 기준:

- 불가능한 조합: `A-B`, `C-D`, `A-C`, `B-D`, `A-D`, `B-C`
- 4회 이전 이력은 다시 매칭 가능
- 불가능한 조합이 모두 최근 4회에 포함된 경우, fallback으로 가능한 조합 선택

## 제약사항 및 향후 계획

Expand Down
Loading