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
,其中 x
和 y
是整数,并且三个线性约束 x >= 2
、y >= 3
和 x + 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
。
我正在寻找可以最大化或最小化目标函数的惯用约束满足求解器,而不是生成匹配解决方案列表。
准确地说,我更感兴趣的是最小化(例如,一条路线上的汽油消耗还必须满足其他约束条件),但问题是:
我目前正在查看 core.logic,我的印象是该模块不会执行最大值或最小值。据我了解,该功能通常会专门表示为 CLP。 Core.logic确实提到了CLP(FD) (https://github.com/clojure/core.logic/wiki/Features),但是看了描述,我一直心存疑虑。
有人可以对此发表评论吗 - 我想我看完整本 Reasoned Schemer 书会太多了吧?
原题并没有很具体的说明要解决什么样的优化问题。通常,优化问题的类型将决定哪个求解器是合适的。
然而,工程中出现的许多优化问题由 objective 具有线性和二次项、线性约束、实数和整数变量的函数组成。 ojAlgo 库非常适合解决这些问题。例如,如果我们想要最小化 f(x, y) = x + 2y
,其中 x
和 y
是整数,并且三个线性约束 x >= 2
、y >= 3
和 x + 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
。