← Blog교전 모델링· 2/4

무기-표적 상성을 데이터로 — ATGM이 전차엔 0.90, 보병엔 0.20인 이유

무기의 효과는 표적에 따라 달라진다. 대전차미사일은 전차엔 치명적이지만 보병엔 비효율적이다. 이 상성을 코드가 아니라 카탈로그 데이터로 두면, 한 줄로 도메인이 확장된다.

약 2분
combat-modelingweaponPkarmorcatalog

무기-표적 상성을 데이터로

"이 무기는 얼마나 강한가?"는 틀린 질문입니다. 올바른 질문은 "이 무기는 이 표적에 얼마나 강한가?" 입니다. 대전차미사일(ATGM)은 전차를 한 방에 잡지만, 보병 한 명에게 쏘는 건 낭비입니다. 이 상성을 어떻게 모델링할까요? 핵심은 — 코드가 아니라 데이터로.

실제 시뮬레이션 — 155mm 화력이 표적을 타격하는 교전 장면. 상단에 'PHASE 5: ENGAGE'와 사격 이벤트·표적 피해 상태·교전수칙(ROE) 준수가 표시되고, 하단에 열상 등 센서 화면이 함께 뜬다.

표적별 격파확률(Pk)

무기마다 표적 종류별 격파확률(Pk)을 카탈로그에 적습니다.

도식 렌더링 중…

ATGM의 예: 전차 0.90 / 보병 0.20. 표적의 장갑 등급(armor_class) 과 무기의 관통력을 대조해, 효과를 자동으로 끌어냅니다. 이러면 "대전차 무기를 보병에 쏘는" 비효율이 모델에 자연히 반영됩니다 — 교전 결과가 doctrine과 맞아떨어지죠.

이 상성을 코드로 보면, Pk 조회와 살보 확률 두 줄입니다.

# 한 발 명중확률 Ph, n발 살보 -> 적어도 한 발 명중
def salvo_hit(Ph, n):
    return 1 - (1 - Ph)**n

# 표적별 격파: 무기 카탈로그에서 Pk 조회
def kill_prob(weapon, target):
    return weapon["pk_vs"].get(target.armor_class, 0.0)   # ATGM vs 전차=0.90, 보병=0.20

한 줄로 도메인을 넓힌다

이 데이터 주도 설계의 진짜 힘은 확장성입니다. 상성이 카탈로그에 있으니, 새 무기·새 도메인은 코드 수정 없이 카탈로그 한 줄로 추가됩니다.

도식 렌더링 중…

지상 교전용으로 만든 엔진에 카탈로그 줄만 추가하니, 대공(지대공·공대공·근접방어)과 대함(대함미사일·함포)이 같은 엔진에서 코드 0으로 돌았습니다. "엔진은 하나, 도메인은 데이터로"가 self-containment 철학의 교전판입니다.

💡 무기 추가 = 두 테이블 동시 등록 — 다만 함정이 하나 있습니다. 새 무기는 피해 테이블(어느 표적에 얼마나)뿐 아니라 탄도 테이블(어떻게 날아가나)에도 등록해야 합니다. 한쪽만 등록하면, 무기가 "알 수 없는 종류"로 분류돼 사격이 silent하게 무산되고 — 피해가 0이 됩니다. silent fail의 교전판이죠.

⚠️ 검증 없는 상성표는 위험하다 — Pk 값을 근거 없이 박으면 교전 결과가 통째로 왜곡됩니다. 추상 교전에서 빠르게 후보를 추리되, 물리 시뮬에서 실측한 관통·격파율로 보정해야 (Lanchester 글 참조) 신뢰할 수 있습니다.

한 줄 정리

📌 무기 효과는 표적에 따라 다르다 — ATGM은 전차 0.90, 보병 0.20. 이 상성을 카탈로그 데이터(pk_vs · armor_class) 로 두면, 한 줄로 지상→대공→대함까지 같은 엔진·코드 0으로 확장된다. 단, 무기는 피해+탄도 두 테이블에 함께 등록해야 silent fail을 피한다.