OptaPlanner基本概念

Problem Fact

Planning Entity

Planning Variable

Planning Value & Planning Value Range

Planning List Variable

Chained Planning Variable

为了实现一种时间上的链式结构,可以考虑使用Chained Planning Variable。这种结构经常在旅行商问题、货车调度等问题中出现

Chained Planning Variable允许Planning Entity指向对方(一个Planning Entity指向另一个Planning Entity)

通过把问题建模成一系列长链的形式(而不是图或者树),搜索空间大大减少了

一个Planning Variable是Chained当且仅当:

  • 直接指向一个Problem Fact或者Planning Entity(这叫一个Anchor)
  • 指向另一个Planning Entity(这个被指向的Planning Entity也需要有相同的Planning Variable,这个Planning Variable最终直接或间接指向了一个Anchor)
chainPrinciples

优化算法和OptaPlanner内建的Move会自动做链的修改,并且保证链修改过后仍然合法

chainCorrection

举个例子

对于一个旅行商问题来说,我可以定义Standstill这样的接口,从Standstill中衍生出Domicile和Visit,分别表示旅行商的起点和要访问的点

public interface Standstill {
    City getCity();
}
public class Domicile implements Standstill {
    public City getCity() { ... }
}
@PlanningEntity
public class Visit implements Standstill {
    public City getCity() { ... }
    @PlanningVariable(graphType = PlanningVariableGraphType.CHAINED)
    public Standstill getPreviousStandstill() { ... }
}

Planning Problem & Planning Solution