呼叫中心坐席数计算结果异常求助(附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

