如何预测异构桌面排队系统的等待时间?

时间:2012-08-03 12:54:19

标签: algorithm queue

我有一个系统可以模拟一种排队系统,它由以下元素组成:

  • 服务:可以提供给客户的服务
  • 办公桌:可以提供一项或多项服务的办公桌。有几个办公桌,每个办公桌都可以配置为提供不同的服务子集,办公桌之间有或没有重叠
  • 客户/票证:客户进来,并打印一张票据,指明她需要哪种服务

系统已经就位,工作正常。这是一个真实世界的系统,票务分销商允许客户请求和打印票证,并提供客户端应用程序来呼叫客户到办公桌,并显示以显示去哪里的客户。

现在,新要求是一种近似预测队列中任何给定票证的等待时间的方法,并在等待时间过长时发出警报。

我们将为每项服务提供从使用情况统计信息中收集的服务持续时间。

预测不需要非常精确,目标是让网站管理员快速了解情况,反馈一切是否顺利流动,或者客户是否在队列中累积,这将是很高兴再开一张桌子,相反,顾客很少,桌子也可以关上。最重要的因素是客户的等待时间(例如,如果每个客户在1分钟内停留在办公桌,则可以有10个客户等待,但如果此持续时间为10分钟则不会!)。

问题在于任何办公桌都可以无限制地提供任何服务。因此,任何数量的办公桌都可以提供给定的服务。但反过来,每个服务台都可以提供任意数量的服务。

我尝试了各种方法:

您可以生成一个队列,该队列仅包含可由一个桌面提供的服务的票证。但是,此列表中的每张票都可以通过这张桌子或其他5个办公桌“维修”......

您可以获取一张票,看看哪些办公桌很容易为其提供服务,并抓住所有这些办公桌可以提供服务的门票。问题是,有些门票只能由集合中的一个桌面处理,而其他所有桌面都可以处理......

我真的不知道如何从这里解决问题。有没有可以用于那种异类书桌的排队模型?任何想法如何模型化?

1 个答案:

答案 0 :(得分:1)

由于您已使用algorithm标记了问题,并且您在编程站点(而不是数学或统计网站)中询问,我将从编程角度处理此问题。

型号:

// creates a new ticket for a given service; arrival time and length are only known
// for generated tickets
class Ticket(int arrival, int length, Service s)

// an abstract distribution (parameters are distribution-dependent)
class Distribution(...) 
      int generate() // generates integer with this distribution

// a service, with a distributions of time-to-finish and time-between-arrivals 
//    (both set experimentally from historical data).
class Service(Distribution lengths, Distribution arrivals)
      // simulated ticket: length from lengths.generate(), 
      //     arrival from t + arrivals.generate();
      Ticket createFuture(int t)  
      // same as above, but arrival = t+0
      Ticket createNow(int t)

// a desk, offers one or more services
class Desk() 
      void addService(Service s) // allows this desk to attend this service
      void removeService(Service s) 
      bool isCompatible(Service s) // is this desk compatible with this service?
      void attend(Ticket t) // marks a desk as attending a service
      bool isFree() // returns true if the desk is not attending anyone
      // returns a finished ticket, if any. After this, isFree() will return true
      Ticket finished() 

// a policy which assigns tickets to desks. Implement your current one (probably "FIFO") 
class Policy()
      // returns a suitable desk for that ticket, or null if none is posible/desired
      Desk assign(Ticket t, Ticket[] pending, Desk[] deks) 

// a live queue of tickets, dispatched using policy p t
class Queue(int startTime, Policy p, Service[] ss, Desk[] ds)
      void push(Ticket t) // adds a new real ticket to the queue
      // estimates wait-times for new arrivals to all services at time 't'
      Map<Service, int> forecast(int t) 
      void tick() // advances time for this queue
      Queue clone(); // deep-clones the queue (including time, policy, desks, and services)

<强>用法:

  1. 定义您的服务并为他们的到来建模。
  2. 创建办公桌并为其分配服务。
  3. 定义您当前的策略,使用它创建一个队列。队列将开始为空。
  4. 随着时间的推移,请拨打tick()(如果门票进来,请使用createNow()将它们推入())
  5. 根据需要调用估计值()
  6. <强>实施

    tick()将遍历所有办公桌以查看哪些已完成(),并根据当前策略为办公桌分配票证。通过多次调用tick()直到队列为空,可以确定每种服务类型的准确关闭时间 - 但这会破坏队列,并且只能在当前队列的clone()s上完成

    forecast()将克隆()队列N次,并且对于每个克隆队列,在添加模拟票证(使用createFuture()生成)时提前'now-t'时间。您应该按如下方式链接createFuture的时间:

    // create 3 future tickets for service s
    Ticket t1 = s.createFuture(now);
    Ticket t2 = s.createFuture(t1.arrival);
    Ticket t3 = s.createFuture(t2.arrival);
    //...
    
    模拟票证只有在模拟时间达到模拟到达时间后才会被推入实际队列。一旦模拟时间达到'now + t',将确定实际服务延迟并在所有N次模拟中平均,以产生概率预测。