11

有谁知道 R 的任何优化包(类似于 S+ 的 NUOPT)?

4

8 回答 8

19

R有很多很多的优化包;检查关于优化的 CRAN 任务视图:http: //cran.r-project.org/web/views/Optimization.html。当然,对于非线性程序,有optim()标准的,包括 Broyden-Fletcher-Goldfarb-Shanno 算法和 Nelder-Mead。这是一个很好的开始。

于 2009-07-27T21:23:39.600 回答
6

您还应该尝试使用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
于 2013-01-06T05:13:54.077 回答
5

Galwegian 提到的 Linprog 专注于通过单纯形算法进行线性规划。此外,如果您正在进行投资组合优化,您可能会对fPortfolio感兴趣。

于 2009-01-12T16:20:54.740 回答
5

使用 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
于 2013-01-06T04:55:30.267 回答
3

我过去曾将linprog用于线性问题。

于 2008-12-11T14:06:56.157 回答
2

另一个包是ompr。该软件包的一个优点是可以使用许多求解器,并且可以binary轻松添加所有变量。一个简单的例子:continuousinteger

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)

也可以使用其他求解器来求解,例如symphonygap_limit问题复杂且需要多次迭代才能收敛的情况下可以设置的位置:

library(ROI.plugin.symphony)
result <- solve_model(model, with_ROI(solver = "symphony",
                                      verbosity=-1, gap_limit=1.5))
于 2021-11-03T05:51:58.157 回答
1

看看NLoptr包。它有相当广泛的文档,其中包含示例和大量算法可供选择,具体取决于您要解决的问题(等线性、非线性、约束)

于 2019-06-20T13:44:55.183 回答
1

我喜欢古罗比。许可证非常昂贵,但可以通过许多大学获得。见这里http://www.gurobi.com/products/modeling-languages/r

于 2017-01-11T01:47:08.087 回答