Initializing help system before first use

Polygon construction under constraints


Type: NLP
Rating: 3 (intermediate)
Description: The set of examples describe models to create polygon with various constraints and goals:
  • Polygon is formulated by algebraic expressions (polygon1.mos)
  • Polygon is formulated by a user function (polygon2.mos)
  • Polygon is formulated by a user procedure (polygon3.mos)
  • Polygon is described by a function stored in an xls Excel spreadsheet (polygon4.mos)
  • Polygon is described by a macro stored in an xls Excel spreadsheet (polygon5.mos, polygon6.mos)
  • Polygon is defined by a function present in a dynamic library (polygon7.mos, mydll.c)
File(s): polygon1.mos, polygon1_graph.mos, polygon2.mos, polygon3.mos, polygon4.mos, polygon5.mos, polygon6.mos, polygon7.mos
Data file(s): polygonsheet.xls, polygonmacro.xls, mydll.c


polygon1.mos
(!*********************************************************************
   Mosel NL examples
   =================
   file polygon1.mos
   `````````````````
   Maximize the area of polygon of N vertices and diameter of 1. 
   
   The position of vertices is indicated as (rho,theta) coordinates
   where rho denotes the distance to the base point (vertex with number N) 
   and theta the angle from the x-axis.
   
   -- Formulation using direct algebraic expressions --
 
   (c) 2008 Fair Issac Corporation
       Creation: 2002, rev. Feb. 2013
*********************************************************************!)

model "Polygon 1"
 uses "mmxnlp"

 parameters
  N=5                               ! Number of vertices
  SOLVER=0                          ! 0: SLP, 1: Knitro
 end-parameters
 
 declarations
  RN = 1..N
  Area: nlctr
  rho : array(RN) of mpvar          ! Distance of vertex from the base point 
  theta : array(RN) of mpvar        ! Angle from x-axis
  D: array(RN,RN) of nlctr          ! Limit on side length
 end-declarations

! Objective: sum of areas
 Area:= (sum (i in 2..N-1) (rho(i)*rho(i-1)*sin(theta(i)-theta(i-1)))) * 0.5

! Bounds and start values for decision variables
 forall(i in 1..N-1) do
  rho(i) >= 0.1
  rho(i) <= 1
  setinitval(rho(i), 4*i*(N + 1 - i)/((N+1)^2))
  setinitval(theta(i), M_PI*i/N)
 end-do
 
! Third side of all triangles <= 1
 forall(i in 1..N-2, j in i+1..N-1)
  D(i,j):= rho(i)^2 + rho(j)^2 - rho(i)*rho(j)*2*cos(theta(j)-theta(i)) <= 1
 
! Vertices in increasing order 
 forall(i in 2..N-1) theta(i) >= theta(i-1) +.01
 
! Boundary conditions
 theta(N-1) <= M_PI                     ! Last vertex above x-axis

! Optional parameter settings
 setparam("xnlp_verbose", true)         ! Enable XNLP output log
 setparam("xnlp_solver", SOLVER)        ! Select the solver

! Solve the problem
 maximise(Area)

! Solution output
 writeln("Area = ", getobjval)
 forall (i in 1..N-1) 
  writeln("V", i, ": r=", getsol(rho(i)), " theta=", getsol(theta(i)))
end-model
 

polygon1_graph.mos
(!*********************************************************************
   Mosel NL examples
   =================
   file polygon1_graph.mos
   ```````````````````````
   Maximize the area of polygon of N vertices and diameter of 1. 
   
   The position of vertices is indicated as (rho,theta) coordinates
   where rho denotes the distance to the base point (vertex with number N) 
   and theta the angle from the x-axis.
   
   -- Formulation using direct algebraic expressions, solution graph --
 
   (c) 2013 Fair Issac Corporation
       Creation: Feb. 2013, rev. Sep. 2017
*********************************************************************!)

model "Polygon 1 (graph)"
 uses "mmxnlp", "mmsvg"

 parameters
  N=5                               ! Number of vertices
  SOLVER=0                          ! 0: SLP, 1: Knitro
 end-parameters
 
 declarations
  RN = 1..N
  Area: nlctr
  rho : array(RN) of mpvar          ! Distance of vertex from the base point 
  theta : array(RN) of mpvar        ! Angle from x-axis
  D: array(RN,RN) of nlctr          ! Limit on side length
 end-declarations

! Objective: sum of areas
 Area:= (sum (i in 2..N-1) (rho(i)*rho(i-1)*sin(theta(i)-theta(i-1)))) * 0.5

! Bounds and start values for decision variables
 forall(i in 1..N-1) do
  rho(i) >= 0.1
  rho(i) <= 1
  setinitval(rho(i), 4*i*(N + 1 - i)/((N+1)^2))
  setinitval(theta(i), M_PI*i/N)
 end-do
 
! Third side of all triangles <= 1
 forall(i in 1..N-2, j in i+1..N-1)
  D(i,j):= rho(i)^2 + rho(j)^2 - rho(i)*rho(j)*2*cos(theta(j)-theta(i)) <= 1
 
! Vertices in increasing order 
 forall(i in 2..N-1) theta(i) >= theta(i-1) +.01
 
! Boundary conditions
 theta(N-1) <= M_PI                     ! Last vertex above x-axis

! Optional parameter settings
 setparam("xnlp_verbose", true)         ! Enable XNLP output log
 setparam("xnlp_solver", SOLVER)        ! Select the solver

! Solve the problem
 maximise(Area)

! Solution output
 writeln("Area = ", getobjval)
 forall (i in 1..N-1) 
  writeln("V", i, ": r=", getsol(rho(i)), " theta=", getsol(theta(i)))

!**************** Graphical representation of results ****************
 declarations
  X,Y: array(0..N) of real
 end-declarations

 X(N):=0; Y(N):=0                       ! Position for base vertex N
 X(0):=X(N); Y(0):=Y(N)
 forall(i in 1..N-1) do                 ! Calculate vertex positions
  X(i):=cos(theta(i).sol)*rho(i).sol+X(N)
  Y(i):=sin(theta(i).sol)*rho(i).sol+Y(N)
 end-do

 svgaddgroup("P", "Polygon")
 forall(i in 1..N) do                   ! Draw the resulting polygon
  svgaddpoint(X(i),Y(i))
  svgaddtext(X(i)+0.03,Y(i)+0.02, string(i))
 end-do
 svgaddpolygon(sum(i in 1..N) [X(i),Y(i)])

! Scale the size of the displayed graph
 svgsetgraphscale(200)
 svgsetgraphpointsize(2)
 
 svgsave("polygon.svg")
 svgrefresh
 svgwaitclose("Close browser window to terminate model execution.", 1)

end-model
 

