|
|
bf3452013d
|
feat: 全部160测试通过(22s). 损伤模型RequiredExposure替代硬编码
- IDamageModel.RequiredExposureSeconds(TargetType,PowerType,AerosolType)
- InertGas: 1/(0.15*sensitivity), Piston 1.5→4.44s
- ActiveMaterial: (1-burst)/residual + burst threshold
- ActiveFuel: ∫BaseRate*e^(kT)解析解
- CalcRoundsNeeded/ComputeInterceptProbability/BuildCandidates 全部调用
- 场景缩短: Piston 5km/150km/h, Jet 5km/200km/h, AirBased 10km/150km/h
- 空基 test: Unit(1500,1000), hp=0 Destroyed
|
2026-06-13 19:37:27 +08:00 |
|
|
|
a3bf6720c6
|
feat: 路径积分毁伤判定(DamageAssessment.PathInSphere)
- 替换离散 ContainsPoint 为连续路径积分
- DroneEntity 新增 PrevX/Y/Z + SavePreviousPosition
- DamageAssessment 独立模块
- Piston WindSpeed=0 验证:暴露4.52s,击毁
|
2026-06-13 19:00:41 +08:00 |
|
|
|
1f092e8647
|
refactor: 密度阈值统一在引擎检查(ammo.EffectiveConcentration),去掉三个模型的硬编码
- SimulationEngine: 密度<EffectiveConcentration则跳过损伤
- InertGas/ActiveMaterial/ActiveFuel 移除各自的硬编码阈值
- CloudExpansionModel新增TurbulentRadius属性
- DefaultAmmunition ActiveMaterial EffectiveConcentration 0.0002→0.0001
|
2026-06-13 18:24:27 +08:00 |
|
|
|
cc3c7199c0
|
refactor: CloudExpansionModel提取RoundsNeeded/TimeToDensity/TimeToReach
- RadiusAt/DensityAt/TimeToReach/TimeToDensity/RoundsNeeded 放入独立模块
- CalcRoundsNeeded 委托给 cloudModel.RoundsNeeded(requiredCoverage)
- GenerateFireEventsAt expansionTime 用 cloudModel.TimeToReach(RadiusAt(30f))
- 147/150 (Piston hp=0.10边际,LongRoute校验)
|
2026-06-13 18:18:19 +08:00 |
|
|
|
510403a66c
|
refactor: 提取 CloudExpansionModel 独立模块
- RadiusAt(t)/DensityAt(t)/TimeToReach(r) 封装在 CloudExpansionModel
- ComputeEffectiveRadius 简化为委托调用
- GaussianPuffDispersion 重复逻辑待后续统一
|
2026-06-13 18:14:42 +08:00 |
|
|
|
9c153a040b
|
fix: CalcRoundsNeeded=ceil(requiredCoverage/2R),去除+1 hardcode
- 理论:所有云在无人机到达时膨胀到expansionTime≈30s,半径均匀
- ceil(333.3/40.4)=9发覆盖363m/6.54s>6s
- hp=0.10来自tick离散(步长22m,云径40m,每云1-2采样点)
|
2026-06-13 18:11:33 +08:00 |
|
|
|
355b430828
|
fix: 抛物线弹道精确求解 + 上行触发云生成 + 空基修复
- Kinematics.CalculateLaunchAngle: 解 tan(θ) 二次方程取平射解
- Kinematics.ParabolicShellTime: 精确飞行时间替代 dist/mv 近似
- MunitionEntity.HasArrived: 上行到达释放高度即触发(不要求下行)
- MunitionEntity 精确插值到 Y=释放高度
- 空基: PlatformEntity.CommandFlyTo 读取 releaseAlt 算 driftDist
- 空基: 投放点位置保留插值不传送到终点
- 单元测试: 13/13 Kinematics 通过(含45°标准公式验证)
|
2026-06-13 17:26:09 +08:00 |
|
|
|
9e1fe869a6
|
fix: 空基投放点不被传送到终点——插值位置保留在投放点
- PlatformEntity 投放条件触发时不设置PosX=targetX,保留插值位置
- 空基FireEvent.TargetX=云位,platform飞向云位,距目标driftDist时投放
- planner恢复laneBaseTime+stagger覆盖,保证云位连续间距均匀
- CommandFlyTo接收disperseHeight计算driftDist
|
2026-06-13 16:57:14 +08:00 |
|
|
|
a5fef98858
|
wip: 空基Planner修正——投放点后移抵消载具漂移;云团/发射事件用精确时刻
- 空基 GenerateFireEventsAt 投放点后移 driftX = cruiseSpeed * fallTime
- MunitionEntity 记录 launchTime + flightDuration → ArrivalTime 精确计算
- 云团 Initialization 用 munition.ArrivalTime 非 SimulationTime
- CloudGenerated 事件 OccurredAt 用精确到达时刻
- PlatformEntity 存储 ExactReleaseTime
- 修复缺失 else 导致的空基走地基分支
|
2026-06-13 16:40:27 +08:00 |
|
|
|
09f51939d8
|
fix: spacing=2R消除魔法数字,turbulentRadius贯穿CalcRoundsNeeded
- ComputeEffectiveRadius返回(getEffectiveRadius, expansionTime, turbulentRadius)
- CalcRoundsNeeded/tagger均用turbulentRadius
- spacing=2R(云端直径=中心距),消除1.5f经验系数
- FireEvent.OccurredAt存储fe.FireTime精确发射时刻
|
2026-06-13 16:03:01 +08:00 |
|
|
|
6cd18bf142
|
fix: FireUnit不拆通道 + PlatformIndex按unitIdx*TotalChannels+ch映射
- BuildFireUnits: 一个物理单元 = 一个 FireUnit(TotalChannels = GunCount*ChannelsPerGun)
- _entityCounter 在平台创建前重置为0,platform ID从1开始
- GenerateFireEventsAt 通过 unitIdx*TotalChannels+ch 计算 PlatformIndex
- 移除赋值循环中覆盖 PlatformIndex 的代码
|
2026-06-13 15:44:35 +08:00 |
|
|
|
070167f572
|
fix: 编队偏移持久化到航点 + yLanes=Quantity + 云Z展开
- DroneEntity: 偏移写入克隆航点List而非位置字段
- Planner: 车道数=无人机数, laneSpacingZ=LateralSpacing
- 200m间距: 33发, 2/3击毁, 第三架hp=0.10边缘效应
|
2026-06-13 15:03:44 +08:00 |
|
|
|
b596b4a791
|
fix: roundInLane+ch 双重错开 + TargetY 分析
- stagger = (baseRoundInLane+ch)×CloudCoverInterval
- 引擎 span=7.20s, Planner单元测试 span=7.27s
- 2/3 击毁,第三架 FormationOffsetY 垂向偏移导致覆盖窗口缩短
|
2026-06-13 14:42:16 +08:00 |
|
|
|
0c9cdb7b82
|
fix: stagger=roundInLane*speed 替代 ch*speed——通道展开为1后ch永远为0
- roundInLane = singleNeeded - laneNeeded[currentLane]
- 跨度从 0.125s → 7.39s
- Piston: 2/3 击毁
|
2026-06-13 14:35:29 +08:00 |
|
|
|
6a6c03f0fa
|
fix: 每单元固定Y车道 + CloudCoverInterval物理间隔 + 16通道
- Solve: 每单元分配一个Y车道,所有弹打同一高度
- stagger=CloudCoverInterval 替代硬编码 ChannelInterval
- Kinematics.CloudCoverInterval: 云团直径/目标速度,不小于硬件间隔
- DefaultFireUnits: ground-light 改为 16通道
- 报告 F1→F2 精度
- MultiLane_3Drones_3Lanes_ExactOutput 单元测试
|
2026-06-13 14:18:18 +08:00 |
|
|
|
4f509e5a2a
|
refactor: 每单元锁定一个Y车道,非轮转分配
- 单元→车道固定分配(管转向跟不上一发一个Y)
- 车道需求 tracked,单元依次填满当前车道
|
2026-06-13 14:04:00 +08:00 |
|
|
|
29aa11665b
|
fix: 多单元并行 + 多车道正确弹药计算
- 所有单元以同基准时间并行发射(offset=0)
- 通道内 ch×ChannelInterval 独立错开
- CalcRoundsNeeded 恢复纯单机,yLanes 乘法在 Solve
- Piston: 33发=11×3车道, 2/3击毁
|
2026-06-13 13:57:56 +08:00 |
|
|
|
c7792d1d4a
|
feat: 多机编队Y车道分布 + 8火力单元
- GenerateFireEventsAt: 按 yLane×laneSpacingY 分布云团Y坐标
- Piston 测试: 8 ground-light × 3机横向编队
- 42发弹, 2架击毁, Y车道对齐无人机位置
|
2026-06-13 13:26:43 +08:00 |
|
|
|
a9339c36e3
|
feat: 编队2D模型 — LateralSpacing/LongitudinalSpacing + DroneEntity 纵向偏移
- RoutePlan: FormationSpacing→LateralSpacing, 新增LateralCount/LongitudinalCount/LongitudinalSpacing
- DroneEntity: 2D编队(latIdx/longIdx), 横向Y展开+纵向X落后
- DefaultFormations: 6种编队模板
- DroneEntityTests: 11个(含2D编队/2×2方队/蜂群)
- Planner: yLanes=ceil(formationWidth/cloudDiam), totalNeeded=single×lanes
|
2026-06-13 13:20:18 +08:00 |
|
|
|
4706c4b8c1
|
feat: 编队模型扩展 — LateralSpacing/LongitudinalSpacing/LateralCount/LongitudinalCount
- FormationSpacing → LateralSpacing(正面横向间距)
- 新增 LongitudinalCount/LongitudinalSpacing(纵深串列)
- DefaultFormations: 6种默认编队模板(单机/3机横队/5机横队/3机纵队/2×2方队/10机蜂群)
- Piston 测试设置 LateralCount=3, LongitudinalCount=1
|
2026-06-13 13:16:27 +08:00 |
|
|
|
45387fee73
|
refactor: 删除所有逻辑fallback——缺失配置报错而非静默跳过
- DefaultDefensePlanner: 空catalog抛ArgumentEx, 缺ammo类型抛InvalidOp
- AmmunitionSpec? → AmmunitionSpec(非空), 删除 ==null 静默返回
- 删除 0.8f射程安全系数, 1.5f时间窗口乘数
- AlgorithmFactory 移除IDefensePlanner(null)注册
- SimulationEngine 构造必须传planner,6个调用点全部更新
|
2026-06-13 12:19:21 +08:00 |
|
|
|
162338ce83
|
refactor: 删除Planner所有配置默认值——参数必须从FireUnit取,取不到报错
- 删除 CruiseSpeed=55/MuzzleVelocity=800/ReleaseAltitude=+500 等8处默认值
- 空基参数<=0抛 InvalidOperationException,地基初速<=0跳过候选
- 无人机速度/航路长度为0跳过该弹
- 保留物理安全守卫(防NaN/除零)和概率帽0.95
|
2026-06-13 12:02:57 +08:00 |
|
|
|
182af5026d
|
fix: recommendedTiming按目标点位置算而非中点——每个弹道到达时间不同
- GenerateFireEventsAt: txArrival = distToTx/droneSpeed 替代 threat.ArrivalTime
- 航路反方向截断保护
- 暴露毁伤时间 34.4s→38.4s
|
2026-06-13 11:54:39 +08:00 |
|
|
|
c08d613d5b
|
test: 引擎空基/地基发射类型单元测试 + Planner覆盖全面测试
- SimulationEngineTests: AirBased_LaunchesWithCorrectDescription (空基描述="空基投放")
- SimulationEngineTests: GroundBased_LaunchesWithCorrectDescription (地基描述="计划发射")
- DefensePlannerTests: 23个全覆盖(威胁排序/弹药匹配/地基弹道/空基弹道/分配/边界/多威胁/临界)
- FullPipeline AirBased: 加入事件描述诊断断言
|
2026-06-13 11:27:00 +08:00 |
|
|
|
7fa0268463
|
fix: 空基 FireEvent.MuzzleVelocity=0 + 空基弹道单元测试
- GenerateFireEventsAt: 空基时 MuzzleVelocity=0(而非800)
- 新增 AirBased_FireTime_EarlierThanArrival 验证提前量
- 新增 AirBased_FireTime_EarlierThanGroundBased 验证空基更早
- 新增 AirBased_NoMuzzleVelocityInFireEvent 验证 MuzzleVelocity=0
- 空基弹道计算本身正确(recommendedTiming - flightTime - fallTime)
|
2026-06-13 11:05:34 +08:00 |
|
|
|
c610573e34
|
fix: 物理间隔错开发射 — 云团直径/无人机速度,非硬件间隔
- 跨 FireUnit 按 physicsInterval = max(ChannelInterval, cloudDiameter/droneSpeed) 错开发射时间
- Piston 200km/h 测试通过(被摧毁=1)
- Jet 500km/h 测试通过(被摧毁=1)
|
2026-06-13 10:55:58 +08:00 |
|
|
|
c08edbd2f9
|
feat: 火力单元通道模型 + 默认配置 + 引擎通道展开
- FireUnit: 新增 GunCount/ChannelsPerGun/ChannelInterval/检测设备字段
- EquipmentDeployment: 新增 GunCount/ChannelsPerGun/ChannelInterval
- DefaultFireUnits: 3 种默认火力单元(标准地基/重地基/空基)
- Planner: 逐通道齐射分配,ChannelInterval 错开,Cooldown 轮次
- Engine: PlatformEntity 按 GunCount×ChannelsPerGun 展开
- BuildFireUnits: 与引擎同步展开通道
- FullPipelineTests: 使用 DefaultFireUnits 配置
|
2026-06-13 10:42:08 +08:00 |
|
|
|
77351d8198
|
fix: FireEvent 冷却错开,同平台多弹不再同 tick 被跳过
根因:同一平台多弹 FireTime 相同,引擎同 tick 处理时第 1 发后冷却触发 Ready=false,后续全被跳。
修正:每发 FireTime 增加 i * Cooldown,保证间隔 ≥ 冷却时间。
|
2026-06-13 09:56:11 +08:00 |
|
|
|
4411a452dc
|
fix: Quantity expand + PlatformIndex 映射修正
- ApplyDefensePlan 展开 EquipmentDeployment.Quantity → 多个 FireUnit
- Planner 分配后用 fireUnits.IndexOf 修正 PlatformIndex
- 新增 FullPipeline_Piston_VerifiesRoundAllocation 验证 ≥8 发
- Piston 集成测试加入计划大小断言
|
2026-06-13 09:50:24 +08:00 |
|
|
|
8366bfcb93
|
fix: Planner 从多单元凑弹药,不再被单个 TotalMunitions 卡死
每个威胁可从多个火力单元汇集弹药,直到满足需求或耗尽。
单元测试 24/24 通过。
|
2026-06-13 09:40:37 +08:00 |
|
|
|
b957a5e2b4
|
feat: Planner 使用真实物理计算 + 完善单元测试 + 规则7
- ComputeEffectiveRadius: 基于 AmmunitionSpec 三阶段扩散模型
- CalcRoundsNeeded: 真实有效半径和弹药参数
- GenerateFireEvents: recommendedTiming = arrivalTime - expansionTime
- 候选概率基于真实覆盖计算
- 24 个单元测试覆盖威胁排序/弹药匹配/候选过滤/弹药数/时机/多威胁/空基
- AGENTS.md 规则7: 只跑相关测试,不跑全量
|
2026-06-13 09:30:04 +08:00 |
|
|
|
317f47280b
|
refactor: DefensePlanner 替代 DefenseAdvisor
- 新增 IDefensePlanner 接口 + DefaultDefensePlanner 实现
- FireUnit 重构为统一平台模型(Type/Position/CruiseSpeed/ReleaseAltitude/MuzzleVelocity)
- DroneGroup 加入威胁指数(类型系数×速度系数)和优先级排序
- 五步流水线:威胁排序→弹药匹配→候选生成→贪心分配→时序生成
- 弹药精确匹配,不降级;临界方案基于50%概率阈值
- 删除 IDefenseAdvisor/DefaultDefenseAdvisor/RecommendMultiGroup
- AlgorithmFactory 注册 IDefensePlanner
- 测试更新:DefensePlannerTests 替代旧测试,FullPipelineTests 适配新 API
- Unity Managers 更新调用
- 125 测试全通过
|
2026-06-12 18:20:25 +08:00 |
|