【问题标题】:Minimize/maximize possible in clojure / core.logic?在 clojure / core.logic 中最小化/最大化可能?
【发布时间】:2020-05-09 16:36:24
【问题描述】:

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

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

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

有人可以对此发表评论吗?我猜,因为我通读整本 Reasoned Schemer 的书太多了?

【问题讨论】:

  • 您能否提供一个代表您要解决的问题类型的优化问题示例?目标函数是什么?有什么限制?未知数是实数还是整数?
  • @Rulle 例如,在物料清单中,您必须从众多潜在供应商中找到最佳组合,每个供应商都提供一些所需的物品,但价格和质量因情况而异。因此,您希望在满足质量标准的同时最大限度地降低成本。
  • 这听起来像是一个线性规划 (en.wikipedia.org/wiki/Linear_programming) 问题。我在回答中提到的 ojAlgo 对此很有用。如果您具体而准确地说明目标函数是什么、项目是什么、质量标准是什么等,那么有人可能会提供帮助。
  • 谢谢。猜猜,我必须先玩一下你建议的库,然后才能提出一个好问题。
  • 不客气。我建议您首先列出您的变量,这可能是每个供应商的每件商品的数量。最小化的目标函数将是按单位价格加权的所有数量的总和。然后对于最低可接受质量,每种类型的项目都会有一个线性不等式约束。您可以使用我回答中的示例作为模板。

标签: clojure clojure-core.logic


【解决方案1】:

最初的问题对于它想要解决什么样的优化问题并不是很具体。通常,优化问题的类型将决定哪种求解器是合适的。

然而,工程中出现的许多优化问题由具有线性和二次项、线性约束、实数和整数变量的目标函数组成。 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

您的问题(含糊地说为“路线上的汽油消耗还必须满足其他约束”)可能是您的问题可以用这个求解器可以处理的格式表示。但是没有更多细节,很难提供比这更准确的答案。

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

【讨论】:

  • 谢谢。我认为,这个功能就足够了 从数学的角度来看,我要解决的问题非常简单——我很惊讶原生 Clojure 工具没有涵盖有人对 最佳感兴趣的情况> 解决方案。
猜你喜欢
  • 2014-07-10
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
相关资源
最近更新 更多