Kotlin 如何模仿Optaplanner 7';s将迭代器工厂移动到Optaplanner 8中的Vesselector桥
我们已经用Optaplanner 7实现了一个自定义构造启发式。我们没有使用简单的Kotlin 如何模仿Optaplanner 7';s将迭代器工厂移动到Optaplanner 8中的Vesselector桥,kotlin,optaplanner,Kotlin,Optaplanner,我们已经用Optaplanner 7实现了一个自定义构造启发式。我们没有使用简单的CustomPhaseCommand;相反,我们扩展了moveselector或config并覆盖buildBaseMoveSelector,以将自己的MoveFactory包装在MoveIteratorFactoryToMoveSelectorBridge中返回。我们决定这样做,因为这给了我们以下优势: 支持开箱即用的全局终止配置 代码中的类型安全配置(无原始字符串) 使用Optaplanner 8,方法bu
CustomPhaseCommand
;相反,我们扩展了moveselector或config
并覆盖buildBaseMoveSelector
,以将自己的MoveFactory包装在MoveIteratorFactoryToMoveSelectorBridge
中返回。我们决定这样做,因为这给了我们以下优势:
- 支持开箱即用的全局终止配置
- 代码中的类型安全配置(无原始字符串)
buildBaseMoveSelector
从MoveSelectorConfig
API中消失,并且在的新实现中似乎阻止了构建自定义配置类
是否仍有可能在Optaplanner 8配置中注入适当的自定义构造启发?如果是,如何进行?或者我们应该使用带有自定义自实现终端的CustomPhaseCommand
编辑:
为清楚起见,在Optaplanner 7中,我们在Optaplanner配置中有以下代码片段(在kotlin代码中定义):
CustomMoveSelectorConfig
扩展MoveSelectorConfig
并覆盖buildBaseMoveSelector
:
class CustomMoveSelectorConfig(
var someProperty: Int = 0,
var otherProperty: Int = 0,
) : MoveSelectorConfig<CustomMoveSelectorConfig>() {
override fun buildBaseMoveSelector(
configPolicy: HeuristicConfigPolicy?,
minimumCacheType: SelectionCacheType?,
randomSelection: Boolean,
): MoveSelector {
return MoveIteratorFactoryToMoveSelectorBridge(
CustomMoveFactory(someProperty, otherProperty),
randomSelection
)
}
class CustomMoveSelector配置(
var someProperty:Int=0,
var otherProperty:Int=0,
):MoveSelectorConfig(){
重写buildBaseMoveSelector(
configPolicy:HeuristicConfigPolicy?,
minimumCacheType:SelectionCacheType?,
随机选择:布尔,
):移动选择器{
返回MoveIteratorFactoryToMoveSelectorBridge(
CustomMoveFactory(someProperty,otherProperty),
随机选择
)
}
总而言之:我们真的需要将我们自己的MoveSelector与定制工厂连接起来。我认为目前Optaplanner 8不可能实现这一点。有趣的扩展
改变的动机8:
不是公共API(buildBaseMoveSelector
包不在config
包中,我们仅保证7中包API
的XML向后兼容性)现在,我们还保证了包config
的API向后兼容性,因此包括编程配置,因为我们将所有config
方法都从包中移出build*
- 在8.2或更高版本中,我们希望将SolverFactory中的配置内部化,这样我们可以更快地构建数千个解算器实例。例如,加载类不会仅在SolverFactory构建时进行,而不再是在每次解算器构建时进行
queuedEntityPlacer
,它是MoveIteratorFactory
我想不会,因为您需要模拟支持…对于所选实体,您需要生成n个移动,但在1个放置期间始终是相同的实体(因此需要模拟)
显然,8中的更改阻止用户插入自己的移动选择器(=这是一个内部API,但无论如何)。我们可能可以添加一个内部API来再次允许这样做。聊天讨论:
class CustomMoveSelectorConfig(
var someProperty: Int = 0,
var otherProperty: Int = 0,
) : MoveSelectorConfig<CustomMoveSelectorConfig>() {
override fun buildBaseMoveSelector(
configPolicy: HeuristicConfigPolicy?,
minimumCacheType: SelectionCacheType?,
randomSelection: Boolean,
): MoveSelector {
return MoveIteratorFactoryToMoveSelectorBridge(
CustomMoveFactory(someProperty, otherProperty),
randomSelection
)
}