Я разрабатываю программу для виртуального колл-центра. Это имеет следующий сценарий:
звонящие выстраиваются в очередь в колл-центр случайным образом с определенной
скорость, например 100 вызовов / час
фиксированное количество агентов (например, 50)
обслуживает звонящих в очереди
- длительность каждого звонка варьируется случайным образом от 2 до 20 минут
- после каждого временного шага вычислите:
- приблизительное среднее текущее ожидание
время -> среднее время, необходимое для
звонящий, с момента звонка до передачи агенту
- среднее текущее время подачи -> среднее
время между передачей звонящего до следующего звонка
переданы
Я заметил, что доступное количество агентов всегда возвращается к исходным 50 после 25 итераций, даже несмотря на то, что количество абонентов в очереди становится все выше. Я думаю, что не должен правильно обрабатывать переход агента из занятой очереди в доступную очередь:
class Agent
attr_accessor :serve_time, :time_limit
@@total_time = 0
@@number_of_callers = 0
def initialize
@serve_time = 0
@time_limit = 0
end
def generate_time_limit
@time_limit = rand(2.0..20.0)
end
def time_limit_reached?
@serve_time >= @time_limit
end
def self.add_serve_time(time)
@@total_time += time
@@number_of_callers += 1
self.avg_serve_time
end
def self.avg_serve_time
return 'unknown' if @@number_of_callers == 0
@@total_time / @@number_of_callers.to_f
end
end
class Caller
attr_accessor :wait_time
@@total_time = 0
@@number_of_callers = 0
def initialize
@wait_time = 0
end
def self.add_wait_time(time)
@@total_time += time
@@number_of_callers += 1
self.avg_wait_time
end
def self.avg_wait_time
return 'unknown' if @@number_of_callers == 0
@@total_time / @@number_of_callers.to_f
end
end
caller_queue = []
free_agent_queue = []
busy_agent_queue = []
#initiate agents
free_agent_queue = Array.new(50){Agent.new}
# Start the queue
100.times do |t|
caller_queue.push(Caller.new)
print "#{t}) queued callers #{caller_queue.size}, available agents #{free_agent_queue.size}, "
caller_queue.each { |c| c.wait_time += 1 }
# if there is avail agent and a caller in the queue, take the last
# caller in the queue out, take the last avail agent out and put that
# agent in the busy agent queue.
if free_agent_queue.any? && caller_queue.any?
busy_agent_queue.push(free_agent_queue.pop)
busy_agent_queue.last.generate_time_limit
busy_agent_queue.each { |b| b.serve_time += 1}
Caller.add_wait_time(caller_queue.pop.wait_time)
end
print "avg wait time #{Caller.avg_wait_time}, "
# any agents who's call time is up, take them out of the busy queue
# and back into the avail agent queue
busy_agent_queue.reject!{ |a|
if a.time_limit_reached?
Agent.add_serve_time(a.serve_time)
free_agent_queue.push(a)
true
else
false
end
}
puts "avg serve time #{Agent.avg_serve_time}"
end
А вот типичный вывод:
Может кто-нибудь сказать мне, если что-то не так с тем, как написан мой код для обработки агентов или достижения перечисленных сценариев?
Я думаю, что среднее время подачи может также иметь проблему, связанную с этим, так как количество кажется слишком высоким. Должен ли я использовать методы / переменные класса так, как я?
Буду признателен за любые отзывы!