我們剛剛開始使用Optaplanner來開展項目。我們有一個非常簡單的解決方案設置如下:Optaplanner何時以及如何評估規則?
Job -> PlanningEntity, PlanningVariable=Resource from resourcesList
Resource -> POJO
Solution
- List<Job> PlanningEntityCollectionProperty
- List<Resource> ProblemFactCollectionProperty, resourcesList
我們已經設置了一些測試規則。第一條規則是簡單地說,不具有三個以上喬布斯資源:
rule "noMoreThan3JobsPerResource"
when
$resource : Resource()
$totalJobsOnResource : Number(intValue > 3) from accumulate (
Job(
resource == $resource,
$count : 1),
sum($count)
)
then
scoreHolder.addHardConstraintMatch(kcontext, 3 - $totalJobsOnResource.intValue());
end
我們要明白什麼是如何以及何時Drools的規則進行評估。舉例來說,如果我們添加這兩個規則:
rule "logWhenResource"
when
$resource: Resource()
then
System.out.println("RESOURCE encountered");
end
rule "logWhenJob"
when
$job : Job()
then
System.out.println("JOB encountered");
end
我們得到「作業遇到」在日誌中,但從來沒有「資源遭遇」。然而,我們的第一條規則有$ resource:Resource()在什麼時候? optaplanner是否在放置工作時觸發規則(在我們的示例中)?我們爲什麼logWhenResource不火只是有點不清楚,但確實noMoreThan3JobsPerResource(當它們都試圖與「匹配」資源對象?是資源作業已被移動到?
提前感謝
資源
嗨傑弗裏 我認爲我的問題是更高的水平,什麼時候評估規則?是否每次考慮移動?在上面的例子中,如果我們有2個資源和10個工作,每次考慮移動時規則1會觸發兩次,規則2會觸發10次?或者規則中的模式只選擇已移動的對象?例如,如果工作7被移動,將會規則2點燃一次(僅匹配工作2)還是10次(匹配所有工作)? – user3707
試着將System.out放在'then'一側。但打開跟蹤日誌記錄清楚地看到每個fireAllRules()也出現在哪裏。它會進行增量計算,所以它只會觸發該增量。 –