Исходный вопрос не очень конкретен 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
.