当前可用的两个选项(6.3.0.Final)似乎是将值范围定义为Collection或ValueRange(由bounds定义)。 我的域具有由Java对象表示的每个变量的大量潜在值(不计数或数字行值)。
随着我们的问题扩大,所有不同的计划变量的所有可能值一起在内存中变得不切实际。
有没有办法根据需要为引擎提供值?批量或使用迭代器?
如果是这样,我可以想象大部分值存储在数据库或其他磁盘结构中,并且只是小批量存入内存以供考虑。
答案 0 :(得分:2)
为了清楚阅读这篇文章的其他人:这些需要适合记忆吗?
ValueRange
接口的发明。但是,当您从Collection
返回一个简单的@ValueRangeProvider
时,当然可以。另请注意,如果您使用实体中的值范围而不是解决方案中的正常值范围,则会占用更大的内存。回答你的问题:
由于您的计划值不适合内存,因此@ValueRangeProvider
无法返回Collection
。而是返回CountableValueRange
(如果前者不可能,则返回ValueRange
)。如果值类型是数字(int,long,double,BigDecimal),请使用ValueRangeFactory
上的方法。如果不是 - 你不想要或不能重构(我建议) - 然后沿着兔子洞走下去并使用深层实现类来实现你自己的CountableValueRange
...刚开始阅读{{ 1}}。
出于兴趣:您的计划价值类别是什么类型?为什么不能成为一个数字?我想了解您的用例,以便我可以评估是否需要在OptaPlanner中为这些值范围(或更通用的变体)添加开箱即用的支持。