ThreatSourceLibaray/docs/project/hit_probability_implementation.md

671 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 命中概率实现方案
## 文档信息
- **文档版本**: 1.0
- **创建日期**: 2025年1月
- **作者**: AI Assistant
- **项目**: ThreatSource 威胁源仿真库
- **模块**: SimulationManager, BaseMissile
## 1. 概述
本文档详细描述了威胁源仿真库中命中概率功能的实现方案。该功能通过蒙特卡罗方法在仿真中体现导弹的命中概率属性,提高仿真的真实性和统计准确性。
### 1.1 主要特性
1. **蒙特卡罗实现**: 使用随机数与命中概率比较的经典方法
2. **两阶段判定**: 距离检查 + 概率判定的双重验证
3. **详细日志**: 完整的调试信息输出,便于分析和验证
4. **统计准确性**: 大量试验下命中率趋近于设定概率
### 1.2 应用场景
- 武器系统效能评估
- 作战仿真分析
- 概率性武器建模
- 统计性能验证
## 2. 仿真行业中的命中概率实现方法
### 2.1 常用方法对比
| 方法 | 复杂度 | 精度 | 适用场景 | 实现难度 |
|------|--------|------|----------|----------|
| **蒙特卡罗方法** | 低 | 中 | 通用仿真 | 简单 |
| **误差椭圆模型** | 中 | 高 | 精确仿真 | 中等 |
| **多因子概率模型** | 高 | 很高 | 专业仿真 | 复杂 |
| **神经网络预测** | 很高 | 很高 | 智能仿真 | 很复杂 |
### 2.2 方法详细分析
#### 2.2.1 蒙特卡罗方法(已实现)
```csharp
// 简单有效的概率实现
double randomValue = random.NextDouble(); // 0.0-1.0
if (randomValue <= hitProbability) {
// 命中
} else {
// 未命中
}
```
**优势**:
- 实现简单,易于理解和维护
- 统计准确性好,大样本下收敛到真实概率
- 计算开销小,适合实时仿真
- 符合仿真行业标准做法
**适用性**: ✅ 已选择并实现
#### 2.2.2 误差椭圆模型
```csharp
// 基于CEP圆概率误差的精确模型
double distance = Vector3D.Distance(impactPoint, targetCenter);
double cep = missile.Properties.CircularErrorProbable;
double hitProbability = 1 - Math.Exp(-0.5 * Math.Pow(distance / cep, 2));
```
**优势**:
- 考虑实际弹着点分布
- 更符合物理实际
- 支持距离相关的命中概率
**劣势**:
- 需要额外的CEP参数
- 计算复杂度较高
#### 2.2.3 多因子概率模型
```csharp
// 考虑多种影响因素
double baseProbability = missile.Properties.HitProbability;
double weatherFactor = CalculateWeatherImpact(weather);
double targetSizeFactor = CalculateTargetSizeImpact(target);
double rangeFactor = CalculateRangeImpact(distance);
double finalProbability = baseProbability * weatherFactor * targetSizeFactor * rangeFactor;
```
**优势**:
- 高度真实的建模
- 考虑环境和目标因素
- 支持复杂场景分析
**劣势**:
- 参数众多,标定困难
- 计算开销大
- 实现复杂
## 3. 实现方案设计
### 3.1 架构设计
#### 3.1.1 实现位置
```
SimulationManager.CheckHitEvents()
├── 距离检查 (物理碰撞检测)
├── 概率判定 (蒙特卡罗方法)
└── 结果处理 (命中/未命中)
```
#### 3.1.2 数据流
```
导弹属性 → 命中概率 → 随机数生成 → 概率比较 → 命中判定
```
### 3.2 核心实现
#### 3.2.1 命中判定逻辑
```csharp
// 在SimulationManager.CheckHitEvents()中实现
foreach (var missile in activeMissiles)
{
foreach (var target in activeTargets)
{
double distance = Vector3D.Distance(missile.KState.Position, target.KState.Position);
Debug.WriteLine($"导弹 {missile.Id} 和目标 {target.Id} 之间的距离: {distance:F2}m");
if (distance <= missile.Properties.ExplosionRadius)
{
// 第一阶段:距离检查通过
// 第二阶段:使用命中概率进行随机判定
var random = new Random();
double randomValue = random.NextDouble(); // 生成0.0到1.0的随机数
double hitProbability = missile.Properties.HitProbability;
Debug.WriteLine($"命中概率判定: 随机值={randomValue:F4}, 命中概率={hitProbability:F4}");
if (randomValue <= hitProbability)
{
// 概率判定成功,确认命中
Debug.WriteLine($"概率判定成功!导弹 {missile.Id} 命中目标 {target.Id}");
var hitEvent = new HitEvent
{
SenderId = missile.Id,
TargetId = target.Id,
Timestamp = CurrentTime,
HitPosition = target.KState.Position
};
PublishEvent(hitEvent);
hitEvents.Add(hitEvent);
}
else
{
// 概率判定失败,未命中
Debug.WriteLine($"概率判定失败!导弹 {missile.Id} 未命中目标 {target.Id} (在爆炸半径内但概率判定失败)");
}
}
}
}
```
#### 3.2.2 关键特性
**两阶段验证**:
1. **距离检查**: 确保导弹在有效杀伤范围内
2. **概率判定**: 使用蒙特卡罗方法进行最终判定
**详细日志**:
- 距离信息记录
- 概率判定过程记录
- 命中/未命中结果记录
**事件发布**:
- 只有概率判定成功才发布命中事件
- 保持事件系统的一致性
### 3.3 参数配置
#### 3.3.1 导弹属性
```csharp
// 在导弹配置文件中设置
public class MissileProperties
{
public double HitProbability { get; set; } = 0.9; // 90%命中概率
public double ExplosionRadius { get; set; } = 5.0; // 5米爆炸半径
// 其他属性...
}
```
#### 3.3.2 配置示例
```toml
# 导弹配置文件示例
[Properties]
HitProbability = 0.85 # 85%命中概率
ExplosionRadius = 8.0 # 8米爆炸半径
MaxRange = 5000.0 # 最大射程
```
## 4. 统计特性分析
### 4.1 理论基础
#### 4.1.1 大数定律
```
当试验次数 n → ∞ 时:
实际命中率 → 设定命中概率
```
#### 4.1.2 置信区间
```
对于命中概率 p试验次数 n
标准误差 σ = √(p(1-p)/n)
95%置信区间 = p ± 1.96σ
```
### 4.2 统计验证
#### 4.2.1 验证方法
```csharp
// 统计验证代码示例
public class HitProbabilityValidator
{
public void ValidateHitProbability(double expectedProbability, int trials)
{
int hits = 0;
for (int i = 0; i < trials; i++)
{
// 模拟单次命中判定
var random = new Random();
if (random.NextDouble() <= expectedProbability)
{
hits++;
}
}
double actualProbability = (double)hits / trials;
double standardError = Math.Sqrt(expectedProbability * (1 - expectedProbability) / trials);
double margin = 1.96 * standardError; // 95%置信区间
Console.WriteLine($"期望概率: {expectedProbability:F4}");
Console.WriteLine($"实际概率: {actualProbability:F4}");
Console.WriteLine($"标准误差: {standardError:F4}");
Console.WriteLine($"95%置信区间: [{expectedProbability - margin:F4}, {expectedProbability + margin:F4}]");
bool isValid = Math.Abs(actualProbability - expectedProbability) <= margin;
Console.WriteLine($"验证结果: {(isValid ? "通过" : "失败")}");
}
}
```
#### 4.2.2 收敛性分析
```
试验次数与精度关系:
- 100次试验±10%误差范围
- 1000次试验±3%误差范围
- 10000次试验±1%误差范围
```
### 4.3 实际应用效果
#### 4.3.1 命中概率设置建议
```
导弹类型建议命中概率:
- 精确制导导弹0.90-0.95
- 半主动制导导弹0.80-0.90
- 红外制导导弹0.70-0.85
- 无制导火箭弹0.30-0.50
```
#### 4.3.2 环境因素影响
```
天气条件对命中概率的影响:
- 晴朗天气:基础概率
- 小雨:-5%
- 大雨:-15%
- 雾天:-20%
- 沙尘暴:-25%
```
## 5. 调试和验证
### 5.1 日志输出
#### 5.1.1 详细日志格式
```
距离检查:
导弹 Missile_01 和目标 Target_01 之间的距离: 3.45m
概率判定:
命中概率判定: 随机值=0.2341, 命中概率=0.8500
结果输出:
概率判定成功!导弹 Missile_01 命中目标 Target_01
概率判定失败!导弹 Missile_01 未命中目标 Target_01 (在爆炸半径内但概率判定失败)
```
#### 5.1.2 统计信息收集
```csharp
// 可选的统计信息收集
public class HitStatistics
{
public int TotalAttempts { get; set; }
public int SuccessfulHits { get; set; }
public double ActualHitRate => (double)SuccessfulHits / TotalAttempts;
public void RecordAttempt(bool hit)
{
TotalAttempts++;
if (hit) SuccessfulHits++;
}
public void PrintStatistics()
{
Console.WriteLine($"总尝试次数: {TotalAttempts}");
Console.WriteLine($"成功命中次数: {SuccessfulHits}");
Console.WriteLine($"实际命中率: {ActualHitRate:F4}");
}
}
```
### 5.2 测试用例
#### 5.2.1 基础功能测试
```csharp
[Test]
public void TestHitProbability_BasicFunctionality()
{
// 设置命中概率为100%
missile.Properties.HitProbability = 1.0;
// 在爆炸半径内应该必定命中
PlaceMissileNearTarget(distance: 3.0, explosionRadius: 5.0);
var result = simulationManager.CheckHitEvents();
Assert.IsTrue(result.Any(e => e.SenderId == missile.Id));
}
[Test]
public void TestHitProbability_ZeroProbability()
{
// 设置命中概率为0%
missile.Properties.HitProbability = 0.0;
// 在爆炸半径内应该永不命中
PlaceMissileNearTarget(distance: 3.0, explosionRadius: 5.0);
var result = simulationManager.CheckHitEvents();
Assert.IsFalse(result.Any(e => e.SenderId == missile.Id));
}
```
#### 5.2.2 统计准确性测试
```csharp
[Test]
public void TestHitProbability_StatisticalAccuracy()
{
const double expectedProbability = 0.75;
const int trials = 10000;
missile.Properties.HitProbability = expectedProbability;
int hits = 0;
for (int i = 0; i < trials; i++)
{
// 重置仿真状态
ResetSimulation();
PlaceMissileNearTarget(distance: 3.0, explosionRadius: 5.0);
var result = simulationManager.CheckHitEvents();
if (result.Any(e => e.SenderId == missile.Id))
{
hits++;
}
}
double actualProbability = (double)hits / trials;
double tolerance = 0.02; // 2%容差
Assert.AreEqual(expectedProbability, actualProbability, tolerance);
}
```
## 6. 性能考虑
### 6.1 计算开销
#### 6.1.1 时间复杂度
```
单次命中判定O(1)
- 距离计算O(1)
- 随机数生成O(1)
- 概率比较O(1)
```
#### 6.1.2 空间复杂度
```
内存使用O(1)
- 无额外数据结构
- 临时变量使用最小
```
### 6.2 优化建议
#### 6.2.1 随机数生成优化
```csharp
// 使用静态Random实例避免重复创建
private static readonly Random StaticRandom = new Random();
// 在命中判定中使用
double randomValue = StaticRandom.NextDouble();
```
#### 6.2.2 批量处理优化
```csharp
// 对于大量导弹的批量处理
public void CheckHitEventsBatch(List<Missile> missiles, List<Target> targets)
{
var random = new Random();
foreach (var missile in missiles)
{
foreach (var target in targets)
{
// 批量处理逻辑
if (IsWithinRange(missile, target) &&
random.NextDouble() <= missile.Properties.HitProbability)
{
ProcessHit(missile, target);
}
}
}
}
```
## 7. 扩展功能
### 7.1 动态命中概率
#### 7.1.1 距离相关概率
```csharp
public double CalculateDistanceBasedHitProbability(double distance, double optimalRange)
{
double baseProbability = missile.Properties.HitProbability;
double distanceFactor = Math.Exp(-Math.Pow(distance - optimalRange, 2) / (2 * Math.Pow(optimalRange * 0.3, 2)));
return baseProbability * distanceFactor;
}
```
#### 7.1.2 环境相关概率
```csharp
public double CalculateWeatherAdjustedHitProbability(WeatherConditions weather)
{
double baseProbability = missile.Properties.HitProbability;
double weatherMultiplier = weather.Type switch
{
WeatherType.Clear => 1.0,
WeatherType.LightRain => 0.95,
WeatherType.HeavyRain => 0.85,
WeatherType.Fog => 0.80,
WeatherType.Sandstorm => 0.75,
_ => 1.0
};
return baseProbability * weatherMultiplier;
}
```
### 7.2 多重概率模型
#### 7.2.1 分阶段概率
```csharp
public class MultiStageHitProbability
{
public double DetectionProbability { get; set; } = 0.95;
public double TrackingProbability { get; set; } = 0.90;
public double InterceptionProbability { get; set; } = 0.85;
public double OverallProbability =>
DetectionProbability * TrackingProbability * InterceptionProbability;
}
```
#### 7.2.2 目标类型相关
```csharp
public double GetTargetSpecificHitProbability(TargetType targetType)
{
return targetType switch
{
TargetType.Tank => missile.Properties.HitProbability,
TargetType.ArmoredVehicle => missile.Properties.HitProbability * 0.9,
TargetType.Infantry => missile.Properties.HitProbability * 0.7,
TargetType.Aircraft => missile.Properties.HitProbability * 1.1,
_ => missile.Properties.HitProbability
};
}
```
## 8. 最佳实践
### 8.1 配置管理
#### 8.1.1 参数验证
```csharp
public void ValidateHitProbability(double probability)
{
if (probability < 0.0 || probability > 1.0)
{
throw new ArgumentOutOfRangeException(
nameof(probability),
"命中概率必须在0.0到1.0之间");
}
}
```
#### 8.1.2 默认值设置
```csharp
public class MissileProperties
{
private double _hitProbability = 0.8; // 默认80%
public double HitProbability
{
get => _hitProbability;
set
{
ValidateHitProbability(value);
_hitProbability = value;
}
}
}
```
### 8.2 调试支持
#### 8.2.1 可配置日志级别
```csharp
public enum LogLevel
{
None,
Basic, // 只记录命中/未命中
Detailed, // 记录概率判定过程
Debug // 记录所有细节
}
public void LogHitAttempt(LogLevel level, string message)
{
if (level <= CurrentLogLevel)
{
Debug.WriteLine($"[HitProbability] {message}");
}
}
```
#### 8.2.2 统计报告
```csharp
public class HitProbabilityReport
{
public string GenerateReport()
{
return $@"
命中概率统计报告
================
总尝试次数: {TotalAttempts}
成功命中次数: {SuccessfulHits}
实际命中率: {ActualHitRate:P2}
期望命中率: {ExpectedHitRate:P2}
统计偏差: {Math.Abs(ActualHitRate - ExpectedHitRate):P2}
置信区间: [{ConfidenceIntervalLower:P2}, {ConfidenceIntervalUpper:P2}]
";
}
}
```
## 9. 与其他系统的集成
### 9.1 事件系统集成
#### 9.1.1 命中事件
```csharp
public class HitEvent : SimulationEvent
{
public string MissileId { get; set; }
public string TargetId { get; set; }
public Vector3D HitPosition { get; set; }
public double HitProbability { get; set; }
public double RandomValue { get; set; }
public bool WasSuccessful { get; set; }
}
```
#### 9.1.2 统计事件
```csharp
public class HitStatisticsEvent : SimulationEvent
{
public int TotalAttempts { get; set; }
public int SuccessfulHits { get; set; }
public double ActualHitRate { get; set; }
public double ExpectedHitRate { get; set; }
}
```
### 9.2 配置系统集成
#### 9.2.1 TOML配置支持
```toml
[HitProbability]
enabled = true
base_probability = 0.85
distance_dependent = false
weather_dependent = true
target_type_dependent = false
[HitProbability.WeatherModifiers]
clear = 1.0
light_rain = 0.95
heavy_rain = 0.85
fog = 0.80
sandstorm = 0.75
```
#### 9.2.2 运行时配置
```csharp
public class HitProbabilityConfig
{
public bool Enabled { get; set; } = true;
public double BaseProbability { get; set; } = 0.8;
public bool DistanceDependent { get; set; } = false;
public bool WeatherDependent { get; set; } = true;
public Dictionary<WeatherType, double> WeatherModifiers { get; set; }
}
```
## 10. 结论
### 10.1 实现总结
命中概率功能的实现采用了仿真行业标准的蒙特卡罗方法,具有以下特点:
1. **简单有效**: 实现简洁,易于理解和维护
2. **统计准确**: 大样本下收敛到设定概率
3. **性能优良**: 计算开销小,适合实时仿真
4. **扩展性好**: 支持多种扩展功能
### 10.2 应用价值
1. **提高仿真真实性**: 体现武器系统的概率特性
2. **支持统计分析**: 为效能评估提供数据基础
3. **增强可信度**: 符合实际武器系统的不确定性
4. **便于验证**: 通过统计方法验证实现正确性
### 10.3 未来发展
1. **多因子模型**: 考虑更多影响因素
2. **机器学习**: 使用AI方法预测命中概率
3. **实时调整**: 根据仿真状态动态调整概率
4. **可视化分析**: 提供概率分布的图形化展示
该实现为威胁源仿真库提供了重要的概率建模能力,是仿真系统向更高真实性发展的重要步骤。
## 11. 参考资料
1. 《蒙特卡罗方法》- 随机模拟理论基础
2. 《军事仿真建模》- 武器效能建模方法
3. 《概率论与数理统计》- 统计验证方法
4. 《仿真系统设计》- 仿真行业最佳实践
5. IEEE标准 - 仿真验证与确认指南