Prediction AI
Behavior AI
Decision AI
Normal Mode
WiFi Tracking Active
층 선택:
화재 위치를 클릭하여 설정하세요
"화재 배치 모드" 버튼을 먼저 누르세요
속도 1x
승객 수

실시간 현황

대피 완료 인원 0
남은 인원 0
위험 구역 인원 0
경과 시간 0.0s
평균 대피 시간 --
위험 구역 수 0
평균 가시성 30m
승객 유형 분포 --
대피 진행률 0%

범례 (Legend)

복도 (Corridor)
객실 (Cabin)
레스토랑
기관실
집결지
출구 (Exit)
건강한 성인
고령자
어린이
휠체어
임산부
부상자
화재
연기
계단
대피 완료
출입구
소화기
소화 중
경로탐색 중
보안구역
침입 감지

시뮬레이션 상태

모드 대기 중
화재 발생 수 0
화재 확산 반경 0px
소화기 잔여 -
소화 활동 중 0명
경로탐색 중 0명
🚒 소방관 투입 0명
🔥 진압 완료 0건

WiFi 위치추적

추적 중 인원 0
위치 정확도 2.3m
WiFi AP 연결 12/12
신호 품질 98%
우선구조 대상 0
우선구조 대피완료 0
보안구역 알림 정상

AI 엔진 상태

Prediction 대기
Behavior 대기
Decision 대기

알고리즘 상세 (Algorithm Details)

본 시뮬레이션은 크루즈선 화재 발생 시 승객 대피 과정을 모사합니다. 9가지 수리 모델과 물리 기반 화재/연기 확산, 군중 역학이 통합 적용되어 있습니다.

🧭 A* 동적 위험 회피 경로탐색

각 승객 에이전트는 A* 알고리즘 변형을 사용하여 가장 가까운 안전한 출구까지의 최적 경로를 탐색합니다. 화재 및 연기 구역에 높은 비용(cost penalty)을 부여하여 위험 지역을 동적으로 회피합니다.

f(n) = g(n) + h(n) + R(n)
R(n) = w_fire · D_fire(n) + w_smoke · D_smoke(n)

여기서 R(n)은 위험 가중치 함수이며, 화재 거리와 연기 밀도에 따라 노드별 추가 비용을 산정합니다. 경로는 화재 확산에 따라 실시간으로 재계산됩니다. Binary MinHeap 우선순위 큐를 사용하여 O(n log n) → O(n log n) 최적 시간복잡도로 탐색합니다.

🧑‍🤝‍🧑 Social Force Model (Eq. 1)

Helbing & Molnár 사회적 힘 모델을 적용하여 승객 간 자연스러운 충돌 회피와 군중 역학을 모사합니다. 각 에이전트에 작용하는 힘은 목표 방향력, 사회적 반발력, 벽면 반발력으로 구성됩니다.

F_i = F_desire + Σ F_social + Σ F_wall + F_random
F_social = A · exp(-d_ij / B),   A=2.0, B=15px

가까운 승객 간 지수 감소 반발력이 작용하여 병목 구간에서의 자연스러운 분산 효과를 구현합니다.

🔥 화재 확산 + 이류-확산 모델 (Eq. 5-7)

화재는 발화 지점으로부터 비선형 확산됩니다. 연기는 Navier-Stokes 기반 이류-확산(Advection-Diffusion) 방정식으로 바람 방향에 따라 비대칭 확산됩니다.

r_fire(t) = r_0 + α · t^1.3
∂C/∂t + u·∇C = D·∇²C + S
연기 중심 이동: x_s += u_wind · cos(θ) · dt

해상 바람의 풍향/풍속이 연기 확산 방향과 형태(타원 비율)에 영향을 줍니다. 풍하 방향으로 연기가 더 넓게 확산됩니다.

🕶️ Beer-Lambert 가시성 모델 (Eq. 10)

연기 농도에 따른 가시 거리를 Beer-Lambert 법칙으로 산출합니다. 가시성 저하는 승객 이동 속도에 직접 영향을 줍니다.

V(C) = K / C,   K = 8 (발광 표지판 기준)
v_smoke = v_base · max(0.1, V/30)