polygon2.mos
(!*********************************************************************
   Mosel NL examples
   =================
   file polygon2.mos
   `````````````````
   Maximize the area of polygon of N vertices and diameter of 1. 
   
   The position of vertices is indicated as (rho,theta) coordinates
   where rho denotes the distance to the base point (vertex with number N) 
   and theta the angle from the x-axis.
   
   -- Formulation using a simple Mosel user function --
 
   (c) 2008 Fair Issac Corporation
       Creation: 2002, rev. Feb. 2013
*********************************************************************!)
 
model "Polygon 2"
 uses "mmxnlp"

 parameters
  N=5                               ! Number of vertices
  SOLVER=0                          ! 0: SLP, 1: Knitro
 end-parameters
 
 declarations
  RN = 1..N
  Area: nlctr
  rho : array(RN) of mpvar          ! Distance of vertex from the base point 
  theta : array(RN) of mpvar        ! Angle from x-axis
  D: array(RN,RN) of nlctr          ! Limit on side length
  FunctionArg: array(RN,{"rho","theta"}) of nlctr   ! User function arguments
  AreaFunction : userfunc           ! User function definition
 end-declarations

! Objective: sum of areas. Definition of a user function
 AreaFunction := userfuncMosel("MoselArea")

! Create function arguments
 forall (i in 1..N) do
  FunctionArg(i, "rho")   := rho(i)
  FunctionArg(i, "theta") := theta(i)
 end-do

! Use the Mosel user function in a formula for the objective
 Area := F(AreaFunction,FunctionArg)

! Bounds and start values for decision variables
 forall (i in 1..N-1) do
  rho(i) >= 0.1
  rho(i) <= 1
  setinitval(rho(i),4*i*(N + 1 - i)/((N+1)^2))
  setinitval(theta(i),M_PI*i/N)
 end-do
 
! Third side of all triangles <= 1
 forall(i in 1..N-2, j in i+1..N-1)
  D(i,j) := rho(i)^2 + rho(j)^2 - rho(i)*rho(j)*2*cos(theta(j)-theta(i)) <= 1
 
! Vertices in increasing order 
 forall (i in 2..N-1) theta(i) >= theta(i-1) +.01
 
! Boundary conditions (last vertex above x-axis)
 theta(N-1) <= M_PI

! Uncomment to display user function info
! userfuncinfo(AreaFunction)

! Optional parameter settings
 setparam("xnlp_verbose", true)         ! Enable XNLP output log
 setparam("xnlp_solver", SOLVER)        ! Select the solver

! Solve the problem
 maximise(Area)

! Solution output
 writeln("Area = ", getobjval)
 forall (i in 1..N-1) 
  writeln("V",i,": r=",getsol(rho(i))," theta=",getsol(theta(i)))

! **** Definition of the Mosel user function ****
 public function MoselArea(I: array(Indices: range, Types: set of string) of real): real
  returned := (sum (i in 2..N-1) (I(i,"rho")*I(i-1,"rho")*sin(I(i,"theta")-I(i-1,"theta")))) * 0.5
 end-function

end-model
 

polygon3.mos
(!*********************************************************************
   Mosel NL examples
   =================
   file polygon3.mos
   `````````````````
   Maximize the area of polygon of N vertices and diameter of 1. 
   
   The position of vertices is indicated as (rho,theta) coordinates
   where rho denotes the distance to the base point (vertex with number N) 
   and theta the angle from the x-axis.
   
   -- Formulation using a multi-valued Mosel user function --
 
   (c) 2008 Fair Issac Corporation
       Creation: 2002, rev. Feb. 2013
*********************************************************************!)

model "Polygon 3"
 uses "mmxnlp"
 
 parameters
  N=5                               ! Number of vertices
  SOLVER=0                          ! 0: SLP, 1: Knitro
 end-parameters
 
 declarations
  RN = 1..N
  Area: nlctr
  rho : array(RN) of mpvar          ! Distance of vertex from the base point 
  theta : array(RN) of mpvar        ! Angle from x-axis
  D: array(RN,RN) of nlctr          ! Limit on side length
  FunctionArg: array(RN,{"rho","theta"}) of nlctr   ! User function arguments
  AreaFunction : userfunc           ! User function definition
  k: integer
 end-declarations

! Objective: sum of areas. Definition of a user function
 AreaFunction := userfuncMosel("MoselArea")

! Create function arguments
 forall (i in 1..N) do
  FunctionArg(i, "rho")   := rho(i)
  FunctionArg(i, "theta") := theta(i)
 end-do

! Use the Mosel user function in a formula for the objective
 Area := F(AreaFunction, FunctionArg, 1)

! Bounds and start values for decision variables
 forall (i in 1..N-1) do
  rho(i) >= 0.1
  rho(i) <= 1
  setinitval(rho(i),4*i*(N + 1 - i)/((N+1)^2))
  setinitval(theta(i),M_PI*i/N)
 end-do
 
! Third side of all triangles <= 1
 k := 2;
 forall(i in 1..N-2, j in i+1..N-1, k as counter)
  D(i,j) := F(AreaFunction, FunctionArg, k) <= 1
 
! Vertices in increasing order 
 forall (i in 2..N-1) theta(i) >= theta(i-1) +.01
 
! Boundary conditions (last vertex above x-axis)
 theta(N-1) <= M_PI

! Uncomment to display user function info
! userfuncinfo(AreaFunction)

! Optional parameter settings
 setparam("xnlp_verbose", true)         ! Enable XNLP output log
 setparam("xnlp_solver", SOLVER)        ! Select the solver

! Solve the problem
 maximise(Area)

