【发布时间】:2019-09-27 20:59:41
【问题描述】:
在求解过程中,有没有办法让某些路径优先于其他路径?这确实是一个性能问题。当我将所有逻辑放在一起时,它会生成 1000 个解决方案,这需要成倍增加的时间。这些确实都是有效的解决方案,所以我可以做类似(run 1 …) 而不是(run* …) 的事情,但这给了我一个任意的解决方案。我想要做的是能够提供一些关于哪些路径更好的提示。
我知道,我可以通过使用自定义比较器对它们进行排序来获得一个最佳答案,但这无助于解决性能问题。
这是一个简化的、人为的例子:
(require
'[clojure.core.logic :refer :all]
'[clojure.core.logic.fd :as fd]))
(defn multipleo
[multiple value domain]
(fresh [n]
(fd/in multiple domain)
(fd/in n (fd/interval 1 10))
(fd/* n multiple value)))
(run* [q]
(multipleo q 60 (fd/domain 30 24 15 12)))
=> (12 15 30)
12、15 和 30 都是有效的解决方案,但我想要的是最大的 (-> *1 sort last),但我还是想用求解器来做,所以 (run 1 [q] (multipleo q 60 (fd/domain 30 24 15 12))) 理想情况下会产生 (30)。
【问题讨论】:
-
我不知道 fd,但对于普通逻辑变量,您可以简单地将“首选”路径放在
conde或其他任何其他路径之前,然后首先搜索。
标签: clojure clojure-core.logic