我想使用optaplanner来安排任务,这些任务最好用地图上的区域表示。基本上,我在一张地图上有一组正方形和一组具有不同优先级的圆,我需要优化正方形的位置,使其与圆相交,从而优化被正方形相交的圆的优先级分数。
我的问题是决定哪些对象应该是规划实体,哪些应该是问题事实。Optaplanner文档指出
在多对一关系中,规划实体类通常是多方面的。引用另一侧的属性就是规划变量。例如在员工排班中:计划实体类是ShiftAssignment,而不是Employee,计划变量是ShiftAssignment.getEmployee(),因为一个员工有多个ShiftAssignment,但一个ShiftAssignment只有一个Employee。
这似乎表明圆是规划实体,因为许多圆可以由一个正方形激活因此,规划变量将是circle.activatedby()。但是,在文档的后面,它指出
规划实体是一个javabean(pojo),在求解过程中会发生变化。
圆被固定在二维平面上——正是正方形本身在改变位置。此外,如果一个圆圈远离其他圆圈,或者优先级足够低,那么它很可能会处于未激活状态。在这些情况下,Circle.activatedBy()根本不会返回特定的正方形。
我以前从来没有用过Optaplanner,所以我很感激你能给我解释一下为什么要用Optaplanner。我也不太确定如何开始表示所有这些对象都位于的2d平面,尽管我一直在研究geojson和其他解决方案,以确定两个多边形是否相交。很可能SquarePosition是最好的规划实体,不过我不知道OptaPlanner是如何做到这一点的,因为在二维平面上有无限多个多边形的潜在位置。
我的具体问题是:在这种情况下,规划实体注释是否为正方形,规划变量是否为正方形的X和Y坐标如果是这样的话,什么是最好的方法来创建方块的移动?在这种情况下,每个圆都有一个优先级分数,如果正方形与圆相交,则将其分数添加到总分中。我想为最高的分数进行优化,所以我考虑在最高优先级的圆周围有一个正方形的“轨道”,以查看它可能与哪些其他圆相交,然后移动到下一个优先级的圆并重复不过,这听起来一点也不理想,而且据我所知,其他出色的optaplanner文档都没有涵盖这些类型的移动。
最佳答案
OptaPlanner 6.5还不能优雅地处理二维曲面或三维体积填充。在未来的版本中,我们将支持它。
也就是说,几年前,我用Optaplanner破解了一个3D卷打包程序,处理了100万个对象iirc:Packing Santa's Sleigh (here be dragons)。
带多边形的二维曲面填充是当前的前沿研究:查找代码组的论文,特别是由tony wauters编写的那些。