簡體   English   中英

R 優化包

[英]Optimization packages for R

有誰知道 R 的任何優化包(類似於 S+ 的 NUOPT)?

R有許多優化包; 檢查優化的CRAN任務視圖: http//cran.r-project.org/web/views/Optimization.html 當然,對於非線性程序,有optim() ,它是標准的,包括Broyden-Fletcher-Goldfarb-Shanno算法和Nelder-Mead。 這是一個很好的開始。

您還應該嘗試使用Rglpk軟件包解決GLPK(GNU線性編程套件)中的 LP問題。

一個例子:

## Simple linear program.
## maximize:   2 x_1 + 4 x_2 + 3 x_3
## subject to: 3 x_1 + 4 x_2 + 2 x_3 <= 60
##             2 x_1 +   x_2 +   x_3 <= 40
##               x_1 + 3 x_2 + 2 x_3 <= 80
##               x_1, x_2, x_3 are non-negative real numbers

obj <- c(2, 4, 3)
mat <- matrix(c(3, 2, 1, 4, 1, 3, 2, 2, 2), nrow = 3)
dir <- c("<=", "<=", "<=")
rhs <- c(60, 40, 80)
max <- TRUE

Rglpk_solve_LP(obj, mat, dir, rhs, max = max)

R輸出:
(注意$status是一個整數,其中包含有關解決方案的狀態信息。如果設置了控制參數canonicalize_status(默認值),那么它將為找到的最佳解返回0,否則返回非零。如果設置了控制參數為FALSE它將返回GLPK狀態代碼)。

$optimum
[1] 76.66667

$solution
[1]  0.000000  6.666667 16.666667

$status
[1] 0

Galwegian提到的Linprog專注於通過單純形算法進行線性編程。 此外,如果您正在進行投資組合優化,您可能對fPortfolio感興趣。

用R.嘗試lpSolve

一個簡單的例子:

# Maximize 
#   x1 + 9 x2 +   x3 
# Subject to: 
#   x1 + 2 x2 + 3 x3 <= 9
# 3 x1 + 2 x2 + 2 x3 <= 15
f.obj <- c(1, 9, 3)
f.con <- matrix(c(1, 2, 3, 3, 2, 2), nrow = 2, byrow = TRUE)
f.dir <- c("<=", "<=")
f.rhs <- c(9, 15)

lp("max", f.obj, f.con, f.dir, f.rhs)
lp("max", f.obj, f.con, f.dir, f.rhs)$solution

我過去曾使用linprog來解決線性問題。

我喜歡Gurobi。 許可證的價格非常昂貴,但可以通過許多大學獲得。 http://www.gurobi.com/products/modeling-languages/r

看看NLoptr包。 它有相當廣泛的文檔,包含示例和許多算法可供選擇,具體取決於您要解決的問題(等線性,非線性,約束)

另一個包是ompr 該軟件包的一個優點是可以使用許多求解器,並且可以輕松添加binarycontinuousinteger所有變量。 一個簡單的例子:

library(tidyverse)
library(ompr)
library(ompr.roi)


model <-  MIPModel() %>%
  add_variable(x1, type = "integer") %>%
  add_variable(x2, type = "integer") %>%
  set_bounds(x1, lb = 0) %>%
  set_bounds(x2, lb = 0) %>%
  set_objective(x1 - x2, "max") %>%
  add_constraint(x1 + 2*x2 <= 150) %>%
  add_constraint(x1 >= 30) %>%
  add_constraint(x2 >= 40)

glpk解決:

library(ROI.plugin.glpk)
result <- solve_model(model, with_ROI(solver = "glpk", verbose = TRUE))

get_solution(result, x1)
get_solution(result, x2)

它也可以與其他求解像解決symphony ,其中gap_limit可以的情況下,這個問題很復雜,需要多次迭代收斂設置:

library(ROI.plugin.symphony)
result <- solve_model(model, with_ROI(solver = "symphony",
                                      verbosity=-1, gap_limit=1.5))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM