簡體   English   中英

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(...)連接器需要在兩邊都使用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))
        ...
}

在這種情況下,您將NodeEdge連接起來,因此equal(...)連接器需要使用左側的Node和右側的Edge ,如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM