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