Minimize/maximize 在 clojure 中可能/core.logic?

Minimize/maximize possible in clojure / core.logic?

我正在寻找可以最大化或最小化目标函数的惯用约束满足求解器,而不是生成匹配解决方案列表。

准确地说,我更感兴趣的是最小化(例如,一条路线上的汽油消耗还必须满足其他约束条件),但问题是:

我目前正在查看 core.logic,我的印象是该模块不会执行最大值或最小值。据我了解,该功能通常会专门表示为 CLP。 Core.logic确实提到了CLP(FD) (https://github.com/clojure/core.logic/wiki/Features),但是看了描述,我一直心存疑虑。

有人可以对此发表评论吗 - 我想我看完整本 Reasoned Schemer 书会太多了吧?

原题并没有很具体的说明要解决什么样的优化问题。通常,优化问题的类型将决定哪个求解器是合适的。

然而,工程中出现的许多优化问题由 objective 具有线性和二次项、线性约束、实数和整数变量的函数组成。 ojAlgo 库非常适合解决这些问题。例如,如果我们想要最小化 f(x, y) = x + 2y,其中 xy 是整数,并且三个线性约束 x >= 2y >= 3x + y >= 14.2,下面是如何在 Clojure 中使用 ojAlgo 解决这个问题:

(ns playground.ojalgo
  (:import [org.ojalgo.optimisation ExpressionsBasedModel]))

(defn demo []
  (let [model (ExpressionsBasedModel.)
        ;; Declare variables

        ;; X has lower limit 2
        x (-> (.addVariable model)
              (.lower 2)
              (.integer true))

        ;; Y has lower limit 3
        y (-> (.addVariable model)
              (.lower 3)
              (.integer true))]

    ;; Objective function: Minimize x + 2y
    (-> (.addExpression model)
        (.set x 1.0)
        (.set y 2.0)
        (.weight 1.0)) ;; <-- Terms in the objective function
                       ;;     need a weight.

    ;; Linear constraint: x + y >= 14.2
    (-> (.addExpression model)
        (.set x 1.0)
        (.set y 1.0)
        (.lower 14.2))

    (let [result (.minimise model)]
      (println "Result" result)
      (println "Objective function value: " (.getValue result))
      (println "Optimal X value: " (.getValue x))
      (println "Optimal Y value: " (.getValue y)))))

哪个会显示

Result #object[org.ojalgo.optimisation.Optimisation$Result 0xb755873 OPTIMAL 18.0 @ { 12, 3 }]
Objective function value:  18.0
Optimal X value:  12M
Optimal Y value:  3M

很可能您的问题(含糊地表述为 "gasoline consumption on a route that must also satisfy other constraints")可以用此求解器可以处理的格式来表达。但没有更多细节,很难提供比这更准确的答案。

要使用 ojAlgo,您需要将 [org.ojalgo/ojalgo "48.1.0"] 依赖项添加到您的 Leiningen project.clj