gc_pwl.m


gc_pwl.m


这个例子用PWL约束公式和解决了以下简单模型%:% %最大化% su狗万app足彩m c(j) * x(j) % subject to % sum A(i,j) * x(j) <= 0, for i = 1,…, m %和y (j) < = 3% y (j) = pwl (x (j)), j = 1,……, n % x(j)自由,y(j) >= 0,对于j = 1,…当pwl(x) = 0时,如果x = 0 % = 1+|x|,如果x != 0 % %和pwl(x(j)) <= b是为了约束x向量,同时也是为了支持稀疏的x向量。这里b = 3意味着最多两个x(j)可以是非零的,如果是2,那么% sum x(j) <= 1% % 2。Pwl (x)从1跳到0,从0跳到1,如果x从- 0到0,%然后到0,所以我们需要在x = 0处有3个点。X在两边有无限的边界%,由两点(- 1,2)和(0,1)定义的块可以%将X扩展到-无限。总的来说,我们可以使用5个点(- 1,2),(0,1),%(0,0),(0,1)和(1,2)来定义y = pwl(x) n = 5;% A x <= 0 A1 = [0,0,0,1, -1;0,0,1,1, -1;1,1,0,0, -1; 1, 0, 1, 0, -1; 1, 0, 0, 1, -1; ]; % sum y(j) <= 3 A2 = [1, 1, 1, 1, 1]; % Constraint matrix altogether model.A = sparse(blkdiag(A1, A2)); % Right-hand-side coefficient vector model.rhs = [zeros(n,1); 3]; % Objective function (x coefficients arbitrarily chosen) model.obj = [0.5, 0.8, 0.5, 0.1, -1, zeros(1, n)]; % It's a maximization model model.modelsense = 'max'; % Lower bounds for x and y model.lb = [-inf*ones(n,1); zeros(n,1)]; % PWL constraints for k = 1:n model.genconpwl(k).xvar = k; model.genconpwl(k).yvar = n + k; model.genconpwl(k).xpts = [-1, 0, 0, 0, 1]; model.genconpwl(k).ypts = [2, 1, 0, 1, 2]; end result = gurobi(model); for k = 1:n fprintf('x(%d) = %g\n', k, result.x(k)); end fprintf('Objective value: %g\n', result.objval); end