Optaplanner;根据输入数据排序坚持局部最优

时间:2015-11-02 10:32:02

标签: optaplanner

使用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得到的结果是全球最优吗?独立于输入数据排序?

1 个答案:

答案 0 :(得分:0)

您似乎在规则&#34;转换时间约束&#34;中有得分陷阱。请参阅关键字&#34;得分陷阱&#34;的文档。修复可以产生很大的差异,以逃避局部最优并获得良好的结果。像这样的东西会修复它(从我的头顶,可能会倒置):

scoreHolder.addHardConstraintMatch(kcontext, ... 460000 - Math.abs(timeslot.getTime() - $timeslot.getTime()) ...);

一旦修复,查看每秒的平均分数(最后一条记录或基准报告)。

话虽这么说,元启发式(例如本地搜索)并不是要找到全局最优解决方案。当他们在合理的时间内扩展时,他们会找到最好的解决方案,比任何其他技术都能在扩展时提供给你的时间(参见research compo&#39; s例如ROADEF,ITT和INRC用于证明 - 所有声称能够找到全球最佳规模的技术都不具备规模。这样做的缺点是,元启发式算法并不总是很好地缩小(仅向上)。

注意:常见的销售技巧是提供一种能够找到全局最优的技术,然后应用分区以便在开发过程中稍后进行扩展。结果当然不是全局最优(由于NP完全问题的性质)并且它没有任何好处(相对而言)。分区造成的质量损失很大。