在 OptaPlanner 中使用 PDPTW 进行并行求解

Parallel Solving with PDPTW in OptaPlanner

我正在尝试使用并行方法提高 OptaPlanner 的性能,但我不确定最佳策略。

我有 PDPTW:

当新客户想要添加送货时,我正在尝试找出一种快速方法(不到一秒)向他们展示一天中有哪些时间段可用(上午 8 点、上午 9 点、上午 10 点等) ).每个时间段都有不同的分数结果。有些效率很高,有些则不可预订,具体取决于 time/situation 行驶时间增加。

为了性能,我不想按顺序尝试每个小时的时间,因为它太慢了。

我怎样才能同时尝试客户在所有时间段的交付?在添加客户的潜在交付 window 之前先 运行 求解器是有意义的,然后共享已解决的原始状态,所有不同的添加交付的时间段都被独立解决。

有没有直观的方法来做到这一点?例如:

  1. 重用一些原来的求解计算(添加新交付前的状态)。也许这甚至可以提前缓存?
  2. 也许运行所有时隙在单独的服务器(或至少多个线程)上解决实例。

对于这样的事情,推荐的设置是什么?如果能在一秒钟内 return 一个 HTTP 响应就太好了。这适用于大约 100-200 次送货和 10-20 辆卡车。

谢谢!

A) 如果您优化 1 位客户到 1 辆车 中的 1 个索引的分配,而 pinning 所有其他已分配客户,那么您将放弃所有优化优势。这不是 NP 难的。 您仍然可以为此使用 OptaPlanner <constructionHeuristic/><localSearch/> 不会提高分数),无论是否使用 moveThreadCount 将其分布在多个核心上,即使主要好处只是增量分数计算,而不是人工智能算法。

B) 优化所有客户到车辆索引的分配。真正的商业利益——比如减少 25% 的驾驶时间——在添加新客户允许移动现有客户分配时出现。问题是那些现有客户已经收到他们在议程中屏蔽的时间 window。但如果那些时间 windows 足够宽,这就不是问题:这些只是硬约束。 更宽的时间 windows = 更多的驾驶时间优化机会(=更多 $$$,更少的二氧化碳排放量)。


一分钟内回复怎么样?

到那时,您不需要发布(=与客户共享信息)哪辆车将在什么时间以何种顺序到达。你只需要发布不管你是否接受时间window。有两种方法可以实现:

C) 基于 table 的决定( 放松 ):每辆车每天不超过 5 位顾客。

陷阱:如果它在 country/state 的 5 个角落有 5 个客户,那么它可能仍然不可行。考虑任何 2 个客户位置对之间的平均欧几里德距离以影响决策。

D) 通过 运行ning optaplanner 直到 termination feasible=true,从先前调度的热启动开始。如果在1000ms内没有找到这样的可行解,则拒绝时间window提议。

D 的陷阱):如果同时有 2 个请求进来,而你 运行 它们是并行的,所以两者都没有考虑到另一个,它们可能单独可行但一起不可行。