Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OptaPlanner任务调度中的逃逸局部最优解_Java_Optaplanner - Fatal编程技术网

Java OptaPlanner任务调度中的逃逸局部最优解

Java OptaPlanner任务调度中的逃逸局部最优解,java,optaplanner,Java,Optaplanner,我基本上(有一定的持续时间)是有弹性的,你可以说任务之间有“弹性”链接,例如任务B必须在任务B之后5到10分钟之间。任务也不能重叠,因为一个人每时每刻只能做一件事 还有一些我以后可能需要加入的附加功能,我在这里包括这些功能,以防它们在某个时候相关: 任务持续时间在一定范围内可能会变得灵活 某些任务可能会锁定到某个时间点 您可以添加新人员,以便同时完成两项任务 我的问题是我的方法很容易陷入局部最优 我目前所做的是优化任务的开始时间,有一个硬约束,即有多少链接超出范围,以及它们是否重叠。这似乎工

我基本上(有一定的持续时间)是有弹性的,你可以说任务之间有“弹性”链接,例如任务B必须在任务B之后5到10分钟之间。任务也不能重叠,因为一个人每时每刻只能做一件事

还有一些我以后可能需要加入的附加功能,我在这里包括这些功能,以防它们在某个时候相关:

  • 任务持续时间在一定范围内可能会变得灵活
  • 某些任务可能会锁定到某个时间点
  • 您可以添加新人员,以便同时完成两项任务
我的问题是我的方法很容易陷入局部最优

我目前所做的是优化任务的开始时间,有一个硬约束,即有多少链接超出范围,以及它们是否重叠。这似乎工作得很好,并且很快找到了一个不会打破任何硬约束的解决方案。 我的附加软约束应该尽量减少整个过程的持续时间。例如,如果任务B和C之间的链接是20-100分钟,硬分数不关心链接是20分钟还是100分钟。但通常20比100好。但是,当处理复杂的树状任务依赖关系时,最好使用80分钟的链接将其他任务置于该间隙中,这样第三个任务可以更早开始。因此,仅仅最小化链接长度并不是一种有效的方法。 但问题是,一旦一个链接在该范围内,就没有动机将其移出该范围,以便以后找到更好的解决方案。我陷入了局部最优

因此,我现在正在思考如何解决这个问题。我一直在思考的方法以及我希望得到反馈的地方是创建一个新的CompositeMove,移动两个链接的任务。这会改善情况,但不能很好地扩展,因为一旦三个或更多任务紧密联系在一起,我们就会陷入相同的情况

我一直在考虑的另一件事是,尝试实施一项行动,即接受一项任务,延伸一个链接,并将任务置于间隙中。不过,我还没有好好想清楚这一点

我还尝试了不同的本地搜索方法,但这也没什么帮助。但我想他们在这里也帮不了什么忙


我也看过,但虽然它帮助我理解了问题,但它并没有真正帮助解决问题。

我想你也看过项目作业调度示例?在学术论文中,有一种替代方法对PJ很有效,我还没有在OptaPlanner中实现:给定一个有序的作业列表(=任务),使用确定性构造启发式来贪婪地放置它们。然后使用本地搜索对该列表重新排序。这种方法有时会丢弃解决方案,但对于MISTA2013(项目作业调度背后的竞争),它有着很好的结果。但实际上(除非你是元启发式专家),我建议只添加课程粒度的移动,并使用基准测试器来查看哪些移动值得添加。等待OptaPlanner支持上述开箱即用的方法。谢谢您的回复。我已经读了好几遍PJS示例,但仍然没有真正理解到底发生了什么(因此肯定也不是元启发式专家),我认为这可能是因为我现在忽略了很多东西(主要是资源)虽然我的灵活链接不存在。是否还有创建自定义MoveListFactory的示例?我还没有创建一个新的CompositeMove,因为我不知道如何创建一个新的ChangeMove。
variableDescriptor
toPlanningValue
应该是什么?或者,即使我只需要一组变动动作,我也必须创建一个新的动作吗?