맑은 공기(30m 가시거리)에서 완전 속도, 농연(1m 이하)에서 최대 90% 속도 감소. 통계 패널에서 실시간 평균 가시성을 모니터링할 수 있습니다.

🗺️ 다중 위험 동적 리스크 맵 (Eq. 11)

화재, 연기, 구조 손상, 군중 밀도를 가중 합산한 종합 위험도 지도를 실시간으로 생성합니다. "위험지도" 버튼으로 히트맵 오버레이를 활성화할 수 있습니다.

R(x,y,t) = w_F·F + w_S·S + w_D·D + w_C·C
w_F=0.35, w_S=0.30, w_D=0.20, w_C=0.15

녹색(안전) → 황색(주의) → 적색(위험) 컬러맵으로 시각화되며, A* 경로탐색의 비용 함수에도 반영됩니다.

⚕️ 건강 상태 인지 대피 (Eq. 20-22)

승객을 6가지 유형(건강한 성인, 고령자, 어린이, 휠체어, 임산부, 부상자)으로 분류하고 개인별 이동능력계수(μ_i)에 따라 속도를 조절합니다.

μ_i ∼ U[μ_min, μ_max] (유형별 범위)
v_i = μ_i · v_base · f(age, condition)
Priority = (1 - μ_i) · w_health + d_fire / d_max · w_prox

이동능력이 낮은 승객에게 높은 대피 우선순위가 부여되며, 시각적으로 각 유형별 고유 색상으로 구분됩니다.

👥 Greenshields 군중 밀집도 모델 (Eq. 4)

교통류 이론의 Greenshields 기본 다이어그램을 군중 보행에 적용합니다. 좁은 복도나 출구 근처에서 병목이 발생하면 속도가 비선형적으로 감소합니다.

v(ρ) = v_max · (1 - ρ/ρ_max)^γ
γ = 1.4 (밀집도 감도 계수)

개인별 건강 상태에 따른 v_max와 결합하여 실질 이동 속도가 결정됩니다. 출구 근처 집중 시 자동 분산 로직이 적용됩니다.

🚪 객실 출입구 및 이동 경로

각 객실에는 복도 방향으로 1개의 출입구(노란색 표시)가 있습니다. 승객은 반드시 출입구를 통해 복도로 나온 후 출구 또는 계단을 향해 이동합니다. 계단에 도달한 승객은 다른 층으로 이동하여 안전하게 대피한 것으로 간주됩니다. 레스토랑은 4방향(상/하/좌/우) 출입구가 있어 다양한 경로로 대피 가능합니다.

이동 경로: 객실 내부 → 출입구(doorway) → 복도(corridor) → 계단(stairway)/출구(exit) → 대피 완료

🧯 소화기 사용 시스템 (Fire Extinguisher)

복도 벽면, 계단 근처, 주요 교차점에 소화기(빨간 십자 표시)가 배치되어 있습니다. 화재로 모든 대피 경로가 차단된 승객은 다음 절차를 실행합니다:

  1. 가장 가까운 소화기 위치로 이동 (주황색 표시)
  2. 소화기를 들고 화재 근처로 접근
  3. 3초간 진압 활동 수행 (깜박임 표시)
  4. 화재 반경 60% 감소 → 통로 확보 후 대피 재개
진압 후: r_fire → r_fire * 0.4, r_smoke → r_smoke * 0.5
소화기 1개당 1회 사용 (사용 후 회색 표시)

🛡️ AI 출구 분산 최적화 (Exit Crowd Balancing)

기존 대피 시스템은 모든 승객에게 가장 가까운 출구만 안내합니다. 이 방식은 특정 출구에 수백 명이 몰리는 병목 현상을 유발하여 대피 시간이 급격히 증가합니다.

FireNavi는 각 출구의 실시간 배정 인원을 추적하여, 이미 많은 승객이 향하는 출구에 혼잡도 패널티를 부과합니다. 이를 통해 승객이 자연스럽게 여러 출구와 계단으로 분산됩니다.

Score(exit) = Distance + FirePenalty + SmokePenalty + CrowdPenalty
CrowdPenalty = N_assigned × 40
(N_assigned = 해당 출구에 현재 배정된 승객 수)

