使用Optaplanner版本6.2.0
我的DROOLS规则:
rule "Transition Time Constraint"
when
$leftImageStrip:ImageStrip($selected : selected,
$satellite : satellite,
selected != null,
$timeslot : timeslot,
leftId : id,
lGain : gain,
lRollAngle : rollAngle,
$duration : duration)
$rightImageStrip : ImageStrip(selected == $selected,
satellite == $satellite,
Math.abs(timeslot.getTime() - $timeslot.getTime()) <= 460000,
this != $leftImageStrip,
rGain : gain,
rRollAngle : rollAngle)
then
x = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss.SSS");
scoreHolder.addHardConstraintMatch(kcontext, -1);
end
rule "Shoot Strip once"
when
$leftImageStrip: ImageStrip($selected : selected, $stripList : stripList,
leftId : id, selected != null)
$rightImageStrip: ImageStrip(selected == $selected, stripList == $stripList,
this != $leftImageStrip)
then
scoreHolder.addMediumConstraintMatch(kcontext, -1);
end
rule "Maximization of Selected Parameters"
when
$imageStrip: ImageStrip(selected != null)
then
scoreHolder.addSoftConstraintMatch(kcontext, $imageStrip.gain);
end
我坚持使用根据输入数据排序而不同的局部最佳值。
如何克服这个问题,以获得输入数据排序的最佳解决方案?当然,它应该是全局最优解决方案。
可以确保使用Optaplanner得到的结果是全球最优吗?独立于输入数据排序?
答案 0 :(得分:0)
您似乎在规则&#34;转换时间约束&#34;中有得分陷阱。请参阅关键字&#34;得分陷阱&#34;的文档。修复可以产生很大的差异,以逃避局部最优并获得良好的结果。像这样的东西会修复它(从我的头顶,可能会倒置):
scoreHolder.addHardConstraintMatch(kcontext, ... 460000 - Math.abs(timeslot.getTime() - $timeslot.getTime()) ...);
一旦修复,查看每秒的平均分数(最后一条记录或基准报告)。
话虽这么说,元启发式(例如本地搜索)并不是要找到全局最优解决方案。当他们在合理的时间内扩展时,他们会找到最好的解决方案,比任何其他技术都能在扩展时提供给你的时间(参见research compo&#39; s例如ROADEF,ITT和INRC用于证明 - 所有声称能够找到全球最佳规模的技术都不具备规模。这样做的缺点是,元启发式算法并不总是很好地缩小(仅向上)。
注意:常见的销售技巧是提供一种能够找到全局最优的技术,然后应用分区以便在开发过程中稍后进行扩展。结果当然不是全局最优(由于NP完全问题的性质)并且它没有任何好处(相对而言)。分区造成的质量损失很大。