【问题标题】:How to Schedule Tasks如何安排任务
【发布时间】:2018-09-19 03:56:26
【问题描述】:

有一家洗车店一次只能为 1 位顾客提供服务。洗车的目标是通过让他们在队列中等待最少的时间来获得尽可能多的满意客户。如果客户可以在 15 分钟内得到服务,他们会很高兴,在 1 小时内他们会很高兴,在 1 到 3 小时之间保持中立,在 3 到 8 小时之间会生气。 (目标是尽量减少愤怒的人,最大限度地增加快乐的人)。对这个问题的唯一警告是,每辆车需要不同的时间来清洗和维修,因此我们不能总是按照先到先得的原则提供服务,因为我们必须最大限度地提高客户效用。所以它可能看起来像这样:

客户热线

客户1) 任务:6 分钟(第一次到达)

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

客户3) 任务:9 分钟(第 3 次)

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

服务热线

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

这样一来,没有人排队超过 15 分钟才上菜。我知道我应该使用某种形式的优先级队列来实现这一点,但老实说我知道我应该如何为不同的客户提供优先级。我不能优先考虑所需工作量最少的客户,因为例如他们可能是最后一个到达的客户(其他人会很生气),而且我不能只根据时间进行比较,因为第一个人的任务可能需要一整天。那么我如何将这些客户相互比较,以最大限度地提高幸福感?

干杯

【问题讨论】:

  • 让工作时间短的人插队肯定会让大多数人开心。问题在于,根据整体队列负载,有些人可能永远不会得到服务。但是,要使这个问题成为一个正确的问题,您需要提供代码并说明它的实际问题。
  • 目标可以用数学方式表达吗?例如。两个快乐的客户和一个愤怒的客户比三个中立的客户更好吗?

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


【解决方案1】:

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

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

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

那么endWashingTime 就是startWashingTime + washingDuration

那么只需添加2个约束,让求解器solve()它:

  • endWashingTime 必须低于 dueTime,这是一个硬约束。这是为了没有愤怒的顾客。
  • endWashingTime 必须低于 startTime 加上 15 分钟,这是一个软约束。这是为了最大限度地提高客户满意度。

(*) 这个问题是 NP-complete 或 NP-hard 因为你可以把它放松为一个背包问题。在实践中,这意味着:您不能为它编写一个可以扩展并在合理时间内找到最佳解决方案的算法。但是约束求解器可以让你接近。

【讨论】:

  • 谢谢,但我如何在我的优先队列中优先考虑它们?我正在考虑为每辆车创建一个变量,即洗车所需的时间+汽车到达的时间,并根据此对我的 p 队列中的这些汽车进行排序。
猜你喜欢
  • 2019-04-03
  • 1970-01-01
  • 2021-11-17
  • 2012-05-02
  • 2013-03-30
  • 2021-12-05
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多