Reference
Category : GAMS NOA library
Mainfile : hexagon.gms
$onText
The problem is to maximize the area of a hexagon in which the
diameter must be less than or equal to one.
In this formulation a vertex (the first one) is fixed at the origin and
the second one is on the x axis. The vector scalar products are used to
calculate the areas of all triangles originating from the origin.
Therefore, all terms in x(1), y(1) and y(2) vanish and the algebraic
expression of the problem is simplified.
Hock, W., Schittkowski, K., Test Examples for Nonlinear Programming Codes,
Lecture Notes in Economics and Mathematical Systems, vol. 187,
Springer Verlag, 1981. (Problem 108)
Gill, Ph.E., Murray, W., Saunders, M.A. and Wright, M., User's Guide for
SOL/NPSOL: A FORTRAN Package for Nonlinear Programming, Tech. Rep. 83-12,
Dept. of Operation Research, Stanford University.
Himmelblau, D.M., Applied Nonlinear Programming, McGraw-Hill, New York,
1972. Problem 16, pp.415.
Pearson, J.D., On variable metric methods of minimization. Research Analysis
Corp. Rept., RAC-TP-302, McLean, Va., May, 1968.
Graham, R.L., The largest small hexagon. Journal of Combinatorial Theory,
(A) 18, 1975, pp.165-170.
$offText
Set i indices for the 6 points /1*6/;
Alias (i,j);
Variable x(i) x-coordinates of the points
y(i) y-coordinates of the points
area(i) area of the i'th triangle
totarea total area of the hexagon
Equations areadef(i) area definition for triangle i
maxdist(i,j) maximal distance between i and j
areahexa definition of objective;
areadef(i).. area(i) =e= 0.5*(x(i)*y(i+1)-y(i)*x(i+1)) ;
maxdist(i,j)$(ord(i) lt ord(j)).. sqr(x(i)-x(j))+sqr(y(i)-y(j)) =l= 1;
areahexa.. totarea =e= sum(i,area(i));
* initial conditions
x.fx("1") = 0; y.fx("1") = 0; y.fx("2") = 0;
x.l("2") = 0.5; x.l("3") = 0.5; x.l("4") = 0.5;
x.l("5") = 0; x.l("6") = 0;
y.l("3") = 0.4; y.l("4") = 0.8; y.l("5") = 0.8;
y.l("6") = 0.4;
Model hexagon /all/;
Solve hexagon using nlp maximizing totarea;
$ifThenI x%mode%==xbook
file out /hexagon1.dat/
put out;
put x.l('1'):15:7, y.l('1'):15:7 /;
put x.l('2'):15:7, y.l('2'):15:7 /;
put x.l('3'):15:7, y.l('3'):15:7 /;
put x.l('4'):15:7, y.l('4'):15:7 /;
put x.l('5'):15:7, y.l('5'):15:7 /;
put x.l('6'):15:7, y.l('6'):15:7 /;
put totarea.l:15:7 /;
$endIf
* End hexagon