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

在OptaPlanner中处理未初始化的解决方案

夏侯和韵
2023-03-14

我正在为一所学校创建课程表生成器,我面临着两个挑战:

在构建启发式阶段,我没有得到任何回调的最佳解决方案消费者传入SolverManager.solve和听这意味着我不能在这个阶段向用户提供任何反馈。(到今天为止只有大约10秒左右,但仍然很烦人。)

我怀疑这是设计使然(从这个问题来看),但如果我错了,请纠正我。

(我怀疑这样的想法是,构造启发式阶段无论如何都应该很快,并且99%的长时间运行的解决方案将花费在本地搜索阶段,因此这是唯一真正重要的阶段。对吗?)

此调度程序将仅是半自动的。我希望用户能够固定讲座,手动移动讲座,甚至通过将讲座放在侧面的一堆以供以后放置(以后的放置可能由OptaPlanner完成)来从时间表中删除讲座。

这让我重新思考我认为的初始化解决方案。如果我...

  1. 即使在讲座的初始位置也希望有进度反馈,并且
  2. 希望允许用户与只安排了一半讲座的时间表进行交互

...那么也许我应该使时间段为空,或者为计划外的讲座设置一个哨兵时间段值,并简单地惩罚这样的解决方案。

在这个场景中,我想象一个解决方案会立即被简单地初始化(所有讲座最初都处于非计划状态,但正式地说,解决方案仍然被初始化),并且基本上会跳过构建阶段。

>

  • 这是因为什么原因吗?!感觉就像我扔掉了OptaPlanner的大部分功能。

    我是否忽略了这种方法的任何缺点?

    这样做是否可以跳过施工阶段?

    此外,反复计划对我来说很重要,医生说:

    重复计划(尤其是实时计划)不能与可为空的计划变量很好地混合。

    这同样适用于使用非计划前哨值的方法吗?

  • 共有1个答案

    董高洁
    2023-03-14

    1/不,这并不愚蠢。事实上,这是过度约束规划的一个例子。

    2/好了,既然变量可以为空,那么您需要编写约束,使其可以为空。您可能会遇到这样的情况,即解算器会发现只保留一些变量为空比较容易,除非有相当大的惩罚。您可能需要设计特殊的约束来解决这个问题,或者在最坏的情况下甚至需要自定义移动。

    3/构造试探法不是强制性的,但是它们仍然是有用的。即使他们让一些变量为空,他们仍然可以给你一个不错的初始解。您可能还想尝试自定义阶段。

    4/如果你担心上面的一些事情,确实引入一个虚拟值而不是使变量为空可以解决其中的一些担忧。(并引入其他的,因为现在每个约束都必须处理这个虚拟值。)

    我的建议是快速验证概念。看看每种方法的表现。选择你更喜欢处理的一个。没有银弹。

     类似资料:
    • 我正在将一个项目从java迁移到kotlin,该项目使用了许多可能为空的变量,并且在与用户或外部作业进行一些交互之前不会初始化它们。 我试图使用kotlin null安全优势,并且我试图避免在源代码中使用<code>nulllateinitvar location:location?=空 我这样做是为了避免使用< code >?每次我需要使用这些变量时。现在的问题是...如果变量没有初始化会发生什

    • 我试图在JUnit 5和SpringBatchTest注释中加载JobLauncherTestUtils对象。但是,它无法加载应用程序上下文。所有其他自动构建的bean都成功加载,但是JobLauncherTestUtils无法加载。这是我的测试配置,省略了导入。我尝试在BeforeAll中手动加载它,但是JobRepository和JobLauncher无法加载。我只对能够成功实例化JobLau

    • 据我所知,在Java11中,这两个操作可以在一行中完成,不是吗?

    • 我有这样的设定: 在施工启发式阶段,如果 optaplanner 在为所有规划实体分配初始值之前获得 0 HARD 分数(可行解决方案),那么在分配更多规划实体初始值后再次变得不可行(-1 HARD),我注意到当施工启发式阶段结束时,optaplanner 不会执行本地搜索,而只是将不可行的解决方案报告为最终最佳解决方案。 最终的最佳解决方案不应该是所有规划实体都被分配了一个值并从那里开始检查是否

    • 输入文件: ${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/内容/资源/dwarf/${TARGET_NAME}$(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH) 在fabric集成期间,我们已经将崩溃放置在临时/生产环境中,因此在迁移firebase时,所有的崩溃都得到了配置。但是当我放置新的崩