我试图使用R CRAN page中的nloptr
包来解决非线性优化问题。
library('nloptr')
#parameters
N_h <- c(39552, 38347, 43969, 36942, 41760)
s_h1 <- c(4.6, 3.4, 3.3, 2.8, 3.7)
s_h2 <- c(11.7, 9.8, 7.0, 6.5, 9.8)
s_h3 <- c(332, 357, 246, 173, 279)
Cost <- c(3,4,5,6,7)
C_cap <- c(1.5, 1.5, 1.5, 1.5, 1.5)
c<- Cost+C_cap
N <- sum(N_h)
d_h <- c(N_h/N)
d1 <-(d_h)^2*s_h1
d2 <-(d_h)^2*s_h2
d3 <-(d_h)^2*s_h3
#Objective
f0<-function(x, d1, d2, d3, c, Gamma){
return(x[1])
}
#Constraints
g0<- function(x, d1, d2, d3, c, Gamma){
return(c((c[1]*x[2]+c[2]*x[3]+c[3]*x[4]+c[4]*x[5]+c[5]*x[6]+x[7]*Gamma+sum(x[8:12])-x[1]),
(-x[7]-x[8]+c[1]*x[2]),
(-x[7]-x[9]+c[2]*x[3]),
(-x[7]-x[10]+c[3]*x[4]),
(-x[7]-x[11]+c[4]*x[5]),
(-x[7]-x[12]+c[5]*x[6]),
(d1[1]/x[2]+d1[2]/x[3]+d1[3]/x[4]+d1[4]/x[5]+d1[5]/x[6]-0.5037),
(d2[1]/x[2]+d2[2]/x[3]+d2[3]/x[4]+d2[4]/x[5]+d2[5]/x[6]-0.50868),
(d3[1]/x[2]+d3[2]/x[3]+d3[3]/x[4]+d3[4]/x[5]+d3[5]/x[6]-0.55),
(x[2]+x[3]+x[4]+x[5]+x[6]-1081)
))
}
#Initialization and algo
x0<-c(100, 10,10,10,10,10, 2, 2,2,2,2)
Rob2 <- nloptr(x0=x0,
eval_f = f0,
lb=c(-Inf, 2,2,2,2,2, 0, 0,0,0,0),
ub=c(Inf, 1000,1000,1000,1000,1000, Inf, Inf,Inf,Inf,Inf),
eval_g_ineq=g0,
opts=list("algorithm"="NLOPT_GN_MLSL",
maxeval=100000,
"xtol_rel"=1.0e-8,
"print_level" = 2),
d1=d1, d2=d2,d3=d3, c=c, Gamma=Gamma)
运行此算法时,错误如下:
Error in is.nloptr(ret) : inequality constraints in x0 returns NA
任何建议或帮助都会非常明显。!!
#Edit
原始问题如下
Min x[1]
subject to
-x[7]-x[8]+c[1]*x[2]<=0
-x[7]-x[9]+c[2]*x[3]<=0
..
..
x[2]+x[3]+x[4]+x[5]+x[6]-1081<=0
答案 0 :(得分:0)
我想这里的问题是你用初始x0包含常量值,你需要把它分别作为d1&lt; -2 d2&lt; -2