OptaPlanner:所有可能的值都必须适合内存吗?

时间:2015-10-20 20:03:35

标签: optaplanner

当前可用的两个选项(6.3.0.Final)似乎是将值范围定义为Collection或ValueRange(由bounds定义)。 我的域具有由Java对象表示的每个变量的大量潜在值(不计数或数字行值)。

随着我们的问题扩大,所有不同的计划变量的所有可能值一起在内存中变得不切实际。

有没有办法根据需要为引擎提供值?批量或使用迭代器?

如果是这样,我可以想象大部分值存储在数据库或其他磁盘结构中,并且只是小批量存入内存以供考虑。

1 个答案:

答案 0 :(得分:2)

为了清楚阅读这篇文章的其他人:这些需要适合记忆吗?

  • 所有计划实体即可。例如,当将30k进程安排到10k计算机时,所有30k进程必须适合内存,两次(一次用于工作解决方案,一次用于沿途找到的最佳解决方案)但不是平方(如单纯形,如果没有分区)。
  • 所有计划值? (这是你的问题)。这就是为什么计划ValueRange接口的发明。但是,当您从Collection返回一个简单的@ValueRangeProvider时,当然可以。另请注意,如果您使用实体中的值范围而不是解决方案中的正常值范围,则会占用更大的内存。
  • 所有可能的解决方案,如果是这种情况,我们甚至无法解决100台计算机上的300个进程等小问题。

回答你的问题:

由于您的计划值不适合内存,因此@ValueRangeProvider无法返回Collection。而是返回CountableValueRange(如果前者不可能,则返回ValueRange)。如果值类型是数字(int,long,double,BigDecimal),请使用ValueRangeFactory上的方法。如果不是 - 你不想要或不能重构(我建议) - 然后沿着兔子洞走下去并使用深层实现类来实现你自己的CountableValueRange ...刚开始阅读{{ 1}}。

出于兴趣:您的计划价值类别是什么类型?为什么不能成为一个数字?我想了解您的用例,以便我可以评估是否需要在OptaPlanner中为这些值范围(或更通用的变体)添加开箱即用的支持。