예: 출구 A에 이미 15명이 배정되었다면, 패널티 = 15 × 40 = 600이 추가됩니다. 결과적으로 더 먼 출구 B(거리 500 + 패널티 0 = 500)가 혼잡한 출구 A(거리 300 + 패널티 600 = 900)보다 더 나은 선택이 됩니다. AI가 전체 최적을 자동으로 계산합니다.

⚕️ 취약 계층 우선 경로 AI (Priority Rescue Routing)

고령자, 장애인(휠체어), 어린이, 임산부, 부상자 등 이동 취약 계층과 동반 보호자에게는 일반 승객과 완전히 다른 경로 계산 기준이 적용됩니다.

Score_priority(exit) = Distance + FirePenalty × α + SmokePenalty × α + CrowdPenalty
α = 2.0 (우선구조 대상), α = 1.0 (일반 승객)

핵심 차별점: 화재/연기 패널티가 2배로 적용되므로, 취약 계층은 조금 멀더라도 연기가 없는 더 안전한 출구를 자동으로 선택합니다. 일반 성인이 연기 속을 빠르게 통과하는 경로를 선택할 때, 고령자나 휠체어 사용자는 연기 없는 우회 경로를 배정받습니다.

Standard Route (일반 성인)
거리 우선 + 화재 회피 기본
연기 구간 통과 허용 (속도 감소)
가장 가까운 출구 배정
Priority Route (취약 계층)
안전 우선 + 화재/연기 패널티 2배
연기 구간 원천 회피
가장 안전한 출구 배정

🧠 개인화 AI 출구 배정 (Personalized Exit Assignment)

FireNavi의 출구 선택 함수는 승객 개인의 건강 상태, 이동 능력, 유형 정보를 입력받아 각 개인에게 최적화된 출구를 배정합니다. 같은 위치에 있더라도 건강한 성인과 휠체어 사용자는 서로 다른 출구를 안내받을 수 있습니다.

findNearestSafeExit(x, y, passenger)

passenger = { typeKey, isPriority, speed, mu, ... }
→ isPriority ? smokeMultiplier = 2.0 : smokeMultiplier = 1.0
→ 6가지 유형별 차별화된 출구 스코어링

이 함수는 매 경로 재계산 시(1~2.5초 간격) 호출되어, 화재 확산에 따라 실시간으로 출구를 재배정합니다. 멈춘 승객은 더 자주(0.2초 간격) 재탐색하여 대안 출구를 찾습니다.

AI 출구 배정 5단계 의사결정
1. 모든 출구/계단의 안전 여부 판정 (화재 내부 제외)
2. 승객~출구 거리 계산 + 근접 보너스 (50px/100px)
3. 출구 주변 화재/연기 패널티 산정 (× α)
4. 경로상 화재 장애물 체크 (직선 샘플링)
5. 출구별 혼잡도 패널티 + 유형별 가중치 합산 → 최저 스코어 출구 배정

🧠 AI 소방관 최적 투입 위치 (Optimal Firefighter Positioning)

대피 진행 중 소방관을 투입할 때, AI가 6가지 요소를 종합 분석하여 가장 효과적인 접근 위치와 우선순위를 자동으로 결정합니다.

Position Score = Upwind(40) + ExitAccess(30) - PassengerBlock(5×N) + MultiFireCover(10) - FFOverlap(20) + CorridorBonus(15)
투입 위치 결정 요소
1. 바람 상풍 방향 (연기 회피 접근)
2. 출구 접근성 (진입 속도)
3. 승객 대피 경로 비간섭
4. 복수 화재 커버 가능성
5. 기존 소방관 중복 방지
6. 복도 위치 우선 (이동 안전)
투입 우선순위 결정 요소
1. 화재 내 승객 수 (×100)
2. 경로 차단 승객 수 (×30)
3. 연기 영향 승객 수 (×15)
4. 출구 위협 수 (×40)
5. 화재 반경 크기 (×2)
6. 기존 투입 소방관 (-80)

🧠 AI 최적 투입 버튼을 누르면, Decision Engine이 위 점수를 실시간 계산하여 가장 높은 우선순위 화재에 최적 위치에서 소방관 4명을 자동 투입합니다. 캔버스에 보라색 십자 마커로 추천 위치가 표시됩니다.