7.3 Geometric Programming¶
Geometric programs (GP) are a particular class of optimization problems which can be expressed in special polynomial form as positive sums of generalized monomials. More precisely, a geometric problem in canonical form is
where each
with arbitrary real
Under this substitution all constraints in a GP can be reduced to the form
involving a log-sum-exp bound. Moreover, constraints involving only a single monomial in
We refer to the MOSEK Modeling Cookbook and to [BKVH07] for more details on this reformulation. A geometric problem formulated in convex form can be entered into MOSEK with the help of exponential cones.
7.3.1 Example GP1¶
The following problem comes from [BKVH07]. Consider maximizing the volume of a
The decision variables in the problem are
after which (7.11) becomes
Next, we demonstrate how to implement a log-sum-exp constraint (7.10). It can be written as:
This presentation requires one extra variable
We can now use this representation to assemble all constraints in the model.
Awall = 200
Afloor = 50
alpha = 2
beta = 10
gamma = 2
delta = 10
% A model with variables [x,y,z,u1,u2]
model = mosekmodel(...
name = "gp1",...
numvar = 5);
model.objective("maximize", [ 1 1 1 0 0]);
% u1 + u2 = 1
model.appendcons(F = [ 0 0 0 1 1 ], domain = mosekdomain("equal", rhs=1.0));
% y + z <= log(Afloor)
model.appendcons(F = [ 0 1 1 0 0 ], domain = mosekdomain("less than", rhs=log(Afloor)));
% Two-sided bounds on x-y and z-y
model.appendcons(F = [ 1 -1 0 0 0 ; ...
0 -1 1 0 0 ], domain = mosekdomain("greater than",dim=2, rhs=[log(alpha) log(gamma)]'));
model.appendcons(F = [ 1 -1 0 0 0 ; ...
0 -1 1 0 0 ], domain = mosekdomain("less than", dim=2, rhs=[log(beta) log(delta)]'));
% Conic constraints
model.appendcons(F = sparse([1 3 3],[4 1 2],[1.0 1.0 1.0]), g = [0 1 log(alpha/Awall)]', domain = mosekdomain("exp"));
model.appendcons(F = sparse([1 3 3],[5 1 3],[1.0 1.0 1.0]), g = [0 1 log(alpha/Awall)]', domain = mosekdomain("exp"));
model.solve();
if model.hassolution("interior")
[xx,prosta,solsta] = model.getsolution("interior","x");
x = xx(1:3);
disp(exp(x));
end