2015-04-06 84 views
0

在OptaPlanner求解短語期間,我希望更新一個全局變量。全局變量的更改將修改我的下一個規則驗證。如何在OptaPlanner中聲明非靜態全局變量

Result.java

package com.domain; 

public static boolean status; 
... 
... 

Sample.drl

import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScoreHolder;  
import com.domain.Result; 
global HardSoftScoreHolder scoreHolder; 

rule "Sample Rule" 
when 
$PlanningEntity:PlanningEntity() 
then 
somelogic($PlanningEntity); 
if(Result.status){ 
    scoreHolder.addHardConstraintMatch(kcontext, -500); 
} 
end 

function void somelogic(PlanningEntity planningEntity){ 
    if(condition 1...){ 
     Result.status = true; 
    }else if(condition 2...){ 
     Result.status = false; 
    }else{ 
     //Do Nothing 
    } 
} 

我的問題:

我怎樣才能宣佈每解決屆靜態全局變量。 (爲了避免多個用戶在同一時間執行OptaPlanner求解器)。

回答

0

當前,您無法可靠地使用全局變量,因爲OptaPlanner可能會產生多個drools會話(需要未來的功能,如多線程求解,基於人口的啓發式,...)。

解決方法很簡單:只需添加單例問題事實並使用它。請參閱示例中的*Parametrization類。

+0

但是,這些Drools會話是否都會成爲一個用戶會話的一部分(即執行Java應用程序)?因此,不會有那種交叉火力OP似乎害怕。 - 順便說一句,Drools參考手冊甚至沒有聲明在同一個Java程序中運行的會話之間共享全局變量(但我以某種方式記住了它)。 – laune 2015-04-06 14:01:40

+0

optaplanner中使用的每個drools會話都需要擁有它自己的全局實例(除非它是一個線程安全的記錄器(或者其他的它只作爲接收器,從不作爲源),創建這些實例需要通過回調,因爲optaplanner可能產生它所需的任何數量的drools會話(儘管目前它只在正常執行中產生1個) – 2015-04-06 20:14:25

+0

是否可以使用影子變量或將變量添加到opta-planner中的工作內存(就像分數保持器一樣) ?????????????????????????????????????????????????????????????????????????????????????????????????????????? 「在規則和更新事實... – 2015-04-07 04:53:41