Deterministic indoor evacuation plan validation and drill simulation engine
MoonEvac 用于教学、演练方案预检和算法研究,不是经过认证的消防工程软件,也不能代替现场应急指挥或专业安全评估。
git clone https://github.com/17731189258/sbs.git
cd sbs
moon check
moon test
moon run cmd/mainmoon add 17731189258/sbsimport {
"17731189258/sbs" @evac,
}fn main {
let plan = @evac.school_fire_scenario()
let findings = @evac.validate_plan(plan)
if @evac.validation_ok(findings) {
let result = @evac.run_simulation(
plan,
@evac.SimulationConfig::default(),
)
println(@evac.simulation_markdown(result))
} else {
println(@evac.validation_markdown(plan, findings))
}
}let plan = @evac.EvacuationPlan::new("Training room")
plan.places.push(@evac.Place::new(
"room", "Training Room", @evac.Room, 1, 80.0, 80.0, 40,
))
plan.places.push(@evac.Place::new(
"exit", "Main Exit", @evac.Exit, 1, 240.0, 80.0, 200,
))
plan.passages.push(@evac.Passage::new(
"door", "room", "exit", @evac.Door, 12.0, 1.6,
))
plan.populations.push(@evac.PopulationGroup::new(
"visitors", "room", 30, @evac.Standard,
))plan.events.push(@evac.Ignite("room", 5, 0.55))
plan.events.push(@evac.ClosePassage("door", 20))
plan.events.push(@evac.OpenPassage("door", 60))model.mbt 领域模型和公共构造函数
validation.mbt 数据及图连通性验证
routing.mbt 风险感知寻路和瓶颈分析
hazard.mbt 危险传播与场景事件
simulation.mbt 容量受限疏散状态机
analytics.mbt 韧性指标和场景比较
report.mbt Markdown/JSON/CSV/SVG 输出
examples.mbt 可运行的内置建筑与场景
core_test.mbt 黑盒行为测试
cmd/main/ 命令行示例moon fmt --check
moon check --deny-warn
moon test
moon run cmd/mainpub struct EvacuationPlan {
name : String
timestep_seconds : Double
places : Array[Place]
passages : Array[Passage]
populations : Array[PopulationGroup]
events : Array[ScenarioEvent]
} derive(Eq, Debug)pub struct Passage {
id : String
from_id : String
to_id : String
kind : PassageKind
length_m : Double
width_m : Double
flow_per_second : Double
bidirectional : Bool
accessible : Bool
enabled : Bool
} derive(Eq, Debug)fn Passage::new(id : String, from_id : String, to_id : String, kind : PassageKind, length_m : Double, width_m : Double) -> Passagefn PopulationGroup::new(id : String, place_id : String, count : Int, mobility : Mobility) -> PopulationGrouppub struct SimulationConfig {
maximum_steps : Int
reroute_interval : Int
snapshot_interval : Int
maximum_route_risk : Double
stop_when_evacuated : Bool
hazard : HazardConfig
} derive(Eq, Debug)pub struct SimulationResult {
plan_name : String
completed : Bool
steps : Int
total_people : Int
evacuated_people : Int
remaining_people : Int
peak_stalled_people : Int
peak_risk : Double
mean_evacuation_step : Double
snapshots : Array[SimulationSnapshot]
group_outcomes : Array[GroupOutcome]
passage_peak_queues : Array[Int]
event_log : Array[String]
} derive(Eq, Debug)fn analyze_passage_pressure(plan : EvacuationPlan, routes : Array[Route], critical_seconds : Double) -> Array[PassagePressure]fn compare_results(left_name : String, left : SimulationResult, right_name : String, right : SimulationResult) -> Stringfn diagnostic(code : String, severity : Severity, subject : String, message : String, hint : String) -> Diagnosticfn escape_json(text : String) -> Stringfn escape_xml(text : String) -> Stringfn hazard_preview(plan : EvacuationPlan, initial : ScenarioState, config : HazardConfig, steps : Int) -> Array[RiskObservation]fn outgoing_edges(plan : EvacuationPlan, place_index : Int, risks : Array[Double], congestion : Array[Double], options : RouteOptions) -> Array[EdgeCost]fn planned_group_routes(plan : EvacuationPlan, risks : Array[Double], congestion : Array[Double]) -> Array[Route]fn rank_scenarios(names : Array[String], results : Array[SimulationResult]) -> Array[ScenarioRanking]fn risky_place_ids(plan : EvacuationPlan, state : ScenarioState, threshold : Double) -> Array[String]fn route_to_nearest_exit(plan : EvacuationPlan, start : Int, risks : Array[Double], congestion : Array[Double], options : RouteOptions) -> Routefn route_to_place(plan : EvacuationPlan, start : Int, target : Int, risks : Array[Double], congestion : Array[Double], options : RouteOptions) -> Routefn scenario_delta(baseline_name : String, baseline : SimulationResult, candidate_name : String, candidate : SimulationResult) -> ScenarioDeltafn snapshot_people_in_risky_places(snapshot : SimulationSnapshot, risks : Array[Double], threshold : Double) -> Intfn update_hazard_blocks(plan : EvacuationPlan, state : ScenarioState, config : HazardConfig) -> UnitInstall
Download zipDeterministic indoor evacuation plan validation and drill simulation engine