当前位置: 首页 > 知识库问答 >
问题:

如何在Optaplanner 8中模拟Optaplanner 7的moveteratorfactorytomoveselectorbridge

阚吕恭
2023-03-14

我们已经用Optaplanner7实现了一个定制的构造启发式。我们没有使用简单的CustomPhaseCommand;相反,我们扩展MoveSelectorConfig并重写BuildBaseMoveSelector,以返回包装在MoveIteratorFactoryToMoveSelectorBridge中的我们自己的MoveFactory。我们决定这样做,因为它给我们以下好处:

  • 全局终止配置支持开箱即用
  • 代码中键入安全配置(没有原始字符串)

在Optaplanner8中,BuildBaseMoveSelector方法从MoveSelectorConfigAPI中消失了,并且在MoveSelectorFactory的新实现中似乎阻止了构建自定义配置类。

是否仍有可能在Optaplanner8配置中注入适当的自定义构造启发式?如果是,如何注入?或者我们应该使用CustomPhaseCommand和自定义的自我实现的终止?

为了清楚起见,在Optaplanner7中,我们在Optaplanner-config中有以下代码片段(在kotlin代码中定义):

        ConstructionHeuristicPhaseConfig().apply {
            foragerConfig = ConstructionHeuristicForagerConfig().apply {
                pickEarlyType = FIRST_FEASIBLE_SCORE
            }
            entityPlacerConfig = QueuedEntityPlacerConfig().apply {
                moveSelectorConfigList = listOf(
                    CustomMoveSelectorConfig().apply {
                        someProperty = 1
                        otherProperty = 0
                    }
                )
            }
        },

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
        )
    }

总而言之:我们确实需要用定制工厂来插入我们自己的MoveSelector。我认为这是不可能的Optaplanner8目前。

共有1个答案

邹华池
2023-03-14

有趣的扩展。

8中变化的动机:

  • BuildBaseMoveSelector不是公共API(Config包不在API包中,我们在7中只保证了包Config的XML向后兼容性)。现在,我们还保证包config的API向后兼容,因此包括编程配置,因为我们将所有build*方法都移出了包。
  • 在8.2或更高版本中,我们希望将SolverFactory中的配置内部化,这样我们就可以更快地构建数千个Solver实例。例如,加载类不应该只在SolverFactory构建中完成一次,而不再是在每次SolverFactory构建中完成。

我想不是,因为你需要模仿的支持...对于选定的实体,您需要生成n次移动,但在1次放置期间总是相同的实体(因此需要模仿)。

显然,8中的变化阻止了用户插入他们自己的MoveSelector(=这是一个内部API,但无论如何)。我们也许可以添加一个内部API来再次允许这种情况。

 类似资料:
  • 我知道Dan North设计BDD的意图之一是将词汇表从复杂的测试域中移开。然而,在实现由外到内的方法时,我们似乎仍然需要对模仿行为(或者,如果您愿意的话)有一些了解。North在这个视频中建议,如果我从最外层的域对象开始,然后向内工作,我会在发现合作者时模仿它们,然后用适当的实现替换它们。所以最后,我以一组端到端测试结束。 Martin Fowler在这篇博客文章中定义了TDD的两个阵营:“古典

  • 问题内容: 我尝试了这个: 但是碰巧 即使:par1不为null,也总是返回表的所有行。 而 不返回任何行。 我不能使用本机语法,因为我的应用程序应该在不同的数据库引擎上运行 问题答案: HQL中的命令等效于该命令。 如果不为null,则返回,否则返回。 因此,您需要以下方面的东西:

  • 问题内容: 大多数关系数据库都有某种字符串函数,例如: 会屈服 另一方面,SQLite具有非常有限的功能集。SQLite支持的功能在此处列出: http://www.sqlite.org/lang_corefunc.html 可以使用SQLite中可用的功能进行仿真吗? 问题答案: 我的答案结合了Shiplu Mokaddim的 “printf字符替换重复”和Steve Broberg和[Luka

  • 我尝试对一个包含restclient的服务进行一个简单的测试。看来我没有成功地模仿。看起来代码得到的是真实数据,而不是模拟数据。任何人都可以帮我。 服务本身将如下所示:

  • 是模拟抽象类:,而是接口。这是失败点: 如何模拟这段代码?

  • 我有一种方法可以将文件上传到Amazon S3。我正在尝试为此方法编写JUnit,但在S3AsyncClient上获取NullPointerException: 我的班级: S3UploadData类对象的输入:` @Getter@allargsconstuctor 你能帮我写Junit for uploadFile方法吗?

  • 我正在寻找一种模式,允许在Kubernetes的同一个pod上运行的两个容器之间共享卷。 我的用例是:我有一个在docker容器中运行的Ruby on Rails应用程序。docker映像包含应用程序中的静态资产/ 在“vanilla”docker中,我会使用“volumes from”标志共享此目录: 阅读此文档后:https://github.com/GoogleCloudPlatform/k

  • 问题内容: 大多数数据库都有类似函数的功能,有时可能会有用。至少这些数据库没有这样的功能: Derby SQL Server Sybase ASE Sybase SQL Anywhere 对于SQL Server和Sybase SQL Anywhere,可以使用子查询对函数进行仿真,并且可以在此问题中看到。一个例子: 但这在Sybase ASE中不起作用。显然,子查询无权访问外部查询的引用。我得到