如何将单天3小时槽的params.arrival_rate配置扩展支持N天场景
最优实现方案
这里提供两种适配不同需求的实现方案,均比原有多层if-else的写法扩展性更强、维护成本更低:
场景1:每日3小时槽的到达率规律和现有单日配置一致,循环复用
如果N天内的到达率按单日规则循环,只需要两步即可实现:
- 对总仿真时间取单日模,把任意天数的
sim_time转换为当日分钟数 - 替换原有多层判断为查表法,通过索引直接定位取值
// 单日8个3小时槽的到达率配置,索引0-7依次对应00:00-03:00到21:00-24:00的时间段 static const double arrival_rate_config[] = {10, 9, 10.5, 12, 11.5, 11, 10.5, 9}; int day_minute = sim_time % 1440; // 1440分钟=1天,取模得到当日的分钟数 int slot_index = day_minute / 180; // 180分钟=3小时,计算属于当日的第几个时间槽 *params.arrival_rate* = arrival_rate_config[slot_index];
场景2:需要支持N天内每个3小时槽独立配置不同的到达率
如果不同天的同时间段到达率存在差异,可以直接把所有时间槽的配置按时间顺序存到数组中,通过总仿真时间直接计算索引取值:
// 示例为支持7天共56个3小时槽的自定义配置,按时间顺序依次填充每个槽的到达率即可 static const double arrival_rate_config[] = { // 第1天的8个槽配置 10, 9, 10.5, 12, 11.5, 11, 10.5, 9, // 第2天的8个槽配置,可自定义为不同值 8, 7, 11.5, 13, 12.5, 12, 11.5, 8, // 剩余N天的配置依次向后填充即可 }; int total_slot = sizeof(arrival_rate_config) / sizeof(arrival_rate_config[0]); int slot_index = sim_time / 180; // 索引在配置范围内取对应值,超出配置范围则使用默认值9 *params.arrival_rate* = slot_index < total_slot ? arrival_rate_config[slot_index] : 9;
方案优势
- 性能为O(1)级别,不管仿真天数N多大都不会增加计算耗时,远优于多层
if-else的顺序判断 - 配置和逻辑完全解耦,修改到达率、增加仿真天数都只需要调整配置数组,不需要修改逻辑代码
- 可读性和可维护性更强,所有时间槽的配置集中展示,不需要翻找多层分支判断的逻辑
内容的提问来源于stack exchange,提问作者v4lerO
相关产品推荐
相关产品推荐

