Optaplanner 约束流加入问题事实和规划实体

Optaplanner Constraint Streams Join Problem Fact and Planning Entity

我正在尝试加入规划实体和约束流中的问题事实,但我的 IDE 对此抛出错误:Cannot resolve method 'join(java.lang.Class<Edge>, org.optaplanner.core.api.score.stream.bi.BiJoiner<A,B>)'

我的问题结构与运输问题非常相似。我有节点和边,想计算边的数量。

我的主要问题事实是:

class Node{
   UUID id;
   int itemsInInventory;
   ...
}

以及策划主体:

@PlanningEntity
class Edge{
   Node from;
   Node to; 
   @PlanningVariable
   int itemsTransported;

   getFromId(){return from.getId()}
   getToId(){return to.getId()}

}

约束的代码是:

public Constraint minimizeShortage(ConstraintFactory constraintFactory) {
    return constraintFactory.from(Node.class)
            .join(Edge.class, equal(Edge::getFromId, Edge::getId))
            ...
}

如果我尝试将边与边连接起来,例如:

public Constraint minimizeShortage(ConstraintFactory constraintFactory) {
    return constraintFactory.from(Node.class)
            .join(Node, equal(Node:: getId, Node::getId)) //EDITED
            ...
}

这没有错误。是因为我尝试将节点加入节点中边缘 属性 上的边缘吗?还有其他方法可以做我想做的事吗?

我不得不说我不明白你后面的例子是如何工作的:

public Constraint minimizeShortage(ConstraintFactory constraintFactory) {
    return constraintFactory.from(Node.class)
        .join(Node, equal(Node:: getId, Edge::getId))
        ...
}

在这种情况下,您将加入 Node 和另一个 Node。因此 equal(...) joiner 需要在两侧使用 Node,如下所示:

public Constraint minimizeShortage(ConstraintFactory constraintFactory) {
    return constraintFactory.from(Node.class)
        .join(Node.class, equal(Node::getId, Node::getId))
        ...
}

或者,更简短地说:

public Constraint minimizeShortage(ConstraintFactory constraintFactory) {
    return constraintFactory.from(Node.class)
        .join(Node.class, equal(Node::getId))
        ...
}

这也是您的第一个示例无法编译的原因:

public Constraint minimizeShortage(ConstraintFactory constraintFactory) {
    return constraintFactory.from(Node.class)
        .join(Edge.class, equal(Edge::getFromId, Edge::getId))
        ...
}

在这种情况下,您要用 Edge 连接 Node,因此 equal(...) 连接器需要在左侧使用 Node,在左侧使用 Edge右边,像这样:

public Constraint minimizeShortage(ConstraintFactory constraintFactory) {
    return constraintFactory.from(Node.class)
        .join(Edge.class, equal(Node::getId, Edge::getFromId))
        ...
}