Свернуть / развернуть возможно в clojure / core.logi c? - PullRequest
1 голос
/ 09 мая 2020

Я ищу идиоматический c решатель удовлетворения ограничений, который может максимизировать или минимизировать целевую функцию, а не создавать список подходящих решений.

Если быть точным, меня больше интересует минимизация (например, расхода бензина на маршруте, который также должен удовлетворять другим ограничениям), но вопрос таков:

Сейчас я просматриваю core.logi c, и у меня сложилось впечатление, что этот модуль не делайте ни макс, ни мин. Насколько я понимаю, эта функция обычно обозначается как CLP. Core.logi c действительно упоминает CLP (FD) (https://github.com/clojure/core.logic/wiki/Features), но, глядя на описание, я продолжаю испытывать серьезные сомнения.

Не могли бы кто-нибудь прокомментировать это - как Полагаю, я перечитал бы всю книгу Reasoned Schemer?

1 Ответ

1 голос
/ 10 мая 2020

Исходный вопрос не очень конкретен c о том, какую задачу оптимизации он хочет решить. Обычно тип задачи оптимизации определяет, какой решатель подходит.

Однако многие проблемы оптимизации, возникающие в инженерном деле, состоят из целевых функций с линейными и квадратичными c членами, линейными ограничениями, вещественными и целочисленными переменными. Библиотека ojAl go отлично подходит для решения этих проблем. Например, если мы хотим минимизировать f(x, y) = x + 2y, где x и y являются целыми числами, и тремя линейными ограничениями x >= 2, y >= 3 и x + y >= 14.2, вот как решить эту проблему с помощью ojAl go в Clojure:

(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

Скорее всего, ваша проблема (неопределенно сформулирована как «расход бензина на маршруте, который также должен удовлетворять другим ограничениям» ) может быть выражено в формате, который может обрабатывать этот решатель. Но без дополнительных сведений трудно дать более точный ответ, чем этот.

Чтобы использовать ojAl go, вам нужно добавить зависимость [org.ojalgo/ojalgo "48.1.0"] к вашему Leiningen project.clj.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...