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))
...
}
我正在尝试加入规划实体和约束流中的问题事实,但我的 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))
...
}