gc_pwl_func.py


# !/usr/bin/env python3.7 # 2023年版权,Gurobi优化狗万app足彩,LLC #这个例子中考虑以下非凸非线性问题# # 2 x + y最大化#受exp (x) + 4倍根号(y) < = 9 # x, y > = 0 # #我们给你两种方法解决这个问题:# # 1)使用分段线性方法来处理通用功能#约束(如exp和sqrt)。#)添加两个变量# u = exp (x) # v = sqrt (y) # b)计算点(x, u) u = exp (x)的步长(如x # = 0、1 e - 3, 2 e - 3,…xmax)和点(y v v =√(y) #一些步长(例如,y = 0、1 e - 3 2 e - 3,…ymax)。我们需要#计算xmax和ymax(这是容易的对于这个示例,但这个#不一般)。# c)使用点添加两个通用类型#分段线性的约束。# # 2)直接使用Gurobis内置的通用函数约束(EXP #和战俘)。在这里,我们不需要计算点和最大可能的值,这将被Gurobi内部完成。在这个#的方法中,我们展示了如何“放大”最优解和#紧公差来提高解决方案的质量。#从gurobipy进口进口数学进口gurobipy gp伽马线暴def printsol (m, x, y, u, v):打印(x =”+ str (x.X) +, u = + str (u.X))打印(y = ' + str (y.X) +, v = + str (v.X))打印(' Obj = ' + str (m.ObjVal)) #计算违反exp (x) + 4倍根号(y) < = 9 vio = math.exp (x.X) + 4 * math.sqrt (y.X) - 9如果vio < 0: vio = 0打印(' vio = ' + str (vio))试题:#创建一个新的模型m = gp.Model() #创建变量x = m.addVar (name = ' x ') y = m.addVar (name = ' y ') u = m.addVar (name = ' u ') v = m.addVar (name = ' v ') #设置目标。setObjective (2 * x + y, GRB.MAXIMIZE) #添加约束lc = m。addConstr (u + 4 * v < = 9) #方法1)PWL约束方法xpt材料= []ypts = [] upts = [] vpts = [] intv = 1 e - 3 xmax = math.log (9) t = 0.0时t < xmax + intv: xpts.append (t) upts.append (math.exp (t)) t + = intv ymax = (9.0 / 4) * (9.0 / 4) t = 0.0时t < ymax + intv: ypts.append (t) vpts.append (math.sqrt (t)) t + = intv gc1 = m。addGenConstrPWL (x, u, xpt材料、upts gc1) gc2 = m。addGenConstrPWL(y, v, ypts, vpts, "gc2") # Optimize the model m.optimize() printsol(m, x, y, u, v) # Approach 2) General function constraint approach with auto PWL # translation by Gurobi # restore unsolved state and get rid of PWL constraints m.reset() m.remove(gc1) m.remove(gc2) m.update() # u = exp(x) gcf1 = m.addGenConstrExp(x, u, name="gcf1") # v = y^(0.5) gcf2 = m.addGenConstrPow(y, v, 0.5, name="gcf2") # Use the equal piece length approach with the length = 1e-3 m.Params.FuncPieces = 1 m.Params.FuncPieceLength = 1e-3 # Optimize the model m.optimize() printsol(m, x, y, u, v) # Zoom in, use optimal solution to reduce the ranges and use a smaller # pclen=1-5 to solve it x.LB = max(x.LB, x.X-0.01) x.UB = min(x.UB, x.X+0.01) y.LB = max(y.LB, y.X-0.01) y.UB = min(y.UB, y.X+0.01) m.update() m.reset() m.Params.FuncPieceLength = 1e-5 # Optimize the model m.optimize() printsol(m, x, y, u, v) except gp.GurobiError as e: print('Error code ' + str(e.errno) + ": " + str(e)) except AttributeError: print('Encountered an attribute error')