电梯交通量仿真分析5
5. 测试策略:验证方法、测试用例
5.1 测试目标与原则
5.1.1 测试目标
- 验证仿真结果与真实电梯数据的一致性
- 确保OD矩阵估计算法的准确性和效率
- 验证不同控制策略实现的正确性
- 保证系统在极端条件下的稳定性和可靠性
- 满足PDF中描述的"real-time elevator group control requirements"
5.1.2 测试原则
- 基于证据的验证:测试用例应基于PDF中描述的实验数据和理论结果
- 多方法交叉验证:使用多种验证方法相互印证
- 场景覆盖全面:涵盖PDF中描述的各种交通模式和建筑类型
- 可重复性:所有测试应可重复执行,结果可量化比较
- 性能与准确性平衡:在保证精度的前提下优化性能
5.2 验证方法
5.2.1 与真实电梯数据对比
验证方法:
- 收集真实建筑中的电梯运行数据(基于PDF中描述的"EMS记录数据")
- 将仿真结果与真实数据进行统计对比
- 使用Kolmogorov-Smirnov检验比较等待时间分布
- 计算关键指标的相对误差(如平均等待时间、5分钟输送能力)
实现细节:
/**
* 真实数据验证器,实现PDF中描述的验证方法
* "the numerical experiments were run with laptop PCs and not with a real elevator group control computer"
*/
public class RealDataValidator {
/**
* 验证仿真结果与真实数据的一致性
*/
public ValidationResult validateAgainstRealData(
SimulationResult simulationResult,
RealElevatorData realData
) {
List<ValidationIssue> issues = new ArrayList<>();
// 1. 等待时间分布对比
DistributionComparison waitingTimeComparison = compareDistributions(
simulationResult.getWaitingTimeMetrics().getOverall().getPercentiles(),
realData.getWaitingTimePercentiles()
);
if (!waitingTimeComparison.isAcceptable()) {
issues.add(new ValidationIssue(
"WAITING_TIME_MISMATCH",
String.format("等待时间分布差异: KS统计量=%.4f, p值=%.4f",
waitingTimeComparison.getKsStatistic(),
waitingTimeComparison.getPValue())
));
}
// 2. 5分钟输送能力对比
double hcError = Math.abs(
simulationResult.getSystemPerformance().getHandlingCapacity() -
realData.getHandlingCapacity()
);
if (hcError > 2.0) { // 允许2%的误差
issues.add(new ValidationIssue(
"HC_MISMATCH",
String.format("5分钟输送能力差异: 仿真=%.1f%%, 真实=%.1f%%, 差异=%.1f%%",
simulationResult.getSystemPerformance().getHandlingCapacity(),
realData.getHandlingCapacity(),
hcError)
));
}
// 3. OD矩阵一致性验证
ODMetricMatrix simulationOD = simulationResult.getOdMatrix();
ODMetricMatrix realOD = realData.getOdMatrix();
double odError = calculateODMatrixError(simulationOD, realOD);
if (odError > 0.15) { // 允许15%的误差
issues.add(new ValidationIssue(
"OD_MATRIX_MISMATCH",
String.format("OD矩阵差异: 误差率=%.1f%%", odError * 100)
));
}
return new ValidationResult(issues.isEmpty(), issues);
}
/**
* 比较两个分布的KS检验
*/
private DistributionComparison compareDistributions(
double[] simulatedPercentiles,
double[] realPercentiles
) {
// 执行Kolmogorov-Smirnov检验
KolmogorovSmirnovTest ksTest = new KolmogorovSmirnovTest();
double pValue = ksTest.kolmogorovSmirnovTest(
convertToSample(simulatedPercentiles),
convertToSample(realPercentiles)
);
double ksStatistic = ksTest.kolmogorovSmirnovStatistic(
convertToSample(simulatedPercentiles),
convertToSample(realPercentiles)
);
// 判断是否可接受(95%置信水平)
boolean acceptable = pValue > 0.05;
return new DistributionComparison(ksStatistic, pValue, acceptable);
}
// 其他辅助方法...
}关键验证指标:
- 等待时间分布的KS检验(p值>0.05表示分布无显著差异)
- 5分钟输送能力的相对误差(<2%)
- OD矩阵的误差率(<15%)
- 电梯利用率的匹配度
5.2.2 与理论计算结果对比
验证方法:
- 针对简化场景,使用PDF中描述的理论公式计算预期结果
- 比较仿真结果与理论计算结果
- 验证电梯运行时间模型的准确性
- 验证批次到达模型与理论分布的匹配度
实现细节:
/**
* 理论验证器,实现PDF中描述的理论验证方法
*/
public class TheoreticalValidator {
/**
* 验证仿真结果与理论计算的一致性
*/
public ValidationResult validateAgainstTheory(
SimulationResult simulationResult,
TheoreticalModel theoreticalModel
) {
List<ValidationIssue> issues = new ArrayList<>();
// 1. 验证运行时间模型
validateTravelTimeModel(simulationResult, theoreticalModel, issues);
// 2. 验证停站时间模型
validateStopTimeModel(simulationResult, theoreticalModel, issues);
// 3. 验证批次到达特性
validateBatchArrivalModel(simulationResult, theoreticalModel, issues);
return new ValidationResult(issues.isEmpty(), issues);
}
/**
* 验证运行时间模型
* 实现PDF中描述的"运行时间 = √(2×距离/加速度) + (距离-加速段-减速段)/额定速度 + √(2×距离/减速度)"
*/
private void validateTravelTimeModel(
SimulationResult result,
TheoreticalModel model,
List<ValidationIssue> issues
) {
// 对于每个楼层对,计算理论运行时间
for (int from = 1; from <= model.getTotalFloors(); from++) {
for (int to = from + 1; to <= model.getTotalFloors(); to++) {
double theoreticalTime = calculateTheoreticalTravelTime(from, to, model);
double simulatedTime = result.getAverageTravelTime(from, to);
double error = Math.abs((simulatedTime - theoreticalTime) / theoreticalTime);
if (error > 0.05) { // 允许5%的误差
issues.add(new ValidationIssue(
"TRAVEL_TIME_MISMATCH",
String.format("运行时间差异(%d->%d): 理论=%.2f秒, 仿真=%.2f秒, 误差=%.1f%%",
from, to, theoreticalTime, simulatedTime, error * 100)
));
}
}
}
}
/**
* 计算理论运行时间
*/
private double calculateTheoreticalTravelTime(
int fromFloor,
int toFloor,
TheoreticalModel model
) {
double distance = Math.abs(toFloor - fromFloor) * model.getFloorHeight();
double ratedSpeed = model.getElevatorRatedSpeed();
double acceleration = model.getElevatorAcceleration();
double deceleration = model.getElevatorDeceleration();
// 计算加速段距离
double accelDistance = (ratedSpeed * ratedSpeed) / (2 * acceleration);
// 计算减速段距离
double decelDistance = (ratedSpeed * ratedSpeed) / (2 * deceleration);
// 如果距离不足以达到额定速度
if (distance <= accelDistance + decelDistance) {
// 三段式运行: 加速-减速
double t1 = Math.sqrt(distance / acceleration);
return 2 * t1;
} else {
// 三段式运行: 加速-匀速-减速
double tAccel = ratedSpeed / acceleration;
double tDecel = ratedSpeed / deceleration;
double tCruise = (distance - accelDistance - decelDistance) / ratedSpeed;
return tAccel + tCruise + tDecel;
}
}
// 其他验证方法...
}关键验证场景:
- 单电梯、单乘客的简单场景(验证基础物理模型)
- 固定批次大小的到达模式(验证批次模型)
- 特定交通模式(如纯上行交通)的理论解验证
5.2.3 不同算法结果一致性检查
验证方法:
- 对同一场景运行不同OD矩阵估计方法(LP、BILS、CP)
- 比较不同方法的结果一致性
- 验证流量守恒原则
- 检查算法在时限内的执行情况
实现细节:
/**
* 算法一致性验证器,实现PDF中描述的多算法一致性检查
* "The results of Publications[III] and[V] suggest that the fastest deterministic CP algorithm
* is about as fast as the fastest BILS algorithm and even faster for very complex problem instances."
*/
public class AlgorithmConsistencyValidator {
private static final double MAX_PERCENTILE_DIFF = 0.10; // 10%的百分位差异阈值
private static final double MAX_HAUSDORFF_DISTANCE = 0.15; // OD矩阵最大豪斯多夫距离
/**
* 验证不同算法结果的一致性
*/
public ValidationResult validateAlgorithmConsistency(
List<SimulationResult> results,
String[] algorithmNames
) {
List<ValidationIssue> issues = new ArrayList<>();
// 1. 检查等待时间分布一致性
checkWaitingTimeConsistency(results, algorithmNames, issues);
// 2. 检查OD矩阵一致性
checkODMatrixConsistency(results, algorithmNames, issues);
// 3. 检查算法执行时间是否满足实时要求
checkExecutionTime(results, algorithmNames, issues);
return new ValidationResult(issues.isEmpty(), issues);
}
/**
* 检查等待时间分布一致性
*/
private void checkWaitingTimeConsistency(
List<SimulationResult> results,
String[] algorithmNames,
List<ValidationIssue> issues
) {
// 获取所有算法的等待时间百分位数
double[][] waitingTimePercentiles = new double[results.size()][10];
for (int i = 0; i < results.size(); i++) {
WaitingTimeMetrics metrics = results.get(i).getWaitingTimeMetrics();
System.arraycopy(
metrics.getOverall().getPercentiles(),
0,
waitingTimePercentiles[i],
0,
10
);
}
// 比较每对算法
for (int i = 0; i < results.size(); i++) {
for (int j = i + 1; j < results.size(); j++) {
double maxPercentileDiff = 0.0;
for (int k = 0; k < 10; k++) {
double diff = Math.abs(
(waitingTimePercentiles[i][k] - waitingTimePercentiles[j][k]) /
Math.max(waitingTimePercentiles[i][k], 1.0)
);
maxPercentileDiff = Math.max(maxPercentileDiff, diff);
}
if (maxPercentileDiff > MAX_PERCENTILE_DIFF) {
issues.add(new ValidationIssue(
"WAITING_TIME_INCONSISTENCY",
String.format("等待时间分布不一致(%s vs %s): 最大百分位差异=%.1f%%",
algorithmNames[i], algorithmNames[j], maxPercentileDiff * 100)
));
}
}
}
}
/**
* 检查OD矩阵一致性
*/
private void checkODMatrixConsistency(
List<SimulationResult> results,
String[] algorithmNames,
List<ValidationIssue> issues
) {
// 计算OD矩阵间的豪斯多夫距离
for (int i = 0; i < results.size(); i++) {
for (int j = i + 1; j < results.size(); j++) {
double distance = calculateHausdorffDistance(
results.get(i).getOdMatrix(),
results.get(j).getOdMatrix()
);
if (distance > MAX_HAUSDORFF_DISTANCE) {
issues.add(new ValidationIssue(
"OD_MATRIX_INCONSISTENCY",
String.format("OD矩阵不一致(%s vs %s): 豪斯多夫距离=%.4f",
algorithmNames[i], algorithmNames[j], distance)
));
}
}
}
}
/**
* 计算两个OD矩阵间的豪斯多夫距离
*/
private double calculateHausdorffDistance(
ODMetricMatrix matrix1,
ODMetricMatrix matrix2
) {
// 归一化OD矩阵
ODMetricMatrix normalized1 = normalizeODMatrix(matrix1);
ODMetricMatrix normalized2 = normalizeODMatrix(matrix2);
// 计算豪斯多夫距离
double maxDistance = 0.0;
for (int origin = 1; origin <= normalized1.getBuildingFloors(); origin++) {
for (int dest = 1; dest <= normalized1.getBuildingFloors(); dest++) {
if (origin == dest) continue;
double p1 = normalized1.getProbability(origin, dest);
double p2 = normalized2.getProbability(origin, dest);
double distance = Math.abs(p1 - p2);
maxDistance = Math.max(maxDistance, distance);
}
}
return maxDistance;
}
// 其他辅助方法...
}关键验证点:
- 不同OD估计方法(LP、BILS、CP)结果的一致性
- 流量守恒原则验证(进入某楼层的乘客数 = 离开该楼层的乘客数)
- 算法执行时间是否满足实时要求(参考PDF中"real-time elevator group control requirements")
- 复杂问题实例的解质量比较
5.2.4 与PDF研究结果对比
验证方法:
- 实现PDF中描述的疏散实验场景
- 复现PDF中的电梯交通模式
- 比较仿真结果与PDF中报告的结果
- 验证"selfish vs cooperative"行为对疏散时间的影响
实现细节:
/**
* PDF研究验证器,实现PDF中描述的特定验证场景
*/
public class PdfResearchValidator {
/**
* 验证疏散实验场景
* 实现PDF中描述的"experiments were organized in a corridor with a lobby at one end and with two exits"
*/
public ValidationResult validateEvacuationScenario() {
// 1. 创建疏散实验场景
Building evacuationBuilding = createEvacuationExperimentBuilding();
// 2. 配置两种行为模式
SimulationConfig selfishConfig = createBehaviorConfig(BehaviorType.SELFISH);
SimulationConfig cooperativeConfig = createBehaviorConfig(BehaviorType.COOPERATIVE);
// 3. 运行仿真
SimulationResult selfishResult = simulationService.runSimulation(
evacuationBuilding,
selfishConfig
);
SimulationResult cooperativeResult = simulationService.runSimulation(
evacuationBuilding,
cooperativeConfig
);
// 4. 验证结果
return validateEvacuationResults(selfishResult, cooperativeResult);
}
/**
* 验证疏散结果是否符合PDF研究
* "The results suggest that the total evacuation time was significantly shorter...
* when the participants were instructed to act selfishly."
*/
private ValidationResult validateEvacuationResults(
SimulationResult selfishResult,
SimulationResult cooperativeResult
) {
List<ValidationIssue> issues = new ArrayList<>();
// 比较总疏散时间
double selfishTime = selfishResult.getEvacuationTime();
double cooperativeTime = cooperativeResult.getEvacuationTime();
double timeDifference = (cooperativeTime - selfishTime) / selfishTime;
// PDF研究表明自私行为使疏散时间显著缩短
if (timeDifference < 0.05) {
issues.add(new ValidationIssue(
"EVACUATION_TIME_MISMATCH",
String.format("疏散时间差异不符合PDF研究: 自私=%.1f秒, 合作=%.1f秒, 差异=%.1f%%",
selfishTime, cooperativeTime, timeDifference * 100)
));
}
// 执行统计显著性检验(符号检验)
SignTest signTest = new SignTest();
double pValue = signTest.signTest(
getEvacuationTimes(selfishResult),
getEvacuationTimes(cooperativeResult),
AlternativeHypothesis.GREATER_THAN
);
// PDF使用符号检验(Siegel 1956)
if (pValue > 0.05) {
issues.add(new ValidationIssue(
"STATISTICAL_SIGNIFICANCE",
String.format("疏散时间差异不具有统计显著性: p值=%.4f", pValue)
));
}
return new ValidationResult(issues.isEmpty(), issues);
}
/**
* 验证OD矩阵估计算法性能
* "the simulations presented in Publication[III] show that most of the problems
* occurring in reality are relatively simple and can be solved... within a reasonable time"
*/
public ValidationResult validateODMatrixAlgorithms() {
List<ValidationIssue> issues = new ArrayList<>();
// 生成不同复杂度的问题实例
List<ODMatrixProblem> problemInstances = generateProblemInstances();
// 测试每种算法
Map<String, AlgorithmPerformance> performances = new HashMap<>();
for (String algorithm : Arrays.asList("LP", "BILS", "CP")) {
AlgorithmPerformance perf = testAlgorithmPerformance(algorithm, problemInstances);
performances.put(algorithm, perf);
// 检查是否满足实时要求
if (perf.getAvgExecutionTime() > 500.0) { // 500ms
issues.add(new ValidationIssue(
"ALGORITHM_PERFORMANCE",
String.format("%s算法性能不符合实时要求: 平均执行时间=%.1fms",
algorithm, perf.getAvgExecutionTime())
));
}
}
// 比较BILS和CP算法性能
AlgorithmPerformance bilsPerf = performances.get("BILS");
AlgorithmPerformance cpPerf = performances.get("CP");
if (bilsPerf.getAvgExecutionTime() < 0.8 * cpPerf.getAvgExecutionTime()) {
issues.add(new ValidationIssue(
"ALGORITHM_COMPARISON",
String.format("BILS与CP算法性能比较不符合PDF研究: BILS=%.1fms, CP=%.1fms",
bilsPerf.getAvgExecutionTime(), cpPerf.getAvgExecutionTime())
));
}
return new ValidationResult(issues.isEmpty(), issues);
}
// 其他辅助方法...
}关键验证场景:
- PDF中描述的疏散实验(走廊一端有大厅,另一端有两个出口)
- "自私vs合作"行为对疏散时间的影响验证
- OD矩阵估计算法性能验证(执行时间、解质量)
- 批次到达模型与PDF中描述的实验数据对比
5.3 测试用例设计
5.3.1 基础功能测试
测试用例 5.3.1.1: 建筑配置验证
- 场景: 配置一个30层办公楼,包含大厅、车库和办公区域
- 输入:
- 建筑类型: OFFICE
- 总楼层: 30
- 层高: 4.0米
- 楼层配置: 1层(大厅), 2-3层(车库), 4-30层(办公)
- 人口分布: 早高峰8:00-9:00, 进楼交通比例80%
- 预期结果:
- 建筑对象正确创建
- 楼层用途正确分配
- 交通模式比例符合办公楼特征
- 批次到达模型符合PDF中描述的早高峰特性
测试用例 5.3.1.2: 电梯组配置验证
- 场景: 配置一个目的选层系统,包含4台电梯
- 输入:
- 控制类型: DESTINATION_CONTROL
- 电梯参数: 载重16人, 速度3.0m/s, 加速度1.0m/s²
- 门宽: 1.0米
- 基准层: 1
- 服务楼层: 1-30
- 预期结果:
- 电梯组正确创建
- 电梯物理参数计算正确(如开门时间)
- 服务楼层配置正确
- 目的选层系统特殊参数正确设置
5.3.2 算法正确性测试
测试用例 5.3.2.1: OD矩阵估计一致性测试
- 场景: 使用LP、BILS、CP三种方法估计同一电梯行程数据的OD矩阵
- 输入:
- 电梯行程数据(100次行程)
- 建筑信息(10层)
- 估计方法: LP, BILS(with randomization), CP
- 预期结果:
- 三种方法都返回有效的OD矩阵
- 所有OD矩阵满足流量守恒原则
- 不同方法的等待时间分布差异<10%
- BILS和CP算法执行时间<500ms(符合实时要求)
- 随机化BILS产生多个解,且解质量高于确定性解
测试用例 5.3.2.2: 目的选层系统聚类效果测试
- 场景: 测试目的选层系统将目的楼层相近的乘客分配到同一电梯的效果
- 输入:
- 建筑: 20层办公楼
- 电梯组: 3台目的选层电梯
- 乘客流量: 批次到达,目的楼层集中在5-10层和15-20层
- 预期结果:
- 目的地相近的乘客被分配到同一电梯
- 平均停站次数比传统系统减少20%
- 5分钟输送能力提高15%
- 乘客流动时间计算考虑门宽影响
5.3.3 边界条件测试
测试用例 5.3.3.1: 极端流量测试
- 场景: 模拟早高峰极端流量情况(所有乘客同时到达)
- 输入:
- 建筑: 50层混合用途建筑
- 电梯组: 8台群控电梯
- 乘客流量: 1000名乘客同时在1层大厅到达
- 批次大小: 10人/批次
- 预期结果:
- 系统能处理大流量而不崩溃
- 电梯分配算法能有效分流乘客
- 停站时间计算考虑拥挤系数
- 仿真在合理时间内完成(参考PDF中"most of the problems occurring in reality are relatively simple")
测试用例 5.3.3.2: 电梯故障测试
- 场景: 模拟电梯组中一台电梯故障
- 输入:
- 建筑: 30层办公楼
- 电梯组: 4台群控电梯
- 故障设置: 运行中第2台电梯故障
- 乘客流量: 正常早高峰流量
- 预期结果:
- 系统检测到故障并重新分配任务
- 剩余电梯调整服务策略
- 等待时间增加但系统保持稳定
- 故障处理机制符合PDF中描述的可靠性要求
5.3.4 性能测试
测试用例 5.3.4.1: 实时性能测试
- 场景: 测试系统在大规模仿真中的性能
- 输入:
- 建筑: 100层建筑
- 电梯组: 10组电梯(共20台)
- 仿真时长: 1天(24小时)
- 时间切片: 5秒
- 预期结果:
- 1秒模拟时间 ≤ 100ms真实时间
- 内存使用稳定,无OOM异常
- 大规模仿真在5分钟内完成
- 符合PDF中"real-time elevator group control requirements"
测试用例 5.3.4.2: API性能测试
- 场景: 测试关键API的性能和稳定性
- 测试:
/api/v1/simulate: 并发请求测试(100用户)/api/v1/simulations/{id}/timeline: 大数据量响应测试/api/v1/simulations/{id}/results: 复杂查询性能测试/api/v1/od-matrix/estimate: 高频调用测试
- 预期结果:
- API响应时间符合SLA要求
- 系统能处理高并发请求
- 数据压缩有效减少传输量
- 缓存机制有效提高响应速度
5.3.5 一致性测试
测试用例 5.3.5.1: 多次运行一致性测试
- 场景: 多次运行相同配置的仿真
- 输入:
- 固定随机种子
- 相同建筑和电梯配置
- 相同仿真参数
- 预期结果:
- 多次运行结果完全一致(确定性算法)
- 随机化算法结果在可接受范围内波动
- 关键指标差异<1%
测试用例 5.3.5.2: 不同控制策略对比测试
- 场景: 比较单控、并联、群控、目的选层四种策略
- 输入:
- 相同建筑配置
- 相同乘客流量
- 四种不同控制策略
- 预期结果:
- 目的选层系统等待时间比群控系统减少20-30%
- 群控系统比并联系统效率高
- 并联系统比单控系统效率高
- 结果符合PDF中描述的预期性能差异
5.4 测试数据集
5.4.1 基于PDF的案例研究
数据集 5.4.1.1: 办公楼早高峰场景
- 来源: PDF中描述的办公楼交通模式
- 内容:
- 30层办公楼,层高4米
- 早高峰(8:00-9:00)进楼交通为主
- 批次到达特性: 批次概率0.7, 批次大小分布[1:0.3, 2:0.4, 3:0.2, 4:0.1]
- 电梯配置: 6台群控电梯,载重16人,速度3.0m/s
- 用途: 验证系统在典型办公场景下的准确性
数据集 5.4.1.2: 商场内部交通场景
- 来源: PDF中描述的商场交通特性
- 内容:
- 10层商场,层高5米
- 交通模式: 楼层间交通比例高(60%)
- 批次到达特性: 批次概率0.5, 批次大小分布[1:0.2, 2:0.3, 3:0.3, 4:0.2]
- 电梯配置: 4台目的选层电梯
- 用途: 验证系统在商场场景下的准确性,特别是楼层间交通处理
5.4.2 标准测试场景
数据集 5.4.2.1: 标准测试建筑集
- 内容:
- 小型建筑(5-10层): 用于单元测试和快速验证
- 中型建筑(11-30层): 用于功能测试和算法验证
- 大型建筑(31-100层): 用于性能测试和边界条件测试
- 用途: 系统化测试不同规模建筑的处理能力
数据集 5.4.2.2: 标准交通模式集
- 内容:
- 早高峰模式: 上行主导交通
- 晚高峰模式: 下行主导交通
- 午餐高峰模式: 双向交通
- 闲时模式: 低流量随机交通
- 用途: 验证系统在不同交通模式下的适应性
5.4.3 极端情况测试数据
数据集 5.4.3.1: 极端流量场景
- 内容:
- 超高密度流量(1000+乘客同时到达)
- 异常批次大小(最大批次50人)
- 非均匀楼层分布(90%流量集中在某几层)
- 用途: 测试系统在极端条件下的稳定性和鲁棒性
数据集 5.4.3.2: 疏散场景
- 内容:
- 基于PDF疏散实验的场景配置
- 两种出口选择行为(自私vs合作)
- 不同建筑几何结构
- 用途: 验证疏散模拟的准确性,特别是与PDF研究结果对比