Kotlin 如何模仿Optaplanner 7';s将迭代器工厂移动到Optaplanner 8中的Vesselector桥

Kotlin 如何模仿Optaplanner 7';s将迭代器工厂移动到Optaplanner 8中的Vesselector桥,kotlin,optaplanner,Kotlin,Optaplanner,我们已经用Optaplanner 7实现了一个自定义构造启发式。我们没有使用简单的CustomPhaseCommand;相反,我们扩展了moveselector或config并覆盖buildBaseMoveSelector,以将自己的MoveFactory包装在MoveIteratorFactoryToMoveSelectorBridge中返回。我们决定这样做,因为这给了我们以下优势: 支持开箱即用的全局终止配置 代码中的类型安全配置(无原始字符串) 使用Optaplanner 8,方法bu

我们已经用Optaplanner 7实现了一个自定义构造启发式。我们没有使用简单的
CustomPhaseCommand
;相反,我们扩展了
moveselector或config
并覆盖
buildBaseMoveSelector
,以将自己的MoveFactory包装在
MoveIteratorFactoryToMoveSelectorBridge
中返回。我们决定这样做,因为这给了我们以下优势:

  • 支持开箱即用的全局终止配置
  • 代码中的类型安全配置(无原始字符串)
使用Optaplanner 8,方法
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:

  • buildBaseMoveSelector
    不是公共API(
    config
    包不在
    API
    包中,我们仅保证7中包
    config
    的XML向后兼容性)现在,我们还保证了包
    config
    的API向后兼容性,因此包括编程配置,因为我们将所有
    build*
    方法都从包中移出
  • 在8.2或更高版本中,我们希望将SolverFactory中的配置内部化,这样我们可以更快地构建数千个解算器实例。例如,加载类不会仅在SolverFactory构建时进行,而不再是在每次解算器构建时进行
无论如何,让我们先看看是否可以使用默认方式覆盖CH的移动,方法是显式配置
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
        )
    }