約束式編程

幾年前讀到一本名叫《七周七語言》(Seven Languages in Seven Weeks)的書,略略認識了 Prolog 這種像是老舊而基於約束的編程語言,感覺很有趣,因為我不用設計尋找方程解的邏輯,而是輸入我所需要的條件,它便幫我找出答案,或為一些規劃(例如時間表和分組安排)進行最佳化。

到近期因為一些原因,我又在找類似的方案,特別是在找 Java 上的實現,好讓我可以直接在常用的平台做類似的事情。

我先找到了 OptaPlanner,它由 JBoss Community 維護,但建模似乎更複雜,我未太明白。

我亦找到了 Google 推出的 or-tools,但它的說明文件比較混亂。

後來我找到了 Java 平台上有 JSR-331 這標準(連結連結連結連結連結),大家可按著這共有的編程介面,配合不同的實現,建構出基於約束的解題程式。可惜網上的資源並不算太多,我亦不太肯定各種實現的實現和更新情況。那些開發商的非 JSR-331 實現反而可能更好(例子)。當然這標準值得留意。

我退而求其次,撇開 Java 這個條件,反而找到了一種名叫 MiniZinc 的語言,算易編寫,我寫了一個簡單的程式,找出符合條件的最大數字:
Capture-minizinc

它其實也有 Java 上的接近的實現,但我也未試過。

這個網站有大量基於不同語言和建模方式的約束式編程範例程式,很值得參考。

參考連結:
Wikipedia - Constraint programming

本文連結