gc_pwl_func.m


Gurobi优化函数gc_pwl_func %版权2023年,LLC % %这狗万app足彩个例子考虑以下非凸非线性问题% % 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 = sqrt (y)的一些步长(例如,y = 0、1 e - 3 2 e - 3,…ymax)。我们需要%计算xmax和ymax(这是容易的对于这个示例,但这并非%)。% c)使用点添加两个通用类型%分段线性的约束。% % 2)直接使用Gurobis内置的通用函数约束(EXP %和战俘)。在这里,我们不需要计算点和最大可能值%,这将被Gurobi内部完成。在这个%的方法中,我们展示了如何“放大”最优解和%收紧公差提高解决方案的质量。% % 4 nonneg。变量x, y, u, v,一个线性约束u + 4 * v < = 9米。varnames = {' x ', ' y ', ' u ', ' v '};m。lb = zeros(4, 1); m.ub = +inf(4, 1); m.A = sparse([0, 0, 1, 4]); m.rhs = 9; % Objective m.modelsense = 'max'; m.obj = [2; 1; 0; 0]; % First approach: PWL constraints % Approximate u \approx exp(x), equispaced points in [0, xmax], xmax = log(9) m.genconpwl(1).xvar = 1; m.genconpwl(1).yvar = 3; m.genconpwl(1).xpts = 0:1e-3:log(9); m.genconpwl(1).ypts = exp(m.genconpwl(1).xpts); % Approximate v \approx sqrt(y), equispaced points in [0, ymax], ymax = (9/4)^2 m.genconpwl(2).xvar = 2; m.genconpwl(2).yvar = 4; m.genconpwl(2).xpts = 0:1e-3:(9/4)^2; m.genconpwl(2).ypts = sqrt(m.genconpwl(2).xpts); % Solve and print solution result = gurobi(m); printsol(result.objval, result.x(1), result.x(2), result.x(3), result.x(4)); % Second approach: General function constraint approach with auto PWL % translation by Gurobi % Delete explicit PWL approximations from model m = rmfield(m, 'genconpwl'); % Set u \approx exp(x) m.genconexp.xvar = 1; m.genconexp.yvar = 3; m.genconexp.name = 'gcf1'; % Set v \approx sqrt(y) = y^0.5 m.genconpow.xvar = 2; m.genconpow.yvar = 4; m.genconpow.a = 0.5; m.genconpow.name = 'gcf2'; % Parameters for discretization: use equal piece length with length = 1e-3 params.FuncPieces = 1; params.FuncPieceLength = 1e-3; % Solve and print solution result = gurobi(m, params); printsol(result.objval, result.x(1), result.x(2), result.x(3), result.x(4)); % Zoom in, use optimal solution to reduce the ranges and use a smaller % pclen=1-5 to resolve m.lb(1) = max(m.lb(1), result.x(1) - 0.01); m.ub(1) = min(m.ub(1), result.x(1) + 0.01); m.lb(2) = max(m.lb(2), result.x(2) - 0.01); m.ub(2) = min(m.ub(2), result.x(2) + 0.01); params.FuncPieceLength = 1e-5; % Solve and print solution result = gurobi(m, params); printsol(result.objval, result.x(1), result.x(2), result.x(3), result.x(4)); end function printsol(objval, x, y, u, v) fprintf('x = %g, u = %g\n', x, u); fprintf('y = %g, v = %g\n', y, v); fprintf('Obj = %g\n', objval); % Calculate violation of exp(x) + 4 sqrt(y) <= 9 vio = exp(x) + 4 * sqrt(y) - 9; if vio < 0 vio = 0; end fprintf('Vio = %g\n', vio); end