ThreatSourceLibaray/docs/project/hit_probability_implementation.md

17 KiB
Raw Blame History

命中概率实现方案

文档信息

  • 文档版本: 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 蒙特卡罗方法(已实现)

// 简单有效的概率实现
double randomValue = random.NextDouble(); // 0.0-1.0
if (randomValue <= hitProbability) {
    // 命中
} else {
    // 未命中
}

优势:

  • 实现简单,易于理解和维护
  • 统计准确性好,大样本下收敛到真实概率
  • 计算开销小,适合实时仿真
  • 符合仿真行业标准做法

适用性: 已选择并实现

2.2.2 误差椭圆模型

// 基于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 多因子概率模型

// 考虑多种影响因素
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 命中判定逻辑

// 在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 导弹属性

// 在导弹配置文件中设置
public class MissileProperties
{
    public double HitProbability { get; set; } = 0.9; // 90%命中概率
    public double ExplosionRadius { get; set; } = 5.0; // 5米爆炸半径
    // 其他属性...
}

3.3.2 配置示例

# 导弹配置文件示例
[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 验证方法

// 统计验证代码示例
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 统计信息收集

// 可选的统计信息收集
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 基础功能测试

[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 统计准确性测试

[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 随机数生成优化

// 使用静态Random实例避免重复创建
private static readonly Random StaticRandom = new Random();

// 在命中判定中使用
double randomValue = StaticRandom.NextDouble();

6.2.2 批量处理优化

// 对于大量导弹的批量处理
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 距离相关概率

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 环境相关概率

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 分阶段概率

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 目标类型相关

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 参数验证

public void ValidateHitProbability(double probability)
{
    if (probability < 0.0 || probability > 1.0)
    {
        throw new ArgumentOutOfRangeException(
            nameof(probability), 
            "命中概率必须在0.0到1.0之间");
    }
}

8.1.2 默认值设置

public class MissileProperties
{
    private double _hitProbability = 0.8; // 默认80%
    
    public double HitProbability
    {
        get => _hitProbability;
        set
        {
            ValidateHitProbability(value);
            _hitProbability = value;
        }
    }
}

8.2 调试支持

8.2.1 可配置日志级别

public enum LogLevel
{
    None,
    Basic,      // 只记录命中/未命中
    Detailed,   // 记录概率判定过程
    Debug       // 记录所有细节
}

public void LogHitAttempt(LogLevel level, string message)
{
    if (level <= CurrentLogLevel)
    {
        Debug.WriteLine($"[HitProbability] {message}");
    }
}

8.2.2 统计报告

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 命中事件

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 统计事件

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配置支持

[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 运行时配置

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标准 - 仿真验证与确认指南