java在OptaPlanner中处理未初始化的解决方案
我正在为一所学校创建一个时间表生成器,我面临两个挑战:
1:施工阶段的用户反馈
在构造启发式阶段,我没有收到任何对传递给^{bestSolutionConsumer
的回调,这意味着在这个阶段我无法向用户提供任何反馈。(到今天为止只有10秒左右,但仍然很烦人。)
我怀疑这是故意的(从this question判断),但如果我错了,请纠正我
(我怀疑这个想法是构造启发式阶段无论如何都应该很快,并且99%的长期运行的解将花费在局部搜索阶段,因此这是唯一真正重要的阶段。对吗?)
2:手工安排讲座
此调度程序将仅为半自动的。我希望用户能够锁定讲课,手动移动讲课,甚至将讲课从日程中删除,方法是将讲课放在侧面的一堆中,以便稍后放置(稍后的放置可能由OptaPlanner完成)
重新思考初始化的定义
这使我重新思考我认为是一个初始的解决方案。如果我- 希望在讲座的初始安排期间获得进度反馈,以及
- 希望允许用户与只安排了一半讲座的时间表交互
。。。然后,也许我应该使时隙为空,或者为计划外的讲座设置一个sentinel时隙值,并简单地惩罚这些解决方案
在这个场景中,我想象一个解决方案立即被初始化(所有讲座最初都处于非计划状态,但从形式上讲,解决方案仍然被初始化),构建阶段基本上被跳过
问题
这是因为什么原因吗?!感觉就像我扔掉了OptaPlanner的大部分功能
我是否忽视了这种方法的任何缺点
这样做甚至可以跳过施工阶段吗
此外,重复规划对我来说很重要,而且docs say:
Repeated planning (especially real-time planning) does not mix well with a nullable planning variable.
这同样适用于使用
unscheduled
哨兵值的方法吗
# 1 楼答案
1/不,这并不愚蠢。事实上,这是over-constrained planning的一个例子
2/好吧,既然变量可以为null,那么您需要编写约束,以使null是可接受的。你可能会遇到这样的情况,解算器会发现只保留一些变量为空更容易,除非有相当大的惩罚。你可能需要设计特殊的约束来解决这个问题,或者在最坏的情况下,甚至需要定制动作
3/构造启发法不是强制性的,但它们仍然有用。即使他们让一些变量为空,他们仍然可以给你一个不错的初始解决方案。你也可以试试custom phase
4/如果你担心上面的一些事情,实际上引入一个虚拟值而不是使变量为空可以解决一些问题。(并引入其他约束,因为现在每个约束都必须处理这个虚拟值。)
我的建议是快速验证概念。查看每种方法的行为。选择一个你喜欢处理的问题。没有银弹