2014-02-05 98 views
0

我有一組方程。我也有一組值和方程的結果。 喜歡的東西:將方程求解爲CSP

a + b + c = x 

和一些分配可能是:

1 + 1 + 1 = 3 

2 + 3 + 4 = 9 

然而,實際的方程是更長的時間,可能會包含一些功能,例如對數。

我現在需要改變給定集合的結果,方式是(1)方程變得等於特定值xx和(2)參數變化儘可能小。

以爲可以解決這個作爲CSP通過改變eqation到

(a + ax) + (b + bx) + (c + cx) = xx 

其中a,b和c對應的舊值和斧子,BX和CX是需要被施加的差異到相應的舊值。而xx將是我想要的方程式的結果。注意,a,b,c,xa,xb,cx等都是整數值,並且xx將總是在與x的一定距離內,即xx - d < x < xx + d

在CSP中,b,c和xx將被視爲問題事實,ax,bx,cx將被視爲Planning變量,並且方程(a + ax) + (b + bx) + (c + cx) = xx將是一個硬性約束。最小化所有的ax,ab,ac將是一個軟約束。 我並沒有在這裏看到一個Planning實體。

global HardSoftScoreHolder scoreHolder; 


rule "changeIsBad" 
    when 
     DeltaVariable($delta : delta) 
    then 
     scoreHolder.addSoftConstraintMatch(kcontext, -Math.abs(delta)); 
end 

rule "equationMustBeEqual" 
    // No idea? 
end 

但我無法弄清楚如何從這裏繼續。 Optaplanner是否可行這種問題?看起來所有的PlanningVariable都必須來自列表,並且必須是實例,而我只有整數值。我的模型是否正確?

+0

線性規劃方法可能更簡單。你考慮過了嗎? –

+0

我不認爲線性規劃是可行的,因爲方程不一定是線性的。 – Mene

回答

1

可以包裝每個整數變量在一個實體類,如下所示:

@PlanningEntity 
public class MyEntity { 

    private Integer myVariable; 

    @PlanningVariable(...) 
    public Integer getMyVariable() {...} 
    ... 
} 

此外,使用一個規劃實體範圍定義的每個變量的範圍(因爲它每實體不同),見官方的文檔部分「4.3.5.2.2。規劃實體上的ValueRangeProvider」(並且不要使用SwapMove's,我猜只能使用ChangeMove)。

但總的來說,我並不是100%確定這是否適合這項工作。我很想知道你對這個用例的體驗結果。 PS:從6.1.0.Beta1(尚未發佈,但夜間可用)開始,我們在nightly docs的「4.3.5.2.4。ValueRangeFactory」部分中介紹了IntValueRange,這對於這些類型更有效的用例。

+0

感謝您的提示。每個變量有一個ValueRangeProvider對我來說是有意義的。我會讓你知道結果。 – Mene