[英]Minimize/maximize possible in clojure / core.logic?
我正在寻找一个惯用的约束满足求解器,它可以最大化或最小化目标 function,而不是生成匹配解决方案的列表。
准确地说,我对最小化(例如,必须满足其他约束的路线上的汽油消耗量)更感兴趣,但问题是:
我目前正在查看 core.logic 并且我的印象是该模块不会做最大值或最小值。 据我了解,该功能通常会专门表示为 CLP。 Core.logic 确实提到了 CLP(FD) ( https://github.com/clojure/core.logic/wiki/Features ),但是看着描述,我一直有严重的疑问。
有人可以对此发表评论吗-我想我浏览整本 Reasoned Schemer 的书太多了?
最初的问题对于它想要解决什么样的优化问题并不是很具体。 通常,优化问题的类型将决定哪个求解器是合适的。
然而,工程中出现的许多优化问题包括具有线性和二次项、线性约束、实数和 integer 变量的目标函数。 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
很有可能您的问题(模糊地表述为“路线上的汽油消耗也必须满足其他约束” )可以用此求解器可以处理的格式表示。 但是没有更多细节,很难提供比这更准确的答案。
要使用 ojAlgo,您需要将[org.ojalgo/ojalgo "48.1.0"]
依赖项添加到您的 Leiningen project.clj
中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.