Java Optaplanner和链接

Java Optaplanner和链接,java,optaplanner,Java,Optaplanner,我正在尝试使用OptaPlanner为以下场景实施解决方案: 我们想从A点到B点 我们可以利用的优势有限(我们的事实;每个都有出发点和目的地本身) 我们希望找到从A到B的最佳边序列,以便使边之间的总距离最小化 因此,任何优化结果都由一组边组成,其中第一条边从点a开始,最后一条边在点B结束,所有边都是直接连接的 我当前的模型如下所示: @PlanningSolution @Getter @Setter @NoArgsConstructor public class TaskAssigningS

我正在尝试使用OptaPlanner为以下场景实施解决方案:

  • 我们想从A点到B点
  • 我们可以利用的优势有限(我们的事实;每个都有出发点和目的地本身)
  • 我们希望找到从A到B的最佳边序列,以便使边之间的总距离最小化
  • 因此,任何优化结果都由一组边组成,其中第一条边从点a开始,最后一条边在点B结束,所有边都是直接连接的
我当前的模型如下所示:

@PlanningSolution
@Getter
@Setter
@NoArgsConstructor
public class TaskAssigningSolution {
    // Our facts: We'd like to go from A to B
    private GeoPoint departureLocation;
    private GeoPoint destinationLocation;

    // Available edges, i.e., database contents
    @ProblemFactCollectionProperty
    @ValueRangeProvider(id = "edgeRange")
    private List<Edge> availableEdges;

    @PlanningEntityCollectionProperty
    @ValueRangeProvider(id = "taskRange")
    private List<Task> tasks = new ArrayList<>();

    @PlanningScore
    private HardSoftScore score;

    public TaskAssigningSolution(GeoPoint departureLocation, GeoPoint destinationLocation,
                                 List<Edge> availableEdges) {
        this.departureLocation = departureLocation;
        this.destinationLocation = destinationLocation;
        this.availableEdges = availableEdges;
    }

@Getter
@Setter
@NoArgsConstructor
@PlanningEntity
public class Task {

    @AnchorShadowVariable(sourceVariableName = "previousTask")
    private Edge edge;

    // FIXME: the problem lies here, as I cannot use the edgeRange provider and the taskRange is empty. 
    @PlanningVariable(valueRangeProviderRefs = {"taskRange"}, graphType = PlanningVariableGraphType.CHAINED)
    private Task previousTask;

    // Shadow variables
    @InverseRelationShadowVariable(sourceVariableName = "previousTask")
    private Task nextTask;
}
@PlanningSolution
@吸气剂
@塞特
@诺尔格构装师
公共类任务分配解决方案{
//我们的事实:我们想从A到B
私人地质点位置;
专用地质点定位;
//可用边缘,即数据库内容
@问题FactCollectionProperty
@ValueRangeProvider(id=“Edgerage”)
可用的私有列表;
@PlanningEntityCollectionProperty
@ValueRangeProvider(id=“taskRange”)
私有列表任务=新建ArrayList();
@计划分数
私人硬软件评分;
公共任务分配解决方案(地质点出发点位置、地质点目的地位置、,
列出可用的页面){
this.departureLocation=departureLocation;
this.destinationLocation=destinationLocation;
this.availabledges=availableEdges;
}
@吸气剂
@塞特
@诺尔格构装师
@规划实体
公开课任务{
@AnchorShadowVariable(sourceVariableName=“previousTask”)
私人边缘;
//FIXME:问题就在这里,因为我无法使用Edgerage提供程序,并且taskRange是空的。
@PlanningVariable(valueRangeProviderRefs={“taskRange”},graphType=PlanningVariableGraphType.CHAINED)
私有任务优先任务;
//阴影变量
@InverseRelationShadowVariable(sourceVariableName=“previousTask”)
私有任务nextTask;
}
但是,这不起作用,因为生成的解决方案为空。taskRange ValueProvider不会返回任何任务,因为这些任务尚未生成

我认为任务是边缘的实现。因此,我希望OptaPlanner生成任务,其中插入了(随机)基本边缘,而基本边缘反过来会链接到其他任务


如何实现预期行为?

不要使用OptaPlanner来找到从A到B的最佳路径。这不是NP难。使用A*搜索算法(=Dijkstra的更好形式)。为什么?这不是一个约束解决AI问题


但是,如果您需要找到最佳路线,请访问多个位置(TSP或VRP)然后它是NP难的,然后使用OptaPlanner。

感谢您将问题放在正确的角度。如上所述,这个问题可能会通过路径查找算法解决。但是,在这个简单的示例中,还有许多约束尚未建模,因为我想从一个尽可能简单的用例开始。那么,如何解决呢您使用路径查找算法来查找最佳使用可用装运空间、准时且满足其他几个约束条件的路径?我认为OptaPlanner非常适合。