Системы с ожиданием — формула Erlang C

10 Май
2012

Внимание! Пост не имеет никакого отношения к языку программирования Erlang.

Первый раз увидев слово Erlang, мне, наверняка как и многим из вас, пришло на ум только название языка программирования. Смущала только приставка «С» в конце. Как и любой другой программист я первым делом… да, угадали, набрал поисковый запрос в Google.

И как оказалось:
«Формула Erlang C очень часто используется для вычисления необходимого количества операторов и других параметров call-центра в зависимости от ожидаемого количества звонков.» Причем данная формула применима не только к телефонии, но и к любым другим системам с ожиданием (например, систем с n идентичными обслуживающими приборами и бесконечным числом мест ожидания).

Требовалось довольно-таки быстро выполнить задание (написать калькулятор), поэтому я решил не тратить время на написание велосипеда, а решил найти готовое решение.
Вот к примеру решение на javascript, и куча аналогичных в интернете, а точнее полностью идентичных. Однако проверка на других онлайн калькуляторах меня заставила усомниться в правильности реализации алгоритма. Было решено написать своими силами.

Пошагово алгоритм описан здесь (англ.), неплохо объяснено здесь.

И напоследок выкладываю реализацию на php, возможно кому-нибудь пригодится.

<?php
function fact($num) // факториал
{
if ($num == 0)
return 1;
else
{
$i = 1;
$result = 1;
while ($i <= $num)
{
$result *=$i;
$i++;
}
return $result;
}
}

function erlangc($m, $u, $p)
{
$ch = pow($u,$m)/fact($m);
$sum = 0;
for ($i = 0; $i < $m; $i++)
{
$sum += pow($u,$i)/fact($i);
}
$zn = $ch + (1-$p)*$sum;
return $ch/$zn;
}

$before = 20;
$after = 30;
$calls_on_hour = 500;
$average_call_time = 180; // в секундах
$agents = 30; // кол-во агентов
$timeout = 20;// задержка

$lambda = $calls_on_hour/3600;// звонков в час/3600
$u = $lambda*$average_call_time; // интенсивность звонков
$p = $u/$agents; //занятость агента

$ec = erlangc($agents,$u,$p); // высисляем
$asa = ($ec * $average_call_time)/($agents*(1-$p)); // средняя скорость ответа

$w = 1 - $ec * exp(-($agents - $u)*($timeout/$average_call_time)); //качество обслуживания
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх