You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

问题修复说明

  1. 巴士排序错误:首日直接固定bus_active <- 1:5,补充新巴士时从可用巴士中按编号取最小编号的,同时保留未故障巴士的原有顺序,确保每日运营巴士编号符合要求。
  2. 已故障巴士复活:新增bus_broken数组标记已故障巴士,补充新巴士时仅从未故障且未启用的集合中选取,彻底杜绝故障巴士再次被启用。
  3. 同一行出现重复巴士:bus_active仅包含未故障的现有巴士和新补充的可用巴士,补充逻辑严格筛选非重复的可用巴士,避免重复。
  4. 概率值超出合理范围:
    • 判断故障时使用当日初始概率,之后再更新未故障巴士的概率,避免逻辑顺序错误导致的概率异常
    • 用pmax(..., 0)确保概率最低为0,新补充巴士概率固定为0.5,保证所有概率值在0-0.5区间内

内容的提问来源于stack exchange,提问作者stats_noob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 12:05:21