Проблема с обработкой операторов имитационного центра обработки вызовов - PullRequest
0 голосов
/ 23 июня 2018

Я разрабатываю программу для виртуального колл-центра. Это имеет следующий сценарий:

  • звонящие выстраиваются в очередь в колл-центр случайным образом с определенной
    скорость, например 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

А вот типичный вывод: enter image description here

Может кто-нибудь сказать мне, если что-то не так с тем, как написан мой код для обработки агентов или достижения перечисленных сценариев? Я думаю, что среднее время подачи может также иметь проблему, связанную с этим, так как количество кажется слишком высоким. Должен ли я использовать методы / переменные класса так, как я?

Буду признателен за любые отзывы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...