【问题标题】:Optimization packages for RR 的优化包
【发布时间】:2010-09-26 10:39:02
【问题描述】:

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

【问题讨论】:

  • 否决“这个问题没有显示任何研究工作”
  • 我“可以”把这个问题变成一个很长的问题,谈论我需要什么以及我如何调查 linprog 并发现它需要的细节。或者我可以问一个非常简单的问题。我支持这个决定。顺便说一句,虽然我不同意你对我投反对票的理由,但至少你有礼貌地给出一个理由。谢谢你的礼貌。
  • 如果你告诉我们你在哪里看过,那么这将显示出一些研究工作——即使是一个简单的“我搜索谷歌或 cran 进行'优化'”也会有所帮助。我们不应该让人们查看任务视图...如果您发现需要 linprog,为什么要接受“我使用过 linprog”的答案?
  • 它在 google 搜索中的“linear optimization r”下出现在第 3 位,这意味着我们应该对它进行实际操作,并将其作为未来搜索者的参考。

标签: r mathematical-optimization


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您还应该尝试使用Rglpk 包解决与GLPK (GNU Linear Programming Kit) 的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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        用 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
        

        【讨论】:

          【解决方案5】:

          我过去曾使用linprog 解决线性问题。

          【讨论】:

          • +1 非常感谢。自从我的 TurboPascal 时代以来,我还没有接触过任何优化的东西。软件包页面 (cran.r-project.org/web/packages) 中列出了一大堆其他优化软件包。
          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

              另一个包是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))
              

              【讨论】:

                猜你喜欢
                • 2020-10-16
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-07-23
                相关资源
                最近更新 更多