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 \(f_0,\ldots,f_m\) is a posynomial, that is a function of the form
with arbitrary real \(\alpha_{ki}\) and \(c_k>0\). The standard way to formulate GPs in convex form is to introduce a variable substitution
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 \(x\) can be even more simply written as a linear inequality:
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 \(h\times w\times d\) box subject to upper bounds on the area of the floor and of the walls and bounds on the ratios \(h/w\) and \(d/w\):
The decision variables in the problem are \(h,w,d\). We make a substitution
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 \(u_k\) for each monomial appearing in the original posynomial constraint. The explicit representation of conic constraints in this case is:
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