gc_pwl_func。R


本例考虑以下非凸非线性问题# #最大狗万app足彩化2 x + y #受制于exp(x) + 4 sqrt(y) <= 9 # x, y >= 0 # #我们向您展示两种方法来解决这个问题:# # 1)使用分段线性方法来处理一般函数#约束(如exp和sqrt)。# a)添加两个变量# u = exp(x) # v = sqrt(y) # b)计算一些步长(例如,x # = 0,1e -3, 2e-3,…)的u = exp(x)点(x, u), xmax)和v = sqrt(y)的点(y, v)对于#一些步长(例如,y = 0,1e -3, 2e-3,…)ymax)。我们需要#计算xmax和ymax(这在本例中很容易,但这个#通常不成立)。# c)使用这些点添加两个类型为#分段线性的一般约束。2)直接使用Gurobis内置的通用函数约束(EXP #和POW)。在这里,我们不需要计算点和最大的#可能值,这将由Gurobi在内部完成。在这种方法中,我们展示了如何“放大”最优解并收紧公差以提高解的质量。Library (gurobi) printsol <- function(model, result) {print(sprintf('%s = %g, %s = %g', model美元varnames[1],结果美元x[1],模型美元varnames[3],结果美元X [3])) print(sprintf('%s = %g, %s = %g', model美元varnames[2],结果美元x[2],模型美元varnames[4],结果美元x[4])) print(sprintf('Obj = %g', + result美元#计算违反exp(x) + 4 sqrt(y) <= 9vio <- exp(result)美元X[1] + 4 *根号(结果美元x[2]) - 9 if (vio < 0.0) vio <- 0.0 print(sprintf(' vio = %g', vio))} model <- list() # 4变量x, y, u, v,一个线性约束u + 4*v <= 9模型美元变量名<- c('x', 'y', 'u', 'v')模型美元Lb <- c(rep(0,4)))模型美元b <- c(rep(Inf, 4))模型美元A <-矩阵(c(0,0,1,4), nrow = 1)模型美元rhs <- 9 #目标模型美元Modelsense <- 'max'模型美元obj <- c(2,1,0,0) #第一种方法:PWL约束模型美元genconpwl <- list() intv <- 1e-3 # Approximate u \ Approximate exp(x),等距点在[0,xmax], xmax = log(9)模型美元Genconpwl [[1]] <- list() model美元genconpwl [[1]]美元xvar <- 1L模型美元genconpwl [[1]]美元yvar <- 3L xmax <- log(9) point <- 0 t <- 0 while (t < xmax + intv) {point <- point + 1模型美元genconpwl [[1]]美元Xpts[点]<- t模型美元genconpwl [[1]]美元ypts[point] <- exp(t) t <- t + intv} # Approximate v \ approxsqrt (y),在[0,ymax], ymax =(9/4)^2模型中相等的点美元Genconpwl [[2]] <- list() model美元genconpwl [[2]]美元xvar <- 2L模型美元genconpwl [[2]]美元yvar <- 4L ymax <- (9/4)^2 point <- 0 t <- 0 while (t < ymax + intv) {point <- point + 1模型美元genconpwl [[2]]美元Xpts[点]<- t模型美元genconpwl [[2]]美元ypts[point] <- sqrt(t) t <- t + intv} #求解和打印结果= gurobi(model) printsol(model, result) #第二种方法:通用函数约束方法,通过gurobi #自动转换PWL #美元genconpwl <- NULL #设置u \近似exp(x)模型美元Genconexp <- list()模型美元Genconexp [[1]] <- list() model美元genconexp [[1]]美元xvar <- 1L模型美元genconexp [[1]]美元yvar <- 3L模型美元genconexp [[1]]美元name <- 'gcf1' #设置v \approx sqrt(y) = y^0.5模型美元Genconpow <- list()模型美元Genconpow [[1]] <- list() model美元genconpow [[1]]美元xvar <- 2L模型美元genconpow [[1]]美元yvar <- 4L模型美元genconpow [[1]]美元<- 0.5模型美元genconpow [[1]]美元name <- 'gcf2' #离散参数:使用length = 1e-3的等长参数<- list()参数美元FuncPieces <- 1个参数美元FuncPieceLength <- 1e-3 #求解和打印结果result = gurobi(model, params) printsol(model, result) #放大,使用最优解缩小范围,使用较小的# pclen=1-5来解析模型美元Lb [1] <- max(model美元磅[1],结果美元X[1] - 0.01)模型美元u[1] <- min(model美元乌兰巴托[1],结果美元X[1] + 0.01)模型美元Lb [2] <- max(model美元磅[2],结果美元X[2] - 0.01)模型美元u[2] <- min(model美元乌兰巴托[2],结果美元X[2] + 0.01)参数美元<- 1e-5 #求解和打印结果= gurobi(model, params) printsol(model, result) #清空空间rm(model, result)