增加将仿真数据保存为 json 文件并读取
This commit is contained in:
parent
28d6996c58
commit
21a452c59e
@ -1,5 +1,6 @@
|
||||
using ActiveProtect.Simulation;
|
||||
using ActiveProtect.Evaluation;
|
||||
using ActiveProtect.DataProcessing;
|
||||
|
||||
namespace ActiveProtect
|
||||
{
|
||||
@ -14,7 +15,10 @@ namespace ActiveProtect
|
||||
//SimulationExample.RunAllExamples();
|
||||
|
||||
// 运行效能评估示例
|
||||
EvaluationExample.RunAllExamples();
|
||||
//EvaluationExample.RunAllExamples();
|
||||
|
||||
// 运行数据记录示例
|
||||
SimulationRecordExample.RunExample();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,34 @@
|
||||
{
|
||||
"SimulationId": "0109c8d6-1a0a-4faf-8a12-380969649862",
|
||||
"Timestamp": "2024-11-01T17:29:41.519964+08:00",
|
||||
"Duration": 15.5,
|
||||
"Result": {
|
||||
"IsHit": true,
|
||||
"InterceptionDistance": 150.5,
|
||||
"WarningResponseTime": 0.8,
|
||||
"JammingActivationTime": 1.2,
|
||||
"SystemStabilityScore": 0.85
|
||||
},
|
||||
"Events": [
|
||||
{
|
||||
"TimeStamp": 0,
|
||||
"EventType": "\u5BFC\u5F39\u53D1\u5C04",
|
||||
"Description": "\u5BFC\u5F39\u5F00\u59CB\u53D1\u5C04"
|
||||
},
|
||||
{
|
||||
"TimeStamp": 0.8,
|
||||
"EventType": "\u544A\u8B66\u89E6\u53D1",
|
||||
"Description": "\u6FC0\u5149\u544A\u8B66\u5668\u63A2\u6D4B\u5230\u5A01\u80C1"
|
||||
},
|
||||
{
|
||||
"TimeStamp": 1.2,
|
||||
"EventType": "\u5E72\u6270\u542F\u52A8",
|
||||
"Description": "\u6FC0\u5149\u5E72\u6270\u5668\u5F00\u59CB\u5DE5\u4F5C"
|
||||
},
|
||||
{
|
||||
"TimeStamp": 15.5,
|
||||
"EventType": "\u4EFF\u771F\u7ED3\u675F",
|
||||
"Description": "\u5BFC\u5F39\u547D\u4E2D\u76EE\u6807"
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -0,0 +1,34 @@
|
||||
{
|
||||
"SimulationId": "242f85e5-13c7-4a39-9e40-8e20c5e4c531",
|
||||
"Timestamp": "2024-11-01T17:36:10.414084+08:00",
|
||||
"Duration": 15.5,
|
||||
"Result": {
|
||||
"IsHit": true,
|
||||
"InterceptionDistance": 150.5,
|
||||
"WarningResponseTime": 0.8,
|
||||
"JammingActivationTime": 1.2,
|
||||
"SystemStabilityScore": 0.85
|
||||
},
|
||||
"Events": [
|
||||
{
|
||||
"TimeStamp": 0,
|
||||
"EventType": "\u5BFC\u5F39\u53D1\u5C04",
|
||||
"Description": "\u5BFC\u5F39\u5F00\u59CB\u53D1\u5C04"
|
||||
},
|
||||
{
|
||||
"TimeStamp": 0.8,
|
||||
"EventType": "\u544A\u8B66\u89E6\u53D1",
|
||||
"Description": "\u6FC0\u5149\u544A\u8B66\u5668\u63A2\u6D4B\u5230\u5A01\u80C1"
|
||||
},
|
||||
{
|
||||
"TimeStamp": 1.2,
|
||||
"EventType": "\u5E72\u6270\u542F\u52A8",
|
||||
"Description": "\u6FC0\u5149\u5E72\u6270\u5668\u5F00\u59CB\u5DE5\u4F5C"
|
||||
},
|
||||
{
|
||||
"TimeStamp": 15.5,
|
||||
"EventType": "\u4EFF\u771F\u7ED3\u675F",
|
||||
"Description": "\u5BFC\u5F39\u547D\u4E2D\u76EE\u6807"
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -0,0 +1,34 @@
|
||||
{
|
||||
"SimulationId": "58e19d0f-218e-4ac4-a40c-335dbe1037eb",
|
||||
"Timestamp": "2024-11-01T17:32:17.404421+08:00",
|
||||
"Duration": 15.5,
|
||||
"Result": {
|
||||
"IsHit": true,
|
||||
"InterceptionDistance": 150.5,
|
||||
"WarningResponseTime": 0.8,
|
||||
"JammingActivationTime": 1.2,
|
||||
"SystemStabilityScore": 0.85
|
||||
},
|
||||
"Events": [
|
||||
{
|
||||
"TimeStamp": 0,
|
||||
"EventType": "\u5BFC\u5F39\u53D1\u5C04",
|
||||
"Description": "\u5BFC\u5F39\u5F00\u59CB\u53D1\u5C04"
|
||||
},
|
||||
{
|
||||
"TimeStamp": 0.8,
|
||||
"EventType": "\u544A\u8B66\u89E6\u53D1",
|
||||
"Description": "\u6FC0\u5149\u544A\u8B66\u5668\u63A2\u6D4B\u5230\u5A01\u80C1"
|
||||
},
|
||||
{
|
||||
"TimeStamp": 1.2,
|
||||
"EventType": "\u5E72\u6270\u542F\u52A8",
|
||||
"Description": "\u6FC0\u5149\u5E72\u6270\u5668\u5F00\u59CB\u5DE5\u4F5C"
|
||||
},
|
||||
{
|
||||
"TimeStamp": 15.5,
|
||||
"EventType": "\u4EFF\u771F\u7ED3\u675F",
|
||||
"Description": "\u5BFC\u5F39\u547D\u4E2D\u76EE\u6807"
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -0,0 +1,34 @@
|
||||
{
|
||||
"SimulationId": "d30c9c30-6780-46bf-afbe-8cf6aca0b25f",
|
||||
"Timestamp": "2024-11-01T17:32:49.51351+08:00",
|
||||
"Duration": 15.5,
|
||||
"Result": {
|
||||
"IsHit": true,
|
||||
"InterceptionDistance": 150.5,
|
||||
"WarningResponseTime": 0.8,
|
||||
"JammingActivationTime": 1.2,
|
||||
"SystemStabilityScore": 0.85
|
||||
},
|
||||
"Events": [
|
||||
{
|
||||
"TimeStamp": 0,
|
||||
"EventType": "\u5BFC\u5F39\u53D1\u5C04",
|
||||
"Description": "\u5BFC\u5F39\u5F00\u59CB\u53D1\u5C04"
|
||||
},
|
||||
{
|
||||
"TimeStamp": 0.8,
|
||||
"EventType": "\u544A\u8B66\u89E6\u53D1",
|
||||
"Description": "\u6FC0\u5149\u544A\u8B66\u5668\u63A2\u6D4B\u5230\u5A01\u80C1"
|
||||
},
|
||||
{
|
||||
"TimeStamp": 1.2,
|
||||
"EventType": "\u5E72\u6270\u542F\u52A8",
|
||||
"Description": "\u6FC0\u5149\u5E72\u6270\u5668\u5F00\u59CB\u5DE5\u4F5C"
|
||||
},
|
||||
{
|
||||
"TimeStamp": 15.5,
|
||||
"EventType": "\u4EFF\u771F\u7ED3\u675F",
|
||||
"Description": "\u5BFC\u5F39\u547D\u4E2D\u76EE\u6807"
|
||||
}
|
||||
]
|
||||
}
|
||||
111
src/DataProcessing/SimulationRecord.cs
Normal file
111
src/DataProcessing/SimulationRecord.cs
Normal file
@ -0,0 +1,111 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace ActiveProtect.DataProcessing
|
||||
{
|
||||
/// <summary>
|
||||
/// 仿真数据记录类
|
||||
/// 用于记录仿真过程中的关键数据和事件
|
||||
/// </summary>
|
||||
public class SimulationRecord
|
||||
{
|
||||
/// <summary>
|
||||
/// 仿真ID
|
||||
/// </summary>
|
||||
public string? SimulationId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 仿真时间戳
|
||||
/// </summary>
|
||||
public DateTime Timestamp { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 仿真时长(秒)
|
||||
/// </summary>
|
||||
public float Duration { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 仿真结果
|
||||
/// </summary>
|
||||
public SimulationResult? Result { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 关键事件记录
|
||||
/// </summary>
|
||||
public List<SimulationEvent> Events { get; set; } = new List<SimulationEvent>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 仿真结果
|
||||
/// 记录仿真的最终评估结果
|
||||
/// </summary>
|
||||
public class SimulationResult
|
||||
{
|
||||
/// <summary>
|
||||
/// 是否命中目标
|
||||
/// </summary>
|
||||
public bool IsHit { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 拦截距离(米)
|
||||
/// </summary>
|
||||
public float InterceptionDistance { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 告警响应时间(秒)
|
||||
/// </summary>
|
||||
public float WarningResponseTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 干扰启动时间(秒)
|
||||
/// </summary>
|
||||
public float JammingActivationTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 系统稳定性评分 [0,1]
|
||||
/// </summary>
|
||||
public float SystemStabilityScore { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 仿真事件记录
|
||||
/// 记录仿真过程中的关键事件
|
||||
/// </summary>
|
||||
public class SimulationEvent
|
||||
{
|
||||
/// <summary>
|
||||
/// 事件发生时间(相对于仿真开始的时间,单位:秒)
|
||||
/// </summary>
|
||||
public float TimeStamp { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 事件类型
|
||||
/// </summary>
|
||||
public string? EventType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 事件描述
|
||||
/// </summary>
|
||||
public string? Description { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 事件相关的数据
|
||||
/// </summary>
|
||||
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
|
||||
public Dictionary<string, object>? EventData { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 事件类型常量
|
||||
/// </summary>
|
||||
public static class EventTypes
|
||||
{
|
||||
public const string MissileLaunch = "导弹发射";
|
||||
public const string WarningTrigger = "告警触发";
|
||||
public const string JammingActivation = "干扰启动";
|
||||
public const string TargetHit = "命中目标";
|
||||
public const string MissileMiss = "未命中目标";
|
||||
public const string SimulationEnd = "仿真结束";
|
||||
}
|
||||
}
|
||||
103
src/DataProcessing/SimulationRecordExample.cs
Normal file
103
src/DataProcessing/SimulationRecordExample.cs
Normal file
@ -0,0 +1,103 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace ActiveProtect.DataProcessing
|
||||
{
|
||||
/// <summary>
|
||||
/// 仿真数据记录示例类
|
||||
/// 展示如何记录和读取仿真数据
|
||||
/// </summary>
|
||||
public class SimulationRecordExample
|
||||
{
|
||||
/// <summary>
|
||||
/// 运行数据记录示例
|
||||
/// </summary>
|
||||
public static void RunExample()
|
||||
{
|
||||
Console.WriteLine("\n=== 仿真数据记录示例 ===");
|
||||
|
||||
// 创建记录管理器
|
||||
var recordManager = new SimulationRecordManager("SimulationRecords");
|
||||
|
||||
// 创建示例记录
|
||||
var record = new SimulationRecord
|
||||
{
|
||||
SimulationId = Guid.NewGuid().ToString(),
|
||||
Timestamp = DateTime.Now,
|
||||
Duration = 15.5f,
|
||||
Result = new SimulationResult
|
||||
{
|
||||
IsHit = true,
|
||||
InterceptionDistance = 150.5f,
|
||||
WarningResponseTime = 0.8f,
|
||||
JammingActivationTime = 1.2f,
|
||||
SystemStabilityScore = 0.85f
|
||||
},
|
||||
Events = new List<SimulationEvent>
|
||||
{
|
||||
new SimulationEvent
|
||||
{
|
||||
TimeStamp = 0.0f,
|
||||
EventType = "导弹发射",
|
||||
Description = "导弹开始发射"
|
||||
},
|
||||
new SimulationEvent
|
||||
{
|
||||
TimeStamp = 0.8f,
|
||||
EventType = "告警触发",
|
||||
Description = "激光告警器探测到威胁"
|
||||
},
|
||||
new SimulationEvent
|
||||
{
|
||||
TimeStamp = 1.2f,
|
||||
EventType = "干扰启动",
|
||||
Description = "激光干扰器开始工作"
|
||||
},
|
||||
new SimulationEvent
|
||||
{
|
||||
TimeStamp = 15.5f,
|
||||
EventType = "仿真结束",
|
||||
Description = "导弹命中目标"
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// 保存记录
|
||||
Console.WriteLine("保存仿真记录...");
|
||||
recordManager.SaveRecord(record);
|
||||
|
||||
// 读取记录
|
||||
Console.WriteLine("读取今日仿真记录...");
|
||||
var records = recordManager.LoadRecords(DateTime.Today);
|
||||
|
||||
// 显示记录内容
|
||||
foreach (var loadedRecord in records)
|
||||
{
|
||||
Console.WriteLine($"\n仿真ID: {loadedRecord.SimulationId}");
|
||||
Console.WriteLine($"时间戳: {loadedRecord.Timestamp}");
|
||||
Console.WriteLine($"仿真时长: {loadedRecord.Duration}秒");
|
||||
if (loadedRecord.Result != null)
|
||||
{
|
||||
Console.WriteLine($"命中结果: {(loadedRecord.Result.IsHit ? "命中" : "未命中")}");
|
||||
Console.WriteLine($"拦截距离: {loadedRecord.Result.InterceptionDistance}米");
|
||||
Console.WriteLine($"告警响应时间: {loadedRecord.Result.WarningResponseTime}秒");
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("仿真结果数据不可用");
|
||||
}
|
||||
if (loadedRecord.Result != null)
|
||||
{
|
||||
Console.WriteLine($"干扰启动时间: {loadedRecord.Result.JammingActivationTime}秒");
|
||||
Console.WriteLine($"系统稳定性评分: {loadedRecord.Result.SystemStabilityScore:F2}");
|
||||
}
|
||||
|
||||
Console.WriteLine("\n关键事件:");
|
||||
foreach (var evt in loadedRecord.Events)
|
||||
{
|
||||
Console.WriteLine($"[{evt.TimeStamp:F2}s] {evt.EventType}: {evt.Description}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
66
src/DataProcessing/SimulationRecordManager.cs
Normal file
66
src/DataProcessing/SimulationRecordManager.cs
Normal file
@ -0,0 +1,66 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text.Json;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace ActiveProtect.DataProcessing
|
||||
{
|
||||
/// <summary>
|
||||
/// 仿真记录管理器
|
||||
/// 使用JSON文件存储仿真数据
|
||||
/// </summary>
|
||||
public class SimulationRecordManager
|
||||
{
|
||||
private readonly string baseDirectory;
|
||||
|
||||
public SimulationRecordManager(string baseDirectory = "SimulationRecords")
|
||||
{
|
||||
this.baseDirectory = baseDirectory;
|
||||
Directory.CreateDirectory(baseDirectory);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 保存仿真记录
|
||||
/// </summary>
|
||||
public void SaveRecord(SimulationRecord record)
|
||||
{
|
||||
// 按日期创建子目录
|
||||
string dateDir = Path.Combine(baseDirectory, record.Timestamp.ToString("yyyy-MM-dd"));
|
||||
Directory.CreateDirectory(dateDir);
|
||||
|
||||
// 生成文件名
|
||||
string fileName = $"{record.SimulationId}_{record.Timestamp:HHmmss}.json";
|
||||
string filePath = Path.Combine(dateDir, fileName);
|
||||
|
||||
// 序列化并保存
|
||||
var options = new JsonSerializerOptions { WriteIndented = true };
|
||||
string jsonString = JsonSerializer.Serialize(record, options);
|
||||
File.WriteAllText(filePath, jsonString);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 读取指定日期的所有记录
|
||||
/// </summary>
|
||||
public List<SimulationRecord> LoadRecords(DateTime date)
|
||||
{
|
||||
string dateDir = Path.Combine(baseDirectory, date.ToString("yyyy-MM-dd"));
|
||||
if (!Directory.Exists(dateDir))
|
||||
{
|
||||
return new List<SimulationRecord>();
|
||||
}
|
||||
|
||||
var records = new List<SimulationRecord>();
|
||||
foreach (string file in Directory.GetFiles(dateDir, "*.json"))
|
||||
{
|
||||
string jsonString = File.ReadAllText(file);
|
||||
var record = JsonSerializer.Deserialize<SimulationRecord>(jsonString);
|
||||
if (record is not null)
|
||||
{
|
||||
records.Add(record);
|
||||
}
|
||||
}
|
||||
|
||||
return records;
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user