! Solution output
 writeln("Area = ", getobjval)
 forall (i in 1..N-1)
  writeln("V",i,": r=",getsol(rho(i))," theta=",getsol(theta(i)))

! **** Definition of the Mosel user function ****
 public procedure MoselArea(I: array(Indices: range, Types: set of string) of real,
                     CalcValues: array(RetIndices: set of integer) of real)

 ! Area
  CalcValues(1) := (sum (i in 2..N-1) (I(i,"rho")*I(i-1,"rho")*sin(I(i,"theta")-I(i-1,"theta")))) * 0.5
 ! Distances
  k := 2
  forall (i in 1..N-2,j in i+1..N-1, k as counter) 
   CalcValues(k) := I(i,"rho")^2 + I(j,"rho")^2 - I(i,"rho")*I(j,"rho")*2*cos(I(j,"theta")-I(i,"theta")) 
 	
 end-procedure

end-model
 

polygon4.mos
(!*********************************************************************
   Mosel NL examples
   =================
   file polygon4.mos
   `````````````````
   Maximize the area of polygon of N vertices and diameter of 1. 
   
   The position of vertices is indicated as (rho,theta) coordinates
   where rho denotes the distance to the base point (vertex with number N) 
   and theta the angle from the x-axis.
   
   -- Formulation using a single-valued function of type
      Excel spreadsheet (XLS) --
 
   (c) 2008 Fair Issac Corporation
       Creation: 2002, rev. Feb. 2013
*********************************************************************!)
 
model "Polygon 4"
 uses "mmxnlp"

 parameters
  N=5                               ! Number of vertices
  SOLVER=0                          ! 0: SLP, 1: Knitro
 end-parameters
 
 declarations
  RN = 1..N
  Area: nlctr
  rho : array(RN) of mpvar          ! Distance of vertex from the base point 
  theta : array(RN) of mpvar        ! Angle from x-axis
  D: array(RN,RN) of nlctr          ! Limit on side length
  FunctionArg: list of nlctr        ! User function arguments
  AreaFunction: userfunc            ! User function definition
 end-declarations

! Objective: sum of areas. Definition of a user function
 AreaFunction := userfuncExcel("polygonsheet.xls", "Sheet1")

! Create function arguments
! Excel functions use their first columns as input: use a list to ensure correct order
 forall (i in 1..N-1) do
  FunctionArg += [nlctr(rho(i))]
  FunctionArg += [nlctr(theta(i))]
 end-do

! Use the Excel user function in a formula for the objective
 Area := F(AreaFunction,FunctionArg)

! Bounds and start values for decision variables
 forall (i in 1..N-1) do
  rho(i) >= 0.1
  rho(i) <= 1
  setinitval(rho(i),4*i*(N + 1 - i)/((N+1)^2))
  setinitval(theta(i),M_PI*i/N)
 end-do
 
! Third side of all triangles <= 1
 forall (i in 1..N-2, j in i+1..N-1) 
  D(i,j) := rho(i)^2 + rho(j)^2 - rho(i)*rho(j)*2*cos(theta(j)-theta(i)) <= 1
 
! Vertices in increasing order 
 forall (i in 2..N-1) theta(i) >= theta(i-1) +.01
 
! Boundary conditions (last vertex above x-axis)
 theta(N-1) <= M_PI

! Uncomment to display user function info
! userfuncinfo(AreaFunction)

! Optional parameter settings
 setparam("xnlp_verbose", true)         ! Enable XNLP output log
 setparam("xnlp_solver", SOLVER)        ! Select the solver

! Solve the problem
 maximise(Area)

! Solution output
 writeln("Area = ", getobjval)
 forall (i in 1..N-1)
  writeln("V",i,": r=",getsol(rho(i))," theta=",getsol(theta(i)))

end-model
 

polygon5.mos
(!*********************************************************************
   Mosel NL examples
   =================
   file polygon5.mos
   `````````````````
   Maximize the area of polygon of N vertices and diameter of 1. 
   
   The position of vertices is indicated as (rho,theta) coordinates
   where rho denotes the distance to the base point (vertex with number N) 
   and theta the angle from the x-axis.
   
   -- Formulation using a single-valued function of type 
      Excel Macro (XLF) --
 
   (c) 2008 Fair Issac Corporation
       Creation: 2002, rev. Feb. 2013
*********************************************************************!)

