fire-rule.drl 维护说明(业务+开发)
本文档对应 auto-solution-rule/src/main/resources/rules/fire-rule.drl 当前版本,重点说明:
- 业务人员改哪里
- 每个参数改了会产生什么效果
- 如何快速判断规则是否“命中/不命中”
1. 先看这一个入口:业务可改区
只改 //TODO 下的 buildBusinessConfig(),其他函数不要改。
buildBusinessConfig() 里每个参数的效果如下。
2. 参数-效果对照(给业务人员)
2.0 规则过程总览(先看这一条)
引擎按 salience 从高到低 依次执行(同一 agenda-group 内数字越大越先跑)。主链路可以理解为:先定武器与目标关系 → 再补组件与数量 → 再定任务名与空间位置 → 最后射程与航迹。
flowchart TD
step1["红方武器自适应装配 55"]
step2["导弹联动增强 54"]
step3["导弹组件数量匹配 53"]
step4["命中率动态数量与offset 52"]
step5["任务自动匹配 50"]
step6["阵位区域解析 49"]
step7["阵位武器部署赋位 48"]
step8["射程合理性校验 47"]
step9["航迹生成 46"]
step1 --> step2 --> step3 --> step4 --> step5 --> step6 --> step7 --> step8 --> step9
两种装配主路径(由 enableRuleScoring 决定)
| 模式 | 开关 | 武器从哪来 | targetId 怎么定 |
|---|---|---|---|
| 过程驱动整数加分 | enableRuleScoring=true(默认) |
对每个蓝方目标抽特征 → 红方候选池打分 → 并列最高分全选 → 按需求数克隆武器 | 生成红方武器时 直接写入 对应该蓝目标的 equipmentId(见 allocateRedWeaponsForBlueTarget) |
| 传统白名单映射 | enableRuleScoring=false |
按 enableAirRule 等开关 + map_*_targets 映射追加武器 |
装配结束后调用 bindTargetIdsForRedWeapons:可行性过滤 + 五维加权分 + 边际递减 + 比例/回退 |
调参时的阅读顺序建议:先确认当前是过程驱动还是白名单 → 再改对应段落里的开关与阈值 → 最后看下游规则(命中率改数量、阵位改坐标)是否仍符合预期。
2.1 武器名称映射(改名字,不改逻辑)
redStrikeDroneName:空中反制组中的无人机名称。redArmedHelicopterName:空中反制组中的武装直升机名称。redHowitzerName:地面反制组中的迫榴炮名称。redVehicleMortarName:地面反制组中的车载迫击炮名称。redAaWeaponName:空中反制组中的防空导弹武器名称。redAtRocketName:装甲反制组中的反坦克火箭名称。redAtMissileSystemName:装甲反制组中的反坦克导弹系统名称。redMissileVehicleName:导弹补充组中的导弹发射车名称。
2.2 白名单开关(决定“是否匹配”)
仅当
enableRuleScoring=false时,下列开关与映射主导装配;enableRuleScoring=true时走过程驱动,本节开关对是否出武器基本不生效(仍可能影响你后续阅读的兼容映射字段)。
| 参数 | 作用 | 影响什么 | 怎么调整 |
|---|---|---|---|
enableAirRule |
是否允许“蓝方有空中目标”时走空中反制映射 | false 时空中组整条链路不追加武器 |
不需要空中反制时置 false,减少误匹配 |
enableGroundRule |
是否允许蓝方地面目标触发炮类反制组 | 影响迫榴炮/车载迫击炮等是否出现 | 只想反装甲不上炮时置 false |
enableArmorRule |
是否允许装甲目标触发反坦克组 | 影响反坦克火箭/导弹系统等是否出现 | 关闭后装甲线完全不走映射 |
enableMissileVehicleRule |
蓝方有导弹能力时是否追加导弹发射车 | 控制是否额外生成 map_missile_targets 对应武器 |
默认多为 false,需导弹车时再开 |
enableMissileLinkage |
导弹联动增强(applyMissileLinkage)是否执行 |
为 true 且满足门槛时,给红方空中武器补/增强导弹组件数量与射程 |
不想自动改导弹数量与范围时置 false |
allowMultiGroup |
多组策略是否可叠加 | true:空中/地面/装甲等多条可同时命中;false:只命中第一组,后续不再加武器 |
想规则更“硬”、少组合时置 false |
enableArmedHelicopterOnAir |
空中映射中是否包含武装直升机 | 影响空中组是否出 redArmedHelicopterName 对应装备 |
只要无人机不要武直时置 false |
2.3 蓝方类型到红方方案映射(兼容项,评分模式下弱化)
先解释你提到的 “k”:
- 这里的
k就是 key(键名),例如map_armor_targets。 v是 value(值),例如反坦克火箭,反坦克导弹系统。- 规则实际含义就是:
key决定“哪类蓝方目标”,value决定“红方上哪些武器”。
映射键名中文对照:
map_air_targets:蓝方是空中目标时,红方使用哪些武器。map_ground_targets:蓝方是地面目标时,红方使用哪些武器。map_armor_targets:蓝方是装甲目标(坦克/装甲车)时,红方使用哪些武器。map_artillery_targets:蓝方是炮类目标时,红方使用哪些武器。map_missile_targets:蓝方有导弹能力时,红方使用哪些武器。
映射规则说明:
- 当
enableScoringSelection=true时,本组配置不再主导最终结果,仅作为兼容保留。 - 当前主决策由“过程驱动评分引擎”完成(类型/距离/命中率/成本综合评分)。
2.4 数量与参数(匹配后给多少、导弹与炮类参数)
| 参数 | 作用 | 影响什么 | 怎么调整 |
|---|---|---|---|
defaultAirNum |
白名单路径下空中映射默认实例数量 | 每轮 map_air_targets 展开时基数 |
需要更多同型机时调大 |
defaultGroundNum |
地面/装甲/炮类映射默认数量 | 非空中组映射展开基数 | 同上 |
defaultMissileVehicleNum |
导弹发射车映射默认数量 | enableMissileVehicleRule=true 时追加数量 |
导弹车要多台时调大 |
shellRangeDefault |
炮类武器“炮弹”组件射程字符串 | limitRedArtilleryToShellOnly 写入的默认 范围米 |
想压远/压近打击时改数值 |
missileCountOffset |
联动时红方导弹数量相对蓝方的增量 | applyMissileLinkage 中目标导弹发数 |
希望红方导弹明显多于蓝方时调大 |
missileRangeOffset |
联动时红方导弹射程在蓝方基础上的增量 | 红方空中武器导弹组件首参数(破坏范围米) | 需要更远覆盖时调大 |
blueMissileRangeDefault |
蓝方未给导弹射程时的假定值 | 联动计算 redRangeTarget 的输入 |
输入不全时兜底,按典型弹种改 |
minBlueMissileCountForLinkage |
联动触发门槛(蓝方导弹总数) | 低于则 applyMissileLinkage 直接返回 |
想更难触发联动时调大(如 2、3) |
2.5 仅导弹组件匹配(导弹组件数量匹配规则,salience 53)
规则过程:在红方武器已有 targetId 的前提下,按蓝方对应装备的导弹类组件去对齐红方导弹组件的数量与首参数;其它组件不动。
| 参数 | 作用 | 影响什么 | 怎么调整 |
|---|---|---|---|
enableComponentQuantityMatch |
总开关 | false 时本规则不改写任何组件 |
完全手工控组件时关闭 |
componentDeviceNameMappingCsv |
蓝/红导弹组件 deviceName 映射 |
解决双方组件命名不一致导致对不上 | 填 机载导弹->某某导弹 形式,逗号分隔多对 |
missileComponentNameContains |
判定“导弹组件”的关键词 | 只有 deviceName 含该词的组件参与匹配 |
若业务用“火箭弹”等命名,可改关键词 |
输出影响:仅改导弹组件 componentParams[0].number 与 componentParams[0].attDefaultValue(破坏范围等),非导弹组件保持红方原值。
2.6 targetId 自动绑定(仅传统白名单路径)
enableRuleScoring=true(过程驱动)时:装配阶段已在allocateRedWeaponsForBlueTarget里把targetId设为对应蓝方equipmentId,不会再走下表的五维分配逻辑。下表仅在enableRuleScoring=false且configureRedWeaponsByBlue末尾调用bindTargetIdsForRedWeapons时生效。
| 参数 | 作用 | 影响什么 | 怎么调整 |
|---|---|---|---|
enableTargetAutoBind |
是否执行绑定函数 | false 时红方 targetId 保持入参/空 |
全手工指定目标时关闭 |
minTargetBindRatio |
最低绑定比例下限 | 绑定数/红武器总数低于该比例时,尝试用 pickAnyBlueId 补足 |
想“几乎全要有目标”时调高(如 0.9);允许大量空则调低 |
allowReserveWithoutTarget |
是否允许故意留空 | true:允许火力冗余;false:尽量全部塞满目标 |
与 minTargetBindRatio 配合使用 |
w_target_type |
类型匹配在总分中的权重 | 越大越强调类型对口 | 类型错配不可接受时略调高 |
w_target_dist |
距离权重 | 越大越偏向更近、易打击的蓝目标 | 强调近战压制时调高 |
w_target_height |
高度差权重 | 越大越惩罚高度层不匹配 | 空地混合作战可略调高 |
w_target_hit |
命中率权重 | 越大高 hitRate 武器越易抢到好目标 |
强调效费比时调高 |
w_target_threat |
蓝方威胁权重 | 越大越优先高威胁蓝目标 | 要“先打高威胁”时调高 |
maxEffectiveDistance |
配对最大有效距离 | 超过则 isPairFeasible 直接否 |
只允许远程交火时调大;强制近战调小 |
maxHeightGap |
允许的最大高度差 | 超过则候选失效 | 高原/低空混编时适度调大 |
targetDecayAlpha |
边际递减系数 | marginal = score / (1 + alpha*k),k 为该蓝目标已分配数;越大越不扎堆 |
避免多机打同一目标时调大 |
fallbackToNearestTarget |
无可行候选时是否按距离回退 | true 时尽量给一个最近蓝 equipmentId |
不想硬塞错误目标时改 false 并配合 allowUnassignedRedWeapon |
allowUnassignedRedWeapon |
仍无可行时是否允许 targetId 为空 |
true 允许空;false 会再 pickAnyBlueId 硬填 |
与火力冗余策略一致即可 |
绑定过程(白名单路径,固定实现):绑定键为蓝方 equipmentId → 逐把红武器在可行集合上算分 → 取边际最高 → 更新已分配计数 → 不足比例再补 → 仍不行则按上表回退或留空。
2.7 过程驱动整数加分参数(核心,enableRuleScoring=true)
规则过程(函数 runProcessDrivenSelection):对每个带 equipmentId 的蓝方武器抽一条特征 → 在配置给出的红方武器池里用 scoreRedWeaponByRules 打整数分 → 去掉低于 minScoreToAssign 的 → 并列最高分全部保留 → 按 computeNeededRedCountFromFeature 得到 needCount,再被 minRedWeaponsPerBlueTarget~maxRedWeaponsPerBlueTargetCap 钳位 → 轮询 topNames 克隆武器并 setTargetId(blueId)。
| 参数 | 作用 | 影响什么 | 怎么调整 |
|---|---|---|---|
enableRuleScoring |
是否走过程驱动主路径 | true 走本节;false 回退 2.2 白名单 + 2.6 绑定 |
与旧映射二选一 |
minScoreToAssign |
候选武器最低整数分 | 低于则该红方武器名不参与本蓝目标的并列候选 | 想更少种类参与时调大;想多并列时调小 |
nearDefenseDistanceMeters |
蓝方到防区距离“近”的米阈值 | 与 score_nearDefense_artillery 联动:近且炮名命中则加分 |
防区尺度变化时同步改 |
highThreatLevel |
任务威胁等级算“高威胁”的整数阈值 | 与 score_highThreat_missile 等联动 |
想更容易触发“高威胁分支”时调低 |
highTargetCount |
蓝方该目标 number 的“数量高”阈值 |
与 score_highCount_artillery 联动 |
集群目标多时调低 |
score_type_antiArmor |
装甲特征下反坦克类名加分 | 含“反坦克”的红方名更容易进并列最高 | 强化反坦时调大 |
score_nearDefense_artillery |
近防区 + 迫榴/迫击炮名加分 | 近防区时更倾向出炮 | 强调要炮时调大 |
score_highThreat_missile |
高威胁或空中场景下导弹/防空类加分(实现中与多项条件叠加) | 高威胁/空中时防空、导弹类名分更高 | 防空压制想加重时调大 |
score_highCount_artillery |
蓝方数量高时炮类加分 | 多目标时更倾向炮 | 炮火优先时调大 |
score_hasMissile_airDefence |
蓝方有导弹组件时防空/导弹发射车类加分 | 有导弹威胁时更倾向防空与导弹车 | 导弹对抗想加重时调大 |
并列全选机制:
- 对同一蓝方
equipmentId,所有红方候选算分后取maxScore,凡score == maxScore的武器名称都进入topNames。 - 需要数量大于名称种数时,会在
allocateRedWeaponsForBlueTarget里轮询topNames重复添加,故同名武器可出现多把。 - 另:实现里若估算射程覆盖蓝方距离(含安全裕量)还会 +1 分,便于优先能打的装备。
2.8 命中率与动态火力(命中率规则-动态数量与offset,salience 52)
规则过程:在装配之后,对已有红方武器的 number 做增量:优先读 offsetCsvByWeapon 显式 offset;否则用命中率与阈值的 gap 阶梯 加 hitRateStep*Offset。
| 参数 | 作用 | 影响什么 | 怎么调整 |
|---|---|---|---|
hitRateCsv |
按武器名配置命中率 | applyDefaultHitRateIfAbsent 与 gap 计算 |
调整个体武器假定命中能力 |
defaultHitRateFallback |
未配置且武器无 hitRate 时 |
gap 计算用的默认 p | 整体偏乐观/悲观时改 |
desiredKillProbability |
过程驱动里毁伤置信目标 | computeNeededRedCountFromFeature 中 computeRequiredShots 的输入 |
想“打得更保险”时调高(需求发数可能变多) |
offsetCsvByWeapon |
最高优先级数量偏移 | 命中武器名则 忽略 gap 阶梯,直接 base + offset |
某武器必须固定加 N 发时配置 |
hitRateThreshold |
命中率门槛 | gap = threshold - hitRate,决定进哪一档增量 |
门槛越高,低命中武器越易吃到正 offset |
hitRateGapStep1Max / hitRateGapStep2Max |
gap 的一、二档上界 | 分档加 hitRateStep1Offset 或 hitRateStep2Offset |
拉宽档位可减少落到高档 |
hitRateStep1Offset / hitRateStep2Offset |
各档对 number 的加量 |
直接增加 weapon.number |
低命中时想多压弹药则调大 |
minRedWeaponsPerBlueTarget |
每蓝目标至少分配红武器数下限 | 过程驱动里与 needCount 取大 |
强制“至少 N 把伺候一个目标” |
maxRedWeaponsPerBlueTargetCap |
每蓝目标分配上限 | 与 needCount 取小,防止无限膨胀 |
控制火力上限 |
enableDynamicMultiRedPerBlue |
配置项(当前实现未读取) | 预留;改之暂无效果,以 desiredKillProbability + min/max 钳位为准 |
待代码接入后再用 |
阶梯优先级(与代码一致):
offsetCsvByWeapon命中 → 只用显式 offset。- 否则
gap <= 0→+0。 0 < gap <= hitRateGapStep1Max→+hitRateStep1Offset。hitRateGapStep1Max < gap <= hitRateGapStep2Max→+hitRateStep2Offset。gap > hitRateGapStep2Max→ 仍按 第二档 offset(避免数量无上限膨胀)。
2.9 阵位规则参数(阵位规则 49→48)
规则过程:prepareDeploymentPools 用作战区/防区多边形生成候选点网格;applyWeaponDeployment 用蓝方航迹与防区关系得到 部署模式 deployMode(近快/远快/近慢/默认)→ 选锚点 → resolveFormationType(人工阵型 / 自动阵型 / 默认)→ buildFormationOffsets 展开队形 → 写入 weapon.coordinate;地面高度固定、空中可走自动生成高度。
输入依赖:blueTask.warZoneLocation、blueTask.defZoneLocation(各 4 点经纬);部署模式还依赖 trackPoints(算速度与距防区)。
2.9.1 总开关与点位
| 参数 | 作用 | 影响什么 | 怎么调整 |
|---|---|---|---|
enablePositionRules |
阵位总开关 | false 时跳过点位池与赋位 |
仅要装配不要坐标时关闭 |
fireUnitSpacingMeters |
作战区/防区内网格点间距(米) | 点密度:越小点越多、部署越密 | 地形细粒度要求高调小 |
airDeployZonePreference |
空中锚点优先作战区还是防区 | combat/defense 影响 pickAnchorByMode 选取 |
想飞机靠前压则偏 combat |
defensePriorityWeapons |
名单内武器优先取防区点 | 名单武器在无锚点回退时优先 defense 池 |
要扼守防区的装备写入 |
2.9.2 部署模式(与 speedFastThreshold、距离阈值)
| 参数 | 作用 | 影响什么 | 怎么调整 |
|---|---|---|---|
speedFastThreshold |
蓝方平均速度是否算“快” | 与 distanceNearDefenseThresholdMeters、distanceFarDefenseThresholdMeters 组合成 near_fast / far_fast / near_slow / default |
高速标准提高则更少判成“快” |
distanceNearDefenseThresholdMeters |
蓝方航迹末端距防区“近”的米阈值 | 参与部署模式与锚点策略 | 防区尺度大时略调大 |
distanceFarDefenseThresholdMeters |
“远”阈值 | 同上 | 与上配合拉开近/远带 |
2.9.3 高度(地面固定 / 空中可自动)
| 参数 | 作用 | 影响什么 | 怎么调整 |
|---|---|---|---|
groundDeployHeight |
地面武器统一高度 | 地面编队 moveCoordinateByMeters / 克隆点高度 |
地表 DEM 约定高度 |
airDeployHeight |
关闭自动或兜底时用 | 过程驱动关闭自动高度时的固定空高 | 与 airHeightFallback 一般同量级 |
enableAutoAirDeployHeight |
空中是否按态势算高 | false 时空中全程用 airDeployHeight |
想完全手工高时关 |
airHeightFallback |
无航迹且无蓝方武器高度时的基准 | resolveBlueBaseHeight 最后兜底 |
与默认战术层一致即可 |
airHeightMin / airHeightMax |
自动高度钳位 | 防止算出过矮/过高 | 任务高度包线 |
airHeightSpeedThreshold / airHeightAdjustFast |
快于阈值则加高度 | 快目标对应更高拦截层 | 拦截想更猛则加 AdjustFast |
airHeightNearDefenseDistance / airHeightFarDefenseDistance |
距防区近/远分界 | 近用 airHeightAdjustNear(多为负)、远用 airHeightAdjustFar |
调整防区内外高度差 |
airHeightAdjustMain / airHeightAdjustWing |
主僚高度差 | 主机略高、僚机略低 | 战术队形垂直疏开 |
2.9.4 阵型类型(人工 / 自动 / 默认)
说明(与部署模式共用阈值):resolveDeployModeByBlueState 用 speedFastThreshold、distanceNearDefenseThresholdMeters、distanceFarDefenseThresholdMeters 得到 near_fast / far_fast / near_slow / default,autoSelectFormationType 直接消费该 deployMode 字符串选 formationRule_*。配置里的 formationFastSpeedThreshold、formationNearDefenseDistance、formationFarDefenseDistance 当前未参与运算,调整无效;若要与部署模式解耦,需开发在代码中改为读取这三项。
| 参数 | 作用 | 影响什么 | 怎么调整 |
|---|---|---|---|
formationDefaultType |
阵型名兜底 | 非法或未选时 normalizeFormationType 回退 |
填 TRIANGLE 等合法枚举 |
enableAutoFormationSelect |
是否 autoSelectFormationType |
false 时只用 Task 指定或默认 |
想完全人工阵型时关 |
formationHighThreatLevel |
威胁≥该值走 formationRule_high_threat |
优先于速度距离分支 | 想更早用“高威胁阵型”则调低 |
formationLargeGroupCount |
大编队阈值 | 比较 redTask.taskWeapons.size()(红方武器条数) ≥ 阈值则走 formationRule_large_group(不是蓝方数量) |
想更早切换“大编队阵型”则调小 |
formationRule_near_fast 等 |
各分支对应阵型名 | 决策序:高威胁 > 近快/远快/近慢 > 大编队(红方条数)> 空中占比≥0.5 > default | 改字符串即改映射 |
formationRule_air_majority |
红方空中占比高时阵型 | computeRedAirRatio ≥ 0.5 |
无人机群战术时调整 |
2.9.5 间距、主僚距、朝向(自动 + 兜底)
| 参数 | 作用 | 影响什么 | 怎么调整 |
|---|---|---|---|
formationDefaultSpacingMeters |
阵型间距兜底 | 自动间距失败时用 | 与最小安全间距匹配 |
formationSpacingMinMeters / formationSpacingMaxMeters |
自动间距上下界 | 限制 resolveFormationSpacing 输出 |
地形窄/宽时收放 |
defenseScaleMinMeters / defenseScaleMaxMeters |
防区尺度映射到间距的范围 | 防区越大间距可越大 | 与防区实际大小一致 |
mainWingDistanceDefaultMeters |
主僚距兜底 | 自动主僚距失败时 | 编队纵向尺度 |
mainWingDistanceMinMeters / mainWingDistanceMaxMeters |
主僚距钳位 | 限制自动主僚距 | 避免过近相撞 |
mainWingDistanceModeFactor_near_fast 等 |
部署模式对主僚距的乘子 | 近快更紧、远快更疏等 | 战术疏密 |
formationHeadingDefaultDeg |
朝向兜底 | 无航迹、无 Task 朝向时 | 默认机头方向 |
实体覆盖优先级(与代码一致):
- 阵型类型:
Task.formationType(非空)> 自动选阵型 >formationDefaultType。 - 间距:
Task.formationSpacingMeters> 防区尺度自动 >formationDefaultSpacingMeters。 - 主僚距:
Weapon.wingRelativeDistanceMeters>Task.mainWingDistanceMeters> 自动 >mainWingDistanceDefaultMeters。 - 朝向:
Task.formationHeadingDeg> 航迹末段方向 >formationHeadingDefaultDeg。
实体字段建议:Task:formationType、formationSpacingMeters、mainWingDistanceMeters、formationHeadingDeg;Weapon:formationRole、wingRelativeDistanceMeters、wingRelativeBearingDeg。
阵位输入示例(仅经纬度,4点):
{
"warZoneLocation": [
{ "longitude": 116.3801, "latitude": 39.9001 },
{ "longitude": 116.3901, "latitude": 39.9001 },
{ "longitude": 116.3901, "latitude": 39.9101 },
{ "longitude": 116.3801, "latitude": 39.9101 }
],
"defZoneLocation": [
{ "longitude": 116.3825, "latitude": 39.9025 },
{ "longitude": 116.3875, "latitude": 39.9025 },
{ "longitude": 116.3875, "latitude": 39.9075 },
{ "longitude": 116.3825, "latitude": 39.9075 }
]
}
2.10 航迹规则参数(新增)
enableTrajectoryRules:航迹规则总开关。strategyMode:auto/shortest/flank/interfere。auto:智能选择策略。- 其他值:强制使用指定策略(若该策略被禁用会自动回退)。
enableShortest/enableFlank/enableInterfere:各策略开关。nearDefDistanceMeters:蓝方末端点到防区的“近距离阈值”。farDefDistanceMeters:蓝方末端点到防区的“远距离阈值”。fastSpeedThreshold:蓝方平均速度达到该值视为“高速”。flankOffsetMeters:绕后追击偏移幅度(越大绕后越明显)。interfereOffsetMeters:干扰轨迹基础偏移。interfereZigzagAmplitude:干扰轨迹锯齿振幅(越大摆动越明显)。keepBlueHeight:是否沿用蓝方高度。redTrackHeightOverride:不沿用时红方统一高度。
航迹智能选择逻辑:
near + fast->shortest(最短距离追击)far + fast->interfere(干扰/诱偏)- 其他 ->
flank(绕后追击)
不生成保护:
- 蓝方
trackPoints为空,或defZoneLocation点数不足(<3),则不生成红方航迹。
3. 当前规则行为(简版)
装备组件匹配、组件参数匹配:已作为legacy占位,不承担当前业务决策。- 主决策在
红方武器自适应装配规则:调用configureRedWeaponsByBlue(...),默认走“过程驱动整数加分选武器”。 - 过程驱动链路:蓝方特征提取 -> 候选整数加分 -> 最高分并列全选 -> 动态分配数量与 targetId。
- 导弹增强在
导弹联动增强规则:调用applyMissileLinkage(...),受开关和阈值控制。 全组件数量匹配规则当前语义已收敛为“仅导弹组件匹配”:只改导弹组件数量与首参数,非导弹不改。- 命中率驱动数量在
命中率规则-动态数量与offset:按hitRateThreshold与gap阶梯增量计算数量;显式 offset 配置优先。 - 任务命名在
任务自动匹配规则:调用assignTaskNameByRedWeapons(...),按红方最终武器自动生成任务名和dataType。 - 炮类约束:命中炮类条件时,炮类武器只保留
炮弹组件,单位范围米。 targetId:过程驱动下在装配时直接写入对应蓝方equipmentId;白名单路径下用“可行性 + 五维评分 + 边际递减”分配(见 2.6)。- 阵位部署:按“速度距离驱动锚点 + 阵型偏移 + 主僚机相对位移”自动赋位,最终输出经纬高。
- 射程合理性在
射程合理性校验规则:基于蓝/红武器坐标计算距离,自动避免“射程不足却打击”的不合理情况(可自动调参)。 - 航迹生成:根据蓝方
trackPoints生成红方trackPoints,点数与蓝方一致,支持三套策略和智能选择。
3.1 任务名称自动匹配(任务自动匹配规则,salience 50)
规则过程:在武器与数量基本落定之后,按 红方最终 taskWeapons 列表 做分类(不看蓝方 drawName 关键字),写入 redTask.drawName 与 redTask.dataType。
分类优先级(先命中先生效):
- 导弹突击:含导弹发射车类武器名
- 防空压制:防空导弹 / 火力打击无人机 / 武装直升机
- 反装甲打击:反坦克火箭 / 反坦克导弹系统
- 炮火压制:迫榴炮 / 车载迫击炮
- 通用打击:兜底
| 参数 | 作用 | 影响什么 | 怎么调整 |
|---|---|---|---|
taskName_missile_strike |
导弹突击类展示名 | drawName 当命中导弹突击分支时 |
改中文任务标题 |
taskDataType_missile_strike |
导弹突击类业务类型 | dataType 同步写入 |
与前端/报表枚举对齐 |
taskName_air_defence / taskDataType_air_defence |
防空压制类 | 同上 | 同上 |
taskName_anti_armor / taskDataType_anti_armor |
反装甲类 | 同上 | 同上 |
taskName_artillery / taskDataType_artillery |
炮火类 | 同上 | 同上 |
taskName_general / taskDataType_general |
兜底类 | 无上述特征或冲突回落时使用 | 默认任务名与类型 |
效果说明:只改模板字符串即可改展示;若红方武器组合与期望分类不一致,会落到 taskName_general,避免“名不副实”。
4. 快速修改示例(业务常用)
- 想让规则更“死”:
- 把
allowMultiGroup改成false。
- 把
- 想让“坦克只上反坦克火箭,不上导弹系统”:
- 把
map_armor_targets改成反坦克火箭。
- 把
- 想让“坦克同时上火箭和导弹系统”:
- 把
map_armor_targets改成反坦克火箭,反坦克导弹系统。
- 把
- 想允许更多不命中:
- 关闭部分开关,例如
enableGroundRule=false、enableArmorRule=false。
- 关闭部分开关,例如
- 想让导弹联动更难触发:
- 提高
minBlueMissileCountForLinkage,例如从1调到3。
- 提高
- 想提升炮类打击范围:
- 调大
shellRangeDefault,例如1500 -> 1800。
- 调大
5. 测试 JSON(按你项目常用的 Task 入参格式)
说明:下面 JSON 是 单个 Task 格式,不是 FactTask 包装格式。
如果你的执行入口最终需要 FactTask,则由开发在服务层把“蓝方 Task + 红方 Task”组装后再 insert 规则引擎。
5.1 不命中样例(蓝方 Task)
说明:该样例仅用于蓝方任务输入结构校验;若业务把对应映射留空或关闭开关,则允许不命中。
{
"id": "blue-miss-001",
"side": "蓝方",
"dataType": "打击",
"threatLevel": "2",
"taskWeapons": [
{
"name": "攻击直升机",
"supportType": "overhead",
"number": 1,
"components": []
}
]
}
5.2 命中样例(蓝方 Task)
说明:该蓝方输入同时包含空中和装甲特征,且有导弹组件,满足命中与联动测试条件。
{
"id": "blue-hit-001",
"side": "蓝方",
"dataType": "打击",
"threatLevel": "3",
"taskWeapons": [
{
"name": "攻击直升机",
"supportType": "overhead",
"number": 2,
"components": [
{
"deviceName": "机载导弹",
"componentParams": [
{
"attDefaultValue": "260",
"attExplain": "破坏范围米",
"number": 2
}
]
}
]
},
{
"name": "主战坦克",
"supportType": "ground",
"number": 2,
"components": []
}
]
}
5.3 红方初始 Task 样例(通常为空列表)
说明:用于和蓝方 Task 组装成规则输入对象。
{
"id": "red-init-001",
"side": "红方",
"dataType": "打击",
"threatLevel": "1",
"taskWeapons": []
}
5.4 航迹规则不生成样例(缺防区)
{
"id": "blue-track-miss-001",
"side": "蓝方",
"dataType": "打击",
"threatLevel": "2",
"defZoneLocation": [],
"trackPoints": [
{ "index": 0, "longitude": 116.3801, "latitude": 39.9001, "height": 100, "speed": 210 },
{ "index": 1, "longitude": 116.3810, "latitude": 39.9010, "height": 100, "speed": 220 }
],
"taskWeapons": []
}
5.5 航迹规则命中样例(可生成)
{
"id": "blue-track-hit-001",
"side": "蓝方",
"dataType": "打击",
"threatLevel": "3",
"defZoneLocation": [
{ "longitude": 116.4001, "latitude": 39.9201 },
{ "longitude": 116.4051, "latitude": 39.9201 },
{ "longitude": 116.4051, "latitude": 39.9251 },
{ "longitude": 116.4001, "latitude": 39.9251 }
],
"trackPoints": [
{ "index": 0, "longitude": 116.3801, "latitude": 39.9001, "height": 120, "speed": 240 },
{ "index": 1, "longitude": 116.3840, "latitude": 39.9040, "height": 120, "speed": 245 },
{ "index": 2, "longitude": 116.3880, "latitude": 39.9080, "height": 120, "speed": 250 },
{ "index": 3, "longitude": 116.3920, "latitude": 39.9120, "height": 120, "speed": 248 }
],
"taskWeapons": []
}
6. 开发人员说明(放在末尾)
- 入口约定:业务仅改
buildBusinessConfig(),开发改函数实现时不要破坏该入口。 - 类型约定:配置读取统一走
readIntCfg(...)/readBooleanCfg(...),避免Map强转异常。 - 策略收敛:
configureRedWeaponsByBlue(...)使用matchedAny + allowMultiGroup控制“单组命中/多组叠加”。 - 映射解析:通过
parseMappedWeaponNames(...)将逗号分隔配置解析为武器列表,非法名称会被isValidRedWeaponNameByConfig(...)过滤。 - 联动门控:
applyMissileLinkage(...)必须同时满足:enableMissileLinkage=true- 蓝方导弹数量
>= minBlueMissileCountForLinkage
- 目标绑定:
bindTargetIdsForRedWeapons(...)基于蓝方equipmentId执行“可行性过滤 + 打分 + 边际收益递减分配 + 回退兜底”。 - 阵位部署:
prepareDeploymentPools(...)+applyWeaponDeployment(...)负责区域解析、点位生成与部署赋位。 - 航迹生成:
applyTrajectoryGeneration(...)+chooseTrajectoryStrategy(...)+generateRedTrackPoints(...)负责红方航迹策略生成。 - 任务命名:
assignTaskNameByRedWeapons(...)仅基于红方最终武器,避免旧版按蓝方drawName关键字造成误判。 - legacy 区域:
装备组件匹配、组件参数匹配及 legacy 函数区只保留回滚,不建议继续扩展。 - 新增武器建议:优先补
isAirWeapon/isGroundWeapon/isArmorWeapon/isArtilleryWeapon分类,再补ensureBasicRedComponents(...)模板。