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

呼叫中心坐席数计算结果异常求助(附R代码)

呼叫中心坐席数量计算异常排查

我在计算呼叫中心所需坐席数量时,发现结果几乎无差异。坐席数由resource函数计算,该函数会持续增加坐席数,直到达到预设的服务水平目标gos_target(当gos < gos_target时,坐席数加1并重新计算gos值)。其中gos(即service_level)的计算依赖erlang_c函数。

调用resource函数时,除rate(每小时呼叫数,对应数据中不同时段/日期的呼叫量)外,其余参数固定:resource(rate = i, duration= 103, target= 20, gos_target=85/100, interval = 3600),预期函数能根据每行的呼叫数计算对应坐席数。

比如某行呼叫数为200时,计算得intensity=10,erlang_c=0.6821,service_level=0.390,最终resource返回坐席数14。按逻辑,呼叫数越多,service_level应该越低,结果差异应该明显,但实际编译后,每小时7通和50通呼叫的结果几乎一致,完全不符合预期。

问题代码

ds <- dataset

library(dplyr)

intensity <- function(rate, duration, interval) {
   return (rate / interval) * duration
}

erlang_c <- function(agents, rate, duration, interval) {
   int <- intensity(rate, duration, interval)
   erlang_b_inv <- 1
   for (i in 1: agents) {
     erlang_b_inv <- 1 + erlang_b_inv * i / int
   }
   erlang_b <- 1 / erlang_b_inv
   return (agents * erlang_b / (agents - int * (1 - erlang_b)))
}

service_level <- function(agents, rate, duration, target, interval) {
   pw <- erlang_c(agents, rate, duration, interval)
   int <- intensity(rate, duration, interval)
   #a <- (pw * exp(-(agents - int)))
   #b <- (target / duration)
   to <- exp(-(agents-int)*(target/duration))
   return (1 - (pw*(a)))
}

resource <- function(rate, duration, target, gos_target, interval) {
   inten <- intensity(rate, duration, interval)
   agents <- ceiling(inten + 1)
   gos <- service_level(agents, rate, duration, target, interval)

   while (gos < gos_target) {
     agents <- agents + 1
     gos <- service_level(agents, rate, duration, target, interval)
   }
   return(c(agents,gos))
}


vec_agents <- c()
gos_vec <- c()

for (i in ds$calls) {
   #print(i)
   res <-resource(rate = i, duration= 103, target= 20, gos_target=85/100, interval = 3600)
   vec_agents <- c(vec_agents, res[1])
   gos_vec <- c(gos_vec, res[2])
}


ds$agents <- vec_agents
ds$gos <- gos_vec

问题排查与修复

  • 核心错误:service_level函数变量未定义
    代码中注释掉了a的定义语句,但返回值里仍调用a变量。R中未定义的变量会导致计算异常(若全局环境无此变量,理论上会报错,但实际可能因环境残留值导致所有计算复用同一个无效值),直接让service_level的结果失去意义,进而导致resource函数的循环逻辑失效,最终所有行的坐席数计算结果几乎一致。

  • 修正service_level函数
    正确的服务水平计算公式应为 1 - pw * exp(-(agents - int)*(target/duration)),修正后的函数如下:

service_level <- function(agents, rate, duration, target, interval) {
   pw <- erlang_c(agents, rate, duration, interval)
   int <- intensity(rate, duration, interval)
   sl_factor <- exp(-(agents - int)*(target/duration))
   return (1 - pw * sl_factor)
}
  • 额外注意点
    检查erlang_c函数的边界情况:当agents <= int时,分母agents - int * (1 - erlang_b)可能为负或零,导致结果异常。当前resource函数中初始agents设置为ceiling(inten +1),可以避免此问题,但后续若调整初始值需注意。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 05:35:21