model "Polygon 5"
 uses "mmxnlp"

 parameters
  N=5                               ! Number of vertices
  SOLVER=0                          ! 0: SLP, 1: Knitro
 end-parameters
 
 declarations
  RN = 1..N
  Area: nlctr
  rho : array(RN) of mpvar          ! Distance of vertex from the base point 
  theta : array(RN) of mpvar        ! Angle from x-axis
  D: array(RN,RN) of nlctr          ! Limit on side length
  FunctionArg: list of nlctr        ! User function arguments
  AreaFunction: userfunc            ! User function definition
 end-declarations

! Objective: sum of areas. Definition of a user function
 AreaFunction := userfuncExcelMacro("polygonmacro.xls", "Sheet1", "Area")

! Create function arguments
! Excel functions use their first columns as input: use a list to ensure correct order
 forall (i in 1..N-1) do
  FunctionArg += [nlctr(rho(i))]
  FunctionArg += [nlctr(theta(i))]
 end-do

! Use the Excel user function in a formula for the objective
 Area := F(AreaFunction,FunctionArg)

! Bounds and start values for decision variables
 forall (i in 1..N-1) do
  rho(i) >= 0.1
  rho(i) <= 1
  setinitval(rho(i),4*i*(N + 1 - i)/((N+1)^2))
  setinitval(theta(i),M_PI*i/N)
 end-do
 
! Third side of all triangles <= 1
 forall (i in 1..N-2, j in i+1..N-1) 
  D(i,j) := rho(i)^2 + rho(j)^2 - rho(i)*rho(j)*2*cos(theta(j)-theta(i)) <= 1
 
! Vertices in increasing order 
 forall (i in 2..N-1) theta(i) >= theta(i-1) +.01
 
! Boundary conditions (last vertex above x-axis)
 theta(N-1) <= M_PI

! Uncomment to display user function info
! userfuncinfo(AreaFunction)

! Optional parameter settings
 setparam("xnlp_verbose", true)         ! Enable XNLP output log
 setparam("xnlp_solver", SOLVER)        ! Select the solver

! Solve the problem
 maximise(Area)

! Solution output
 writeln("Area = ", getobjval)
 forall (i in 1..N-1)
  writeln("V",i,": r=",getsol(rho(i))," theta=",getsol(theta(i)))

end-model
 

