Как передать нелинейные целевые функции в пакет ROI в R? - PullRequest
0 голосов
/ 21 декабря 2018

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

По сути, я пытаюсь минимизировать площадь под кривой спроса и предложения.Уравнение для кривых спроса и предложения определяется в коде:

Целевая функция: минимизировать (интеграл кривой предложения + интеграл кривой спроса),
с учетом ограничений q больше или равно 34155 (хранится в переменной ICR),
q больше или равно 0
и q меньше или равно 40000.

Я попытался выполнить это через пакет ROI в RStudio, и япостоянно получаю сообщение об ошибке, сообщающее, что не найден решатель.

    library(tidyverse)
    library(ROI)    
    library(rSymPy)    
    library(mosaicCalc)

    # Initializing parameters for demand curve
    A1 <- 6190735.2198302800    
    B1 <- -1222739.9618776600    
    C1 <- 103427.9556133250    
    D1 <- -4857.0627045073    
    E1 <- 136.7660814828    


    # Initializing parameters for Supply Curve
    S1 <- -1.152    
    S2 <- 0.002    
    S3 <- a-9.037e-09    
    S4 <- 2.082e-13    
    S5 <- -1.64e-18    

    ICR <- 34155    

    demand_curve_integral <- antiD(A1 + B1*q + C1*(q^2)+ D1*(q^3) + E1*(q^4) ~q)    
    supply_curve_integral <- antiD(S1 + S2*(q) + S3*(q^2) + S4*(q^3) + S5*(q^4)~q)    

    # Setting up the objective function
    obj_func <- function(q){   (18.081*demand_curve_integral(q))+supply_curve_integral(q)}    

    # Setting up the optimization Problem

   lp <- OP(objective = F_objective(obj_func, n=1L),     
     constraints=L_constraint(L=matrix(c(1, 1, 1), nrow=3),     
                              dir=c(">=", ">=", "<="),     
                              rhs=c(ICR, 0, 40000, 1))),     
     maximum = FALSE)    

    sol <- ROI_solve(lp)

Это ошибка, которую я постоянно получаю в RStudio:

    Error in ROI_solve(lp) : no solver found for this signature:    
        objective: F    
        constraints: L    
        bounds: V    
        cones: X    
        maximum: FALSE    
        C: TRUE    
        I: FALSE    
        B: FALSE   

Что я должен сделать, чтобы исправить эту ошибку?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

В общем, вы можете использовать ROI.plugin.alabama или ROI.plugin.nloptr для этой задачи оптимизации.

Но я посмотрел на проблему, и это подняло несколько вопросов.

  1. aне определено в коде.
  2. Вы утверждаете, что q имеет длину 1, и добавляете 3 линейных ограничения, ограничения говорят:
    q> = 34155, q> = 0, q <= 40000 или q <= 1 <br>Яне совсем уверен, поскольку длина rhs равна 4, но L и dir предполагают наличие только 3 линейных ограничений.

Как должно выглядеть ограничение?

34155 <= q <= 40000? <br>Тогда вы можете указать ограничение в виде границ и использовать ROI.plugin.optimx или, поскольку у вас есть проблема одномерной оптимизации, просто используйте optimize из пакета stats https://stat.ethz.ch/R-manual/R-devel/library/stats/html/optimize.html.

0 голосов
/ 21 декабря 2018

Я не запускал НЛП с использованием ROI.Но вы должны установить плагин ROI Solver, а затем загрузить библиотеку в свой код.Текущие подключаемые модули решателя:

library(ROI.plugin.glpk)
library(ROI.plugin.lpsolve)
library(ROI.plugin.neos)
library(ROI.plugin.symphony)
library(ROI.plugin.cplex)

Neos предоставляет доступ к решателям NLP, но я не знаю, как передать параметры решателя с помощью вызова функции подключаемого модуля ROI.

https://neos -guide.org / содержание / нелинейного программирования

...