如何安排任务

时间:2018-09-19 03:56:27

标签: algorithm data-structures scheduling priority-queue compareto

有一种洗车场,一次只能为1位客户提供服务。洗车的目标是通过使他们等待排队的时间最少,来吸引尽可能多的满意顾客。如果可以在15分钟内为客户提供服务,那么他们会感到快乐,在一小时内就会感到高兴,在1小时至3小时的中立时间和3小时至8小时的生气之间。 (目标是最大程度地减少愤怒的人和最大化幸福的人)。唯一需要注意的问题是,每辆车需要花费不同的时间进行清洗和维修,因此,鉴于我们必须最大化客户效用的目标,我们不能始终以先到先得的原则提供服务。因此可能看起来像这样:

  

客户专线

     

Customer1)任务:6分钟(第一次到达)

     

Customer2)任务:3分钟(第二次到达)

     

Customer3)任务:9分钟(第3次)

     

Customer4)任务:4分钟(第4分钟)

     

服务热线

     

服务客户2,服务客户1,服务客户4,服务客户3。

通过这种方式,没有人在排队之前等待超过15分钟。我知道我应该使用某种形式的优先级队列来实现此目的,但是老实说,我知道如何为不同的客户赋予优先级。我不能优先考虑需要最少工作量的客户,因为他们可能是最后一位到达的客户(其他人会很生气),而且我不能仅根据时间进行比较,因为第一个人可能要完成一项任务一整天。那么我将如何将这些客户彼此比较,以期获得最大的幸福感?

欢呼

1 个答案:

答案 0 :(得分:1)

这类似于订购呼叫中心的电话。当您有金银客户时,它会变得更加有趣。无论如何:

每辆车都有readyTime(可以洗的最早时间,所以到达时间-每辆车可能有所不同)和dueTime(顾客生气的那一刻,所以3在readyTime之后数小时)。

然后使用约束求解器(如OptaPlanner)确定汽车的顺序(*)。汽车的顺序(这是一个真正的计划变量)意味着每辆汽车的startWashingTime(它是一个阴影变量),因为在您的示例中,如果客户1在客户2之后订购,并且我们从08开始:00,我们可以推断出客户1的startWashingTime是08:03。

然后endWashingTimestartWashingTime + washingDuration

然后只需要添加2个约束,然后让求解器solve()就可以了:

  • endWashingTime必须小于dueTime,这是一个硬约束。这是为了避免生气的顾客。
  • endWashingTime必须小于startTime加15分钟,这是一个软约束。这是为了最大化满意的顾客。

(*)此问题是NP完全问题或NP困难问题,因为您可以将其简化为背包问题。在实践中,这意味着:您无法为其编写可在合理时间内扩展并找到最佳解决方案的算法。但是约束求解器可以使您接近。