feat: 김영관 ↔ 이준석 수동 swap (MANUAL_SWAPS 메커니즘 추가)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -63,6 +63,11 @@ NUM_TEAMS = 7
|
|||||||
TEAM_SIZES = [5] * 6 + [4]
|
TEAM_SIZES = [5] * 6 + [4]
|
||||||
SEED = 20260428 # 행사일 시드 (재현 가능)
|
SEED = 20260428 # 행사일 시드 (재현 가능)
|
||||||
|
|
||||||
|
# 자동 배정 후 수동 swap (이름 쌍)
|
||||||
|
MANUAL_SWAPS = [
|
||||||
|
("김영관", "이준석"),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
def assign_one(seed):
|
def assign_one(seed):
|
||||||
"""
|
"""
|
||||||
@@ -154,13 +159,38 @@ def validate(teams):
|
|||||||
return True, "OK"
|
return True, "OK"
|
||||||
|
|
||||||
|
|
||||||
|
def apply_swaps(teams, swaps):
|
||||||
|
"""이름 쌍을 받아 두 사람의 팀 위치를 교환."""
|
||||||
|
name_to_loc = {}
|
||||||
|
for ti, team in enumerate(teams):
|
||||||
|
for pi, (name, _) in enumerate(team):
|
||||||
|
name_to_loc[name] = (ti, pi)
|
||||||
|
|
||||||
|
for a, b in swaps:
|
||||||
|
if a not in name_to_loc or b not in name_to_loc:
|
||||||
|
raise ValueError(f"swap 대상 못 찾음: {a}, {b}")
|
||||||
|
ti_a, pi_a = name_to_loc[a]
|
||||||
|
ti_b, pi_b = name_to_loc[b]
|
||||||
|
if ti_a == ti_b:
|
||||||
|
continue # 같은 팀이면 의미 없음
|
||||||
|
teams[ti_a][pi_a], teams[ti_b][pi_b] = (
|
||||||
|
teams[ti_b][pi_b],
|
||||||
|
teams[ti_a][pi_a],
|
||||||
|
)
|
||||||
|
# 위치 갱신
|
||||||
|
name_to_loc[a] = (ti_b, pi_b)
|
||||||
|
name_to_loc[b] = (ti_a, pi_a)
|
||||||
|
return teams
|
||||||
|
|
||||||
|
|
||||||
def assign(base_seed):
|
def assign(base_seed):
|
||||||
"""시드 재시도로 모든 제약 만족하는 배정 찾기."""
|
"""시드 재시도로 모든 제약 만족하는 배정 찾기. 이후 수동 swap 적용."""
|
||||||
for offset in range(10000):
|
for offset in range(10000):
|
||||||
seed = base_seed + offset
|
seed = base_seed + offset
|
||||||
teams = assign_one(seed)
|
teams = assign_one(seed)
|
||||||
ok, msg = validate(teams)
|
ok, msg = validate(teams)
|
||||||
if ok:
|
if ok:
|
||||||
|
teams = apply_swaps(teams, MANUAL_SWAPS)
|
||||||
return teams, seed, offset + 1
|
return teams, seed, offset + 1
|
||||||
raise RuntimeError("10000회 시도에도 모든 제약 만족 실패")
|
raise RuntimeError("10000회 시도에도 모든 제약 만족 실패")
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"김호승": "팀1",
|
"김호승": "팀1",
|
||||||
"유준희": "팀1",
|
"유준희": "팀1",
|
||||||
"김영관": "팀1",
|
"이준석": "팀1",
|
||||||
"장다현": "팀1",
|
"장다현": "팀1",
|
||||||
"강승형": "팀1",
|
"강승형": "팀1",
|
||||||
"서한배": "팀2",
|
"서한배": "팀2",
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
"박재호": "팀2",
|
"박재호": "팀2",
|
||||||
"이성재": "팀3",
|
"이성재": "팀3",
|
||||||
"이재광": "팀3",
|
"이재광": "팀3",
|
||||||
"이준석": "팀3",
|
"김영관": "팀3",
|
||||||
"정채윤": "팀3",
|
"정채윤": "팀3",
|
||||||
"변수민": "팀3",
|
"변수민": "팀3",
|
||||||
"심성환": "팀4",
|
"심성환": "팀4",
|
||||||
|
|||||||
Reference in New Issue
Block a user