R语言巴士故障模拟代码修复求助:解决多类逻辑错误
修正R语言巴士故障模拟代码及问题解决
场景与需求
- 共100辆巴士(bus_1至bus_100)
- 首日派出前5辆巴士(bus_1至bus_5)
- 首日每辆巴士故障概率为0.5,故障后永久停用
- 未故障巴士次日继续派出,故障概率每日递减0.01(最低至0)
- 故障巴士由下一辆未启用巴士替换,每日保持5辆运营(末期数量递减至0)
- 最终生成含11列的数据帧:
day_number(天数)、x1-x5(当日运营巴士编号)、p1-p5(对应巴士当日故障概率)
原代码存在的问题
- 巴士排序错误,首日应为bus_1至bus_5
- 已故障巴士“复活”重复出现
- 同一行出现多辆相同巴士
- 概率值超出0-0.5的合理范围
修正后的代码
bus_count <- 100 # 标记巴士是否已故障(TRUE=已故障,不可再用) bus_broken <- rep(FALSE, bus_count) # 初始化所有巴士的故障概率 bus_prob <- rep(0.5, bus_count) # 首日运营巴士固定为1-5 bus_active <- 1:5 # 提前定义结果数据框列类型,避免类型混乱 results <- data.frame( day_number = integer(), x1 = character(), x2 = character(), x3 = character(), x4 = character(), x5 = character(), p1 = numeric(), p2 = numeric(), p3 = numeric(), p4 = numeric(), p5 = numeric(), stringsAsFactors = FALSE ) day_number <- 0 while(length(bus_active) > 0) { day_number <- day_number + 1 # 获取当日运营巴士的故障概率(先取当日初始概率,再更新) current_probs <- bus_prob[bus_active] # 判断当日故障的巴士 breakdown <- runif(length(bus_active)) < current_probs # 标记故障巴士为永久损坏 broken_buses <- bus_active[breakdown] bus_broken[broken_buses] <- TRUE # 更新未故障巴士的概率:递减0.01,最低至0 bus_prob[bus_active[!breakdown]] <- pmax(bus_prob[bus_active[!breakdown]] - 0.01, 0) # 从未启用且未故障的巴士中补充需要替换的数量 need_replace <- sum(breakdown) next_bus <- integer(0) if(need_replace > 0) { available_buses <- which(!bus_broken & !(1:bus_count %in% bus_active)) next_bus <- head(available_buses, need_replace) bus_prob[next_bus] <- 0.5 } # 更新次日运营巴士:未故障的 + 新补充的,最多保持5辆 bus_active <- c(bus_active[!breakdown], next_bus) bus_active <- bus_active[1:min(5, length(bus_active))] # 整理当日记录,不足5辆的位置补NA day_x <- paste0("bus_", bus_active) if(length(day_x) < 5) day_x <- c(day_x, rep(NA, 5 - length(day_x))) day_p <- current_probs if(length(day_p) < 5) day_p <- c(day_p, rep(NA, 5 - length(day_p))) # 添加到结果数据框 results <- rbind.data.frame(results, data.frame( day_number = day_number, x1 = day_x[1], x2 = day_x[2], x3 = day_x[3], x4 = day_x[4], x5 = day_x[5], p1 = day_p[1], p2 = day_p[2], p3 = day_p[3], p4 = day_p[4], p5 = day_p[5], stringsAsFactors = FALSE )) } print(results)
问题修复说明
- 巴士排序错误:首日直接固定
bus_active <- 1:5,补充新巴士时从可用巴士中按编号取最小编号的,同时保留未故障巴士的原有顺序,确保每日运营巴士编号符合要求。 - 已故障巴士复活:新增
bus_broken数组标记已故障巴士,补充新巴士时仅从未故障且未启用的集合中选取,彻底杜绝故障巴士再次被启用。 - 同一行出现重复巴士:
bus_active仅包含未故障的现有巴士和新补充的可用巴士,补充逻辑严格筛选非重复的可用巴士,避免重复。 - 概率值超出合理范围:
- 判断故障时使用当日初始概率,之后再更新未故障巴士的概率,避免逻辑顺序错误导致的概率异常
- 用
pmax(..., 0)确保概率最低为0,新补充巴士概率固定为0.5,保证所有概率值在0-0.5区间内
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

