我正在尝试解决一个非线性优化问题,其中目标函数是非线性的,约束是线性的。我在 R 中阅读了一些关于 ROI 包的内容,我决定使用相同的包。但是,我在解决优化问题时遇到了一个问题。
我本质上是在试图最小化供需曲线下的区域。供需曲线的等式在代码中定义:
目标函数:最小化(供给曲线积分+需求曲线积分),
受约束 q 大于或等于 34155(存储在称为 ICR 的变量中),
q 大于或等于 0
和 q 小于或等于 40000。
我尝试通过 RStudio 中的 ROI 包运行它,但不断收到错误,告诉我找不到求解器。
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
我应该怎么做才能纠正此错误?
你可以使用ROI.plugin.alabama
或ROI.plugin.nloptr
来解决这个优化问题。
但是我研究了这个问题,这提出了几个问题。
- 代码中未定义
a
。 - 您声明
q
的长度为 1,并添加了 3 个约束表示
的线性约束q>= 34155, q>= 0, q <= 40000 或 q <= 1
我不完全确定,因为rhs
的长度是 4 但L
和dir
建议只有 3 个线性约束。
约束应该是什么样子的?
34155 <= q <= 40000?
然后,您可以将约束指定为边界并使用ROI.plugin.optimx
或者由于您有一个一维优化问题,只需使用优化从统计包 https://stat.ethz.ch/R-manual/R-devel/library/stats/html/optimize.html。
我没有使用ROI运行NLP。 但是,您必须安装 ROI 求解器插件,然后在代码中加载该库。 当前的求解器插件包括:
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/content/nonlinear-programming