671 lines
17 KiB
Markdown
671 lines
17 KiB
Markdown
# 命中概率实现方案
|
||
|
||
## 文档信息
|
||
|
||
- **文档版本**: 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标准 - 仿真验证与确认指南 |