polygon6.mos
(!*********************************************************************
   Mosel NL examples
   =================
   file polygon6.mos
   `````````````````
   Maximize the area of polygon of N vertices and diameter of 1. 
   
   The position of vertices is indicated as (rho,theta) coordinates
   where rho denotes the distance to the base point (vertex with number N) 
   and theta the angle from the x-axis.
   
   -- Formulation using a multi-valued function of type 
      Excel Macro (XLF) --
 
   (c) 2008 Fair Issac Corporation
       Creation: 2002, rev. Feb. 2013
*********************************************************************!)
 
model "Polygon 6"
 uses "mmxnlp"

 parameters
  N=5                               ! Number of vertices
  SOLVER=0                          ! 0: SLP, 1: Knitro
 end-parameters
 
 declarations
  RN = 1..N
  Area: nlctr
  rho : array(RN) of mpvar          ! Distance of vertex from the base point 
  theta : array(RN) of mpvar        ! Angle from x-axis
  D: array(RN,RN) of nlctr          ! Limit on side length
  FunctionArg: list of nlctr        ! User function arguments
  AreaFunction: userfunc            ! User function definition
  k: integer
 end-declarations

! Objective: sum of areas. Definition of a user function
 AreaFunction := userfuncExcelMacro("polygonmacro.xls", "Sheet1", "ArrayArea")

! Create function arguments
! Excel functions use their first columns as input: use a list to ensure correct order
 forall (i in 1..N) do
  FunctionArg += [nlctr(rho(i))]
  FunctionArg += [nlctr(theta(i))]
 end-do

! Use the Excel user function in a formula for the objective
 Area := F(AreaFunction, FunctionArg, 1)

! Bounds and start values for decision variables
 forall (i in 1..N-1) do
  rho(i) >= 0.1
  rho(i) <= 1
  setinitval(rho(i),4*i*(N + 1 - i)/((N+1)^2))
  setinitval(theta(i),M_PI*i/N)
 end-do
 
! Third side of all triangles <= 1
 k := 2
 forall (i in 1..N-2, j in i+1..N-1, k as counter) 
  D(i,j) := F(AreaFunction, FunctionArg, k) <= 1

! Vertices in increasing order 
forall (i in 2..N-1) theta(i) >= theta(i-1) +.01
 
! Boundary conditions (last vertex above x-axis)
 theta(N-1) <= M_PI

! Uncomment to display user function info
! userfuncinfo(AreaFunction)

! Optional parameter settings
! setparam("xnlp_verbose", true)         ! Enable XNLP output log
 setparam("xnlp_solver", SOLVER)        ! Select the solver

! Solve the problem
 maximise(Area)

! Solution output
 writeln("Area = ", getobjval)
 forall (i in 1..N-1)
  writeln("V",i,": r=",getsol(rho(i))," theta=",getsol(theta(i)))

end-model
 

polygon7.mos
(!*********************************************************************
   Mosel NL examples
   =================
   file polygon7.mos
   `````````````````
   Maximize the area of polygon of N vertices and diameter of 1. 
   
   The position of vertices is indicated as (rho,theta) coordinates
   where rho denotes the distance to the base point (vertex with number N) 
   and theta the angle from the x-axis.
   
   -- Formulation using a single-valued dynamic library function --
 
   !!! Before running this model, compile mydll.c into mydll.fct 
   !!! using the provided makefile 
 

   (c) 2008 Fair Issac Corporation
       Creation: 2002, rev. Feb. 2013
*********************************************************************!)
 
model "Polygon 7"
 uses "mmxnlp"

 parameters
  N=5                               ! Number of vertices
  SOLVER=0                          ! 0: SLP, 1: Knitro
 end-parameters
 
 declarations
  RN = 1..N
  Area: nlctr
  rho : array(RN) of mpvar          ! Distance of vertex from the base point 
  theta : array(RN) of mpvar        ! Angle from x-axis
  D: array(RN,RN) of nlctr          ! Limit on side length
  FunctionArg: list of nlctr        ! User function arguments
  AreaFunction: userfunc            ! User function definition
 end-declarations

! Objective: sum of areas. Definition of a user function
 AreaFunction := userfuncDLL("./mydll.fct", "AreaInC")

! Create function arguments
! C functions use their first columns as input: use a list to ensure correct order
 forall (i in 1..N-1) do
  FunctionArg += [nlctr(rho(i))]
  FunctionArg += [nlctr(theta(i))]
 end-do

! Use the library user function in a formula for the objective
 Area := F(AreaFunction,FunctionArg)

! Bounds and start values for decision variables
 forall (i in 1..N-1) do
  rho(i) >= 0.1
  rho(i) <= 1
  setinitval(rho(i),4*i*(N + 1 - i)/((N+1)^2))
  setinitval(theta(i),M_PI*i/N)
 end-do
 
! Third side of all triangles <= 1
 forall (i in 1..N-2, j in i+1..N-1) 
  D(i,j) := rho(i)^2 + rho(j)^2 - rho(i)*rho(j)*2*cos(theta(j)-theta(i)) <= 1
 
! Vertices in increasing order 
 forall (i in 2..N-1) theta(i) >= theta(i-1) +.01
 
! Boundary conditions (last vertex above x-axis)
 theta(N-1) <= M_PI

! Uncomment to display user function info
! userfuncinfo(AreaFunction)

! Optional parameter settings
 setparam("xnlp_verbose", true)         ! Enable XNLP output log
 setparam("xnlp_solver", SOLVER)        ! Select the solver

! Solve the problem
 maximise(Area)

! Solution output
 writeln("Area = ", getobjval)
 forall (i in 1..N-1)
  writeln("V",i,": r=",getsol(rho(i))," theta=",getsol(theta(i)))

end-model