diff --git a/docs/design/architecture/总体架构设计.md b/docs/design/architecture/总体架构设计.md index ee590da..6134d23 100644 --- a/docs/design/architecture/总体架构设计.md +++ b/docs/design/architecture/总体架构设计.md @@ -363,7 +363,7 @@ CounterDroneBackend_Data/ | TaskId | TEXT | FK | | | EquipmentRole | INTEGER | | 0=探测设备 1=发射平台 | | Quantity | INTEGER | DEFAULT 1 | 部署数量 | -| GroupId | TEXT | FK | 关联装备编组 Group | +| GroupId | TEXT | FK | 关联装备编组 Group(火力单元,多批次时用于分配) | | // 以下为发射平台专用字段 | | PlatformType | INTEGER | NULLABLE | 0=空基(大型无人机) 1=地基(炮弹),探测设备为 NULL | | PositionX | REAL | | 部署位置 | @@ -1342,20 +1342,41 @@ SimTask "城市防御演习" ### 推荐算法 +算法需要同时考虑**所有无人机编队**和**可用装备火力单元**,自动匹配分配: + ```csharp -// 多批次:为每个编队独立生成拦截方案 +// 输入:所有无人机编队 + 已部署的火力单元 +// 输出:每个编队的拦截方案 + 合并的发射计划 + var allSolutions = new List(); -foreach (var (target, route) in threat.Groups) +var usedPlatforms = new HashSet(); + +foreach (var droneGroup in threat.DroneGroups) { - var rec = advisor.Recommend(target, route, environment); - allSolutions.Add(rec.Best); + // 从可用装备中选择合适的火力单元(弹药类型匹配目标动力类型) + var availableUnits = fireUnits.Where(u => !usedPlatforms.Contains(u.Id)).ToList(); + var solution = advisor.RecommendForGroup(droneGroup, environment, availableUnits); + + // 标记占用的平台(一组装备可同时对付一个编队) + foreach (var idx in solution.AssignedPlatformIndices) + usedPlatforms.Add(idx); + + allSolutions.Add(solution); } -// 合并所有发射计划,PlatformIndex 去重 -var mergedSchedule = MergeFireSchedules(allSolutions); -engine.SetFireSchedule(mergedSchedule); +// 如果某编队间隔足够大,算法可判定同一组装备复用 +// 如编队B在编队A抵达后10分钟才到,可用同一火力单元 + +var merged = MergeFireSchedules(allSolutions); +engine.SetFireSchedule(merged); ``` +**关键原则**: +- 算法决定分配,而非写死"一对一"或"一对多" +- 决策依据:弹药类型匹配、时间窗口重叠、火力单元能力 +- 人工可调整算法推荐结果 +- 引擎不感知分组——只看合并后的 `FireSchedule` + ### 数据表变更 | 表 | 变更 |