2016-06-10 158 views
3

我一直在試圖實現一個影子變量,以便我的一個問題事實可以跟蹤哪個計劃實體與它有關,最終目標是簡化/加速我的規則。InverseRelationShadowVariable必須屬於一個planningEntity嗎?

我正在查看optaplanner doc about shadow variables,特別是cloudBalancing示例。在「正常」雲平衡中,類CloudComputer而不是 a planningEntity。但在下面的例子中,它被註解爲一個planningEntity。

我們是否明白,「託管」影子變量的類應該是一個計劃實體?我認爲一個planningEntity必須有一個規劃變量,但CloudComputer沒有。如果答案是肯定的,我建議在文檔中更明確一些。如果答案爲否,那麼在這個例子中有一個錯誤(@PlanningEntity註釋應該從CloudComputer中刪除)。

下面的例子是從DOC:

對於非鏈可變規劃,雙向關係必須是多對一的關係。爲了映射表規劃變量之間的雙向關係,註釋主側(這是真實的一面),作爲一個正常的規劃變量:

@PlanningEntity 
public class CloudProcess { 

    @PlanningVariable(...) 
    public CloudComputer getComputer() { 
     return computer; 
    } 
    public void setComputer(CloudComputer computer) {...} 

} 

和:

@PlanningEntity 
public class CloudComputer { 

    @InverseRelationShadowVariable(sourceVariableName = "computer") 
    public List<CloudProcess> getProcessList() { 
     return processList; 
    } 

} 

而且,這是真的所有這一切都需要,以便在解決期間克隆CloudProcess以使processList保持最新狀態?

+0

您能否指出文檔中的哪些位置存在混淆,計劃實體可能包含陰影變量而不是'@ PlanningVariable'?我想解決這個問題。 –

+0

@GeoffreyDeSmet在4.3.3(關於計劃實體的部分)中指出:「每個計劃實體類都有一個或多個計劃變量。」另外,我認爲我沒有在影子變量的章節中看到關於計劃實體的任何提及,因爲這是一個非常重要的問題,他們應該在計劃實體類中。我意識到這就是爲什麼我的代碼不工作,只有當我試圖複製該示例,並注意到額外的註釋。 –

+0

固定爲7.0文檔 –

回答

1

有兩種規劃變量:真正的(@PlanningVariable)和影子變量。任何具有任一種或其組合的任何類都需要註釋爲@PlanningEntity(並且除非使用scanAnnotatedClasses,否則添加到解算器配置中)。

是的,這是因爲計劃克隆。使用影子變量時,CloudComputer在規劃期間不會更改,因此不需要進行規劃克隆。使用影子變量時,它會在計劃過程中發生變化,因此需要進行克隆。如果不計劃克隆,那麼當內部工作解決方案發生變化時,最佳解決方案將被破壞。這反過來會影響分數計算(如果它使用反向列表)以及任何最佳解決方案事件的消費者或由solve()返回的最佳解決方案結果。

+0

怎麼樣註釋深層克隆類? (對於類不包含任何真正的規劃變量的情況) –

+0

任何具有「@EntityEntity」的類都會被自動深度克隆,即使它只有陰影變量(因爲它們是被深度克隆的原